SHADER GURU with Direct3D10/11

タイトル SHADER GURU with Direct3D10/11

概要 
本書は、リアルタイムシェーダープログラミングの入門書であると同時に、応用まで解説する技術書でもあります。

価格 7000円+税 オンラインショップへ

本書籍付属データ(ソースコードその他)のダウンロードはこちらです

SHADER GURU 始動。

MESH GURUに続くGURUブランドの第2弾、SHADER GURU(シェーダーグル)がついに完成いたしました。
おかげさまで、GURUブランドはその内容について高い評価を獲得しています。
そのGURUブランドとして恥ずかしくない、MESH GURUに負けない内容に仕上がりました。

本書の内容 (本文「はじめに」より抜粋)

本書は、リアルタイムシェーダープログラミングの入門書であると同時に、応用まで解説する技術書でもあります。 プログラミング環境としては、C++言語上でのDirect3D10/11シェーダープログラミングを想定していますが、本書はそれらに力点を置いてはいません。それらはあくまでも道具です。もちろん、Direct3D10/11でのシェーダープログラミングに必要な手順やテクニックは詳細に解説していますが、目的はリアルタイムシェーダーに必要な数学的知識やアルゴリズムのほうです。

対象読者としては、C++言語、および3Dプログラミングを多少なりとも経験している方を想定しています。それらの経験が全く無いと本書を読むのは難しいと思います。
当初の計画では、シェーダーの経験者を対象読者にしていましたが、本書制作中、内容をどんどん掘り下げていくうちに、入門者(全くの入門者ではなく、シェーダーの入門者という意味です)でも読める本になっていました。ただ、シェーダープログラミングそのものが高度な分野のため、やはり全く3Dプログラミングをやったことの無い人にとっては、本棚の肥やしになる可能性は低くないと思います。
本書は、ある程度3Dプログラミング経験がある方で、シェーダーに興味があるものの、いまひとつ踏み込めない、という方にとって最高の効果をあげるものとなるでしょう。

本書は、大きく2つの編から成っています。前半の入門編と、後半の実践編です。
執筆途中に気づいたのですが、意外なことに、入門編が予想以上に良く仕上がりました。今まで触れられてこなかった重要な事柄、欠落していた部分をカバーできたと感じています。シェーダーの技術的な事や、3D数学的な事について「これが解らなかったから、全体的にぼんやりとしか理解できなかった・・・」という問題の多くを解決するのではと思っています。
実践編では、ゲームや3Dアプリに必ず実装するような基本的な項目であるライティングから解説を始めているなど、本書を大まかに述べると、見た目が豪華なエフェクトを多く解説するというよりも、どちらかと言うと、基本的なことを解説している本かと思います。木に例えると、まずは太い幹の部分をしっかり作ることを意識した構成になっています。細かい枝葉は、幹がしっかりしていなければ上手く支えられないでしょう。シャドウやフォグも、大抵のアプリ(ゲーム等)に実装される、今や基礎的なことと考えています。
一方で、SSSやテセレーション、リアルタイムレンダリングについては、基礎的な領域からは幾分飛び出した内容かと思いますが、それでも内容の比率としては、本書はやはり“幹を作る”ための本だと感じています。
ちなみに、本書の続編「シェーダーグル2」を予定しています。本書により、シェーダーの基礎的なことを解説しているので、シェーダーグル2では“のびのび”と応用的な内容を解説できると思っています。というのは、本書の執筆中、「ここでこの言葉を出すのなら、背景理論を解説しなくてはならない」という局面が多くあり、「ここで掘り下げて解説しなくていいのなら、どんなに楽なのだろう」と思うことがほとんどだったような気がします。
本書シェーダーグルが“幹”なら、シェーダーグル2は“枝葉”になるでしょう。

本書では、いきなり綺麗なサンプルだけを見せるのではなく、あまり最適化されていないサンプルを最初に見せて、だんだんとそれを最適化していくサンプルを見せる、という場合もあります。難解な章では特にそうしています。優秀な読者の中には、その過程が不要な方もいるでしょう。他方で、その過程が理解の助けになる人もいると考えています。
また、これは本書に限った事ではないのですが、サンプルを作る際には極力シンプルになるように努力しています。ただ、Direct3D10/11になってから、どうしてもソースの文字数が増えてしまうため、シンプルには見えないサンプルもあるかと思います。Direct3D10/11の文字数の多さに“惑わされず”に、ソースコードの注目部分に集中するようにして欲しいと思います。全部のコードを理解する必要はありません。

本書は、メッシュグル(グル・シリーズ最初の本で、メッシュ関連に特化した専門書です)のように“完全なステップアップ構成”ではありません。どこから読んでも、さほど困らない内容にはなっています。とは言え、やはり最初から順を追って章を読み進めていくほうが良い事は確かです。
実践編の前に入門編を読むほうが良いでしょうし、また、実践編の中でも、例えばライティングなどは、全てのシェーダーの根幹となるものですから、(実践編の)最初にライティングの章を読むことが効率的な読み方と言えるでしょう。ライティングの章が実践編の最初にあるのは、もちろんそれが理由でもあります。

目次

基礎・入門編 12
1章 プログラミング準備 13
1-1節 概説 13
1-2節 プログラミングの流れ 13
2章 最小シェーダー 15
2-1節 ソースコード 15
2-2節 プロジェクトの構成 アプリ側、シェーダー側 25
2-3節 アプリ側ソースの解説 25
3章 シェーダーのデバッグ方法 46
3-1節 概説 46
3-2節 文法エラー 46
3-3節 詳細な方法 FXC.exe 47
3-4節 実行時、変数の値を見る方法 63
4章 シェーディング 71
4-1節 概説 71
4-2節 ランバートシェーディング 71
4-3節 フォンシェーディング 76
4-4節 カメラ(視点)が影響する 80
5章 テクスチャリング 84
6章 モデルのスケーリング・回転・移動 88
6-1節 概説 88
6-2節 モデルをスケーリングする 89
6-3節 モデルを回転させする 90
6-4節 モデルを平行移動する 90
7章 3DCG数学 92
7-1節 概説 92
7-2節 行列の演算 92
7-3節 行列でジオメトリを操作する 94
7-4節 変換行列を重ねる 97
7-5節 同次座標 101
7-6節 各種変換行列の作り方 111
8章 パイプライン内、座標の変遷 151
8-1節 概説 151
8-2節 座標変遷の流れ 151
8-3節 どのシェーダーでどの変換が行われるか 152
8-4節 サンプルについて 155
8-5節 計算を始める前に 157
8-6節 実際に計算していこう! 第1段階 ワールド変換 157
8-7節 実際に計算していこう! 第2段階 ビュー変換 158
8-8節 実際に計算していこう! 第3段階 プロジェクション変換 159
8-9節 実際に計算していこう! 第4段階 クリッピング 159
8-10節 実際に計算していこう! 第5段階 ビューポートスケール変換 160
8-11節 実際に計算していこう! 第6段階 パースペクティブデバイド 160
9章 ここまでの内容 FAQ 162
質問 スクリーンに何もレンダリングされません。 162
質問 なぜ何回もD3DX10CompileFromFile()と・・・ 164
質問 ポリゴンの“表”はどっち? 164
質問 シェーダー内のグローバル変数は、C++のグローバル変数と同じ? 164
質問 PIXから実行するとhlslファイルが見つからない 165
質問 PIXから実行できない。 165
質問 内籍がマイナスだと色が付くのでは? 165
質問 内積にsaturalte()しているのはなぜ? 166
質問 テクスチャーから拾った色は、ディフューズ成分? 166
質問 ピクセルシェーダーで計算するよりもバーテックスシェーダーで計算? 166
質問 ピクセルシェーダーで引数が無くてもいいのでは? 166
質問 Normalのw=0? 167
質問 シェーダーで、なぜ法線を変換するのですか? 167
質問 なぜ法線にかける行列は、移動成分を削除? 167
質問 なぜ法線はワールド行列だけで変換? 167
質問 NormalやEyeVectorなどもTEXCOORD1やTEXCOORD2? 168
質問 異なるシェーダーファイルであれば、同じ名前のコンスタントバッファー? 168
質問 異なるシェーダーファイルであれば、コンスタントバッファーに同じインデックス? 168
質問 シェーダーはどうやって、どちらのシェーダーファイルかを区別する? 168
質問 ピクセルシェーダー間でデータを共有できますか? 169
質問 グローバル変数を単体で書くのと、cbufferとして書くのは違う? 169
質問 シェーダーの“スロット”とは何ですか? 170
質問 同じhlslファイル内で同じインデックスを付けることはできますか? 170
質問 同じインデックスを付けてもコンパイルが通りました。どういうことでしょう? 170
質問 ファイルが異なれば、同じインデックスを使うことができるのでしょうか? 171
質問 どうやってプログラマーが意図したコンスタントバッファーを区別する? 171
質問 シェーダーを初期化するコードですが、もう少しコンパクトにならないでしょうか? 171
質問 コンスタントバッファーについてですが、どのように分割すれば効率がいい? 172
質問 float型やint型の変数を、わざわざD3DXVECTOR4型? 172
質問 バーテックスシェーダーから線形補間されていないんです。どういうことでしょう? 172
質問 PIXで変数が見えないことがあります 173
実践編 174
10章 ライト 175
10-1節 概説 177
10-2節 ディレクショナルライト 177
10-3節 ポイントライト 179
10-4節 スポットライト 182
10-5節 複数のライト 185
11章 シャドウ 188
11-1節 概説 188
11-2節 丸影 188
11-3節 シャドウボリューム 191
11-4節 シャドウマップ 211
12章 フォグ 221
12-1節 概説 221
12-2節 線形フォグ、指数フォグ 223
12-3節 グラウンドフォグ、テクスチャード・グラウンドフォグ 226
13章 SSS(SubSurface Scattering) 229
13-1節 概説 229
13-2節 原理 231
13-3節 本書サンプルのアルゴリズム 237
13-4節 シェーダーコード 241
13-5節 テクスチャーを可視化 245
13-6節 アーティファクト対策 245
14章 テセレーション[DX11] 248
14-1節 概説 248
14-2節 パッチ、コントロールポイント、ドメイン 249
14-3節 処理の流れ 250
14-4節 サンプル解説 4角形ドメイン 252
14-5節 サンプル解説 3角形ドメイン 260
14-6節 何のため? 262
15章 ディスプレイスメント・マッピング[DX11] 264
15-1節 概説 265
15-2節 ディスプレイスメントマッピングの原理 269
15-3節 サンプル解説 通常ディスプレイスメントマッピング 272
15-4節 ハイトマップの作り方 275
15-5節 アダプティブ・ディスプレイスメントマッピング 292
15-6節 サンプル解説 アダプティブ・ディスプレイスメントマッピング 294
16章 リアルタイム・レイトレーシング[DX11] 302
16-1節 概説 308
16-2節 レイトレーシングの原理 309
16-3節 ソフトウェア実装 スフィア 312
16-4節 ソフトウェア実装 スフィア+床平面 319
16-5節 ソフトウェア実装 スフィア+床平面+影処理 326
16-6節 ソフトウェア実装 スフィア+床平面+影処理+反射処理 328
16-7節 ソフトウェア実装 スフィア+床平面+影処理+屈折透過処理 330
16-8節 ソフトウェア実装 スフィア+床平面+影処理+屈折透過処理+光沢処理 336
16-9節 ソフトウェア実装 スフィア+床平面+影処理+反射処理+屈折透過処理+光沢処理
+テクスチャー 337
16-10節 ハードウェア実装 スフィア 337
16-11節 ハードウェア実装 スフィア 改良 345
16-12節 ハードウェア実装 スフィア さらに改良 346
16-13節 ハードウェア実装 スフィア+床平面 346
16-14節 ハードウェア実装 スフィア+床平面+影処理 347
16-15節 ハードウェア実装 スフィア+床平面+影処理+反射処理 347
16-16節 ハードウェア実装 スフィア+床平面+影処理+屈折透過処理 348
16-17節 ハードウェア実装 スフィア+床平面+影処理+屈折透過処理+光沢処理 348
16-18節 ハードウェア実装 スフィア+床平面+影処理+反射処理+屈折透過処理+光沢処理 348
16-19節 メッシュ 348
16-20節 メッシュ 速度改善 353
16-21節 2つのメッシュ 屈折透過 354
17章 ディファード・シェーディング 355
17-1節 概説 356
17-2節 原理 357
17-3節 最もシンプルなディファード・シェーディング 358
17-4節 メリット・デメリット 365
17-5節 ディファード・シェーディング vs フォワード・シェーディング 特性を理解する 366
17-6節 結論 どちらがいいのか? 371
18章 YASIKI(屋敷)[DX11] 372
18-1節 概説 373
18-2節 メッシュの表示 374
18-3節 テセレーションを追加 375
18-4節 シャドウとフォグを追加 380

付属サンプルの実行ムービー

(ムービーにしていないサンプルもあります。また、基本的にサンプルにはDX10版とDX11版の両方があります。)

最小シェーダー

ランバートシェーディング

フォンシェーディング

テクスチャリング

ディレクショナル・ライト

ポイント・ライト

スポット・ライト

スポット・ライト ソフトエッジ

複数のライト

丸影

丸影 ソフトエッジ

シャドウボリューム

シャドウマップ

フォグ

指数フォグ

グラウンド・フォグ

テクスチャード・グラウンド・フォグ

サブサーフェイス・スキャッタリング

サブサーフェイス・スキャッタリング 深度マップ可視化

テセレーション クアッド

テセレーション トライアングル

ディスプレイスメント・マッピング

アダプティブ・ディスプレイスメント・マッピング 密度

アダプティブ・ディスプレイスメント・マッピング 距離

リアルタイム レイトレーシング 球

リアルタイム レイトレーシング 球+平面

リアルタイム レイトレーシング 球+平面+影

リアルタイム レイトレーシング 球+平面+影+反射

リアルタイム レイトレーシング 球+平面+影+屈折

リアルタイム レイトレーシング 球+平面+影+屈折+フォンシェーディング

リアルタイム レイトレーシング 球+平面+影+反射+屈折

リアルタイム レイトレーシング 球+平面+影+屈折+反射+テクスチャリング+フォンシェーディング

リアルタイム レイトレーシング メッシュ

リアルタイム レイトレーシング メッシュ+メッシュ+屈折

ディファード・シェーディング

ディファード・シェーディング フォワードシェーディングが得意なシーン

ディファード・シェーディング ディファード・シェーディングが得意なシーン

YASIKI

YASIKI テセレーション追加

YASIKI テセレーション、シャドウ、フォグ追加

サブディビジョンサーフェイス ソフトウェア実装
(サンプルのみ 本文なし)