フルスクラッチによるグラフィックスプログラミング入門
概 要
COMICWORKSやopenCanvasの開発者として知られる著者が、フルスクラッチ(自主開発コード)主体のグラフィックスプログラミングの真髄を解説します。WindowsのAPIに頼らず、グラフィックスプログラミングを基礎から学ぶことで新技術や応用力が磨かれ、ほかのソフトにはない独自性を生み出せます。本書はマルチプラットフォーム時代のグラフィックスプログラミングの基礎知識から、簡単な画像解析テクニック紹介まで順序立てて理解することができるやさしい教科書です。
| 著者 | 須崎亮太郎、荻野友隆、内村創 |
| 価格 | 円(税込)(本体3400円) |
| ISBN | 4-7980-0958-X |
| 発売日 | 2004/12/18 |
| 判型 | B5変 |
| 色数 | 2色 |
| ページ数 | 556 |
| CD/DVD | - |
| 対象読者 | 中級 |
| シリーズ | - |
目次
はじめに
1. 本書の目標
2. 再発明の理由
3. フルスクラッチじゃ使い物にならない?
4. 本書の対象者
5. libneet
6. 本書の構成
7. 謝辞
CHAPTER1 開発環境について
1.1開発環境について
1.2C++Builderでの開発
Borland C++Builderについて
Windowsプログラムの動作
イベントドリブン型プログラム
生成されるファイルの構成
ゲーム用のループを作る
ライブラリを追加する
リリース用のバイナリを作る
TIPS色々
1.3VisualStudio.NET2003での開発
VisualStudio.NET2003について
MFCを使ったアプリケーション開発
CHAPTER2 Windowsグラフィックの基礎
2.1CGの基礎
画面表示までの流れ
色の表現について
画素の並び
dpi・解像度について
フレームレートについて
2.2GDIプログラミングの基礎
ウィンドウハンドル、デバイスコンテキスト
画像を表示する
DCの注意点
2.3メモリ上に画像を作る
もう一つの画像表示方法
メモリアクセスできるバッファをつくる
表示する
点を打って表示を確認する
CHAPTER3 グラフィックプログラミング~導入編~
3.1画像を扱うクラスを作る
画像クラスを設計する
基本的なメソッドの実装
Windowsで使えるクラスを作る
3.2矩形転送をしてみよう
矩形を転送してみよう
こんな単純でいいの?
ボトルネックは何だろう?
3.3クリッピングで無駄を省く
クリッピングを行った矩形転送
矩形転送のクリッピング関数を実装する
矩形塗りつぶしのクリッピング関数を実装する
速度を比較する
3.4最適化ってなに?
最適化ってなに?
最適化の方法
最適化のポイントは?
注意点
3.5固定小数表現
固定小数表現について
固定小数表現の注意点
3.6アセンブラ入門
アセンブラって何?
インラインアセンブラを使ってみよう
Pentium系CPUでアセンブラを書く為の予備知識
レジスタとメモリについて
レジスタとセグメントについて
数値演算
ジャンプ命令
条件分岐
値を変更してはいけないレジスタ
最後に
CHAPTER4 グラフィックプログラミング~実践編~
4.1ピクセル演算
矩形転送の派手な演出
カラーキー付き矩形転送
基本中の基本「αブレンディング」
αブレンディングで矩形塗りつぶし
色々な演算 「加算」「乗算」など
最上位の成分を使う
AND,ORフィルター
まとめ
4.2線を引く
縦線・横線を引こう
斜めの線も引こう
少し凝った線
4.3簡単な図形を描く
図形を描こう
円を描く
三角形を描く(1)
ちょっと寄り道、内積・外積
三角形を描く(2)
効率よく三角形を描く
もっと効率よく三角形を描く
多角形を描く(1)
多角形を描く(2)
4.4エフェクト処理
画面を派手に演出する
画像を波のように揺らす
最適化して揺らす
もう少し複雑に揺らす
回転・拡大・縮小
フィードバック処理
4.5曲線とシェイプ
直線だけで満足できますか?
曲線を描いてみよう
自由な形状ってどう描くんだろう?
多角形で円を描く
パスで定義した図形をレンダリングする
4.6アンチエイリアシング
1ピクセルの壁を越える
人間の目の特性を利用する
エッジを滑らかにしてみる
円のアンチエイリアシング
多角形のアンチエイリアシング
三角形のアンチエイリアシングの改善
ライン描画での簡単アンチエイリアシング
矩形転送にもアンチエイリアシング
回転処理のアンチエイリアス化
4.7テクスチャマッピング
矩形転送だけじゃ物足りない
テスクチャマッピングの考え方
テスクチャマッピングの実装
最適化を行う
便利な関数を作る
この方式の問題点
4.8平均化処理
色の平均を取ろう
まずはモザイク
α値を考慮する
画像をぼかす
移動ぼかし(Motion Blur)
ガウスぼかし(Gaussian Blur)
4.9ブラシストローク
ブラシストロークの基本
バッファリングして、取得した座標を平滑化する
輝度を比較して、より綺麗な線を描く
曲線で補間する
アンドゥに対応する
水彩風の表現をする
CHAPTER5 画像解析
5.1HDR画像について
HDR画像って何?
ダイナミックレンジって何?
HDR画像の例
そもそも、なんでHDRが必要なの?
HDRIフォーマットの種類
ツールをそろえよう
HDRIを見よう
HDRIをいじろう
HDRIを弄ろう(具体例)
HDRIを撮ろう(用意編)
HDRIを撮ろう(撮影編)
HDRIを撮ろう(合成編)
ファイル読み込み&トーンマップ(自前実装)
トーンマッピング
5.2色空間について
色空間って何だろう?
人間の目のシステム
等色関数
色空間
RGB色空間
CMY色空間
XYZ色空間
YCrCb(YUV)
5.3ヒストグラムの表示
ヒストグラムってなに?
ヒストグラムを表示しよう
RGBのヒストグラムも描画してみよう
5.4レベル補正とガンマ補正
レベル補正ってなに?
レベル補正をしてみよう
ガンマ補正について
ガンマ補正をしてみよう
5.5オプティカルフロー
解析系のお話
オプティカルフロー
どうやって取得しようか?
実装
検出例
あれ? 遅くない?
高速化
5.6ハフ変換
直線を検出しよう
ハフ変換て何?
基本的なアイデア
実装
結果
5.7直交変換の基礎
フーリエ変換って何?
ベクトルについての復習
直交変換
DCTを実装してみよう
2次元DCTを実装してみよう
5.8ウェーブレット変換
ウェーブレットって何?便利なの?
フーリエ変換との違い
連続? 離散?
リフティング構成
Haarのウェーブレット
応用ウェーブレット
CHAPTER6 ファイル処理と外部ライブラリ
6.1BMPファイルを扱う
好きな画像を表示させよう
基本中の基本、ビットマップ形式
ビットマップファイルを書き込む
ビットマップファイルを読み込む
ビットマップファイルを「簡単に」読み込む
ビットマップファイルを表示する
6.2zlibを使う
zlibとは
配布サイトからソースを入手
ソースアーカイブを展開してみる
zlibのビルド(C++Builder編)
zlibのビルド(VisualStudio.NET2003編)
zlibを使ってみよう
6.3JPEGファイルを扱う
JPEGとは
配布サイトからソースを入手
ソースアーカイブを展開してみる
JPEGライブラリのビルド(C++Builder編)
JPEGライブラリのビルド(VisualStudio.NET2003編)
ロード・セーブ関数を書く
ロード・セーブ関数のビルド(C++Builder編)
ロード・セーブ関数のビルド(VisualStudio.NET2003編)
6.4PNGファイルを扱う
PNGとは
配布サイトからソースを入手
ソースアーカイブを展開してみる
PNGライブラリのビルド(C++Builder編)
PNGライブラリのビルド(VisualStudio.NET2003編)
ロード・セーブ関数を書く
ロード・セーブ関数のビルド(C++Builder編)
ロード・セーブ関数のビルド(VisualStudio.NET2003編)
6.5TGAファイルを扱う
TGAとは
配布サイトからソースを入手
TGAライブラリのビルド(C++Builder編)
TGAライブラリのビルド(VisualStudio.NET2003編)
ロード・セーブ関数を書く
ロード・セーブ関数のビルド(C++Builder編)
ロード・セーブ関数のビルド(VisualStudio.NET2003編)
CHAPTER7 TIPS
7.1マイクロタイルアレイ
これしか方法はないの?
画像を細かく分けて確保する
MTAの利点
7.2Webcamを使おう
Webcamを使ってみよう
Video for Windowsを使って制御する
アートな表現に挑戦
7.3タブレットからの入力
タブレットについて
DLLの復習
DLLを呼び出そう
DLL内の関数名を調べる
Wintabのラッパークラスを作る
CTabletを組み込む
7.4コールバック関数
アプリケーションが固まってしまう
コールバック関数で進捗を報告する
C++Builderでのサンプルコード
7.5乱数とノイズ
乱数を作ろう
擬似乱数とシード
擬似乱数 ― 線形合同法
擬似乱数 ― M系列
メルセンヌ・ツイスタ
randの問題点
真の乱数

