DIRECTX12必携 INSTINCT
7年ぶりの新たな「必携」。
DIRECT3D11必携 をリリースした 2014年 から実に7年。長い研究期間と執筆期間を経てようやくここにDirectX12必携が完成しました。
DirectX9必携(2010年)
DirectX11必携 (2014年)
DirectX9必携 増補版(2018年)
DirectX12必携(2021年)
メジャーバージョン3作目(必携書籍としては4作目)の自信作です。
2つのバージョンを作りました。
今回初めて1つの書籍から2つの版を作りました。
その理由は価格です。DXR(リアルタイムレイトレーシングAPI)を含むUltimate版があまりにも高額なため、DXRとGPGPUを削り、価格を抑えたStandard版を作成しました。
PDFファイルです。
PDFファイルでのご提供となります(紙の書籍ではありません)。電子書籍の決済後の流れ等はこちらをご覧ください。
インスティンクト
本のタイトルにinstinctという言葉が付いていますが、これは本書制作中の早い段階に、ふと心に浮かんだ言葉です。それ以来この言葉をコンセプトに開発を進めてきました。開発も習得も「本能に従う」ということが必要な気がします。
本文「はじめに」より抜粋
この度は書籍としてはかなり高額であるにも関わらず本書をお買い上げいただき、ありがとうございました。
ベアピクセルの書籍価格は制作コストから決定しています。制作コストの90%以上は筆者の人件費です。今回本書を完成させるまでに要した期間は16カ月で、単純に計算すると本書の制作コストは8桁に到達します。本書は価格的には確かに高額ですが、その価格分の内容になっていると思っています。
本書はDX12の基礎から応用までを広範囲にカバーしています。サンプル集として使うことも、また、理論の説明にもふんだんに紙面を割いているので参考書としても使えます。私事ですが実際筆者も日常的に必携シリーズは使っています。CGエンジニア案件(委託、請負)で本当にDX9必携、DX11必携はよく使います。
サンプルは見た目こそ豪華ではないですが(豪華ではないだけに)中身を理解しやすいコードになっています。
なお、想定読者レベルとしてはDX11やOpenGLなどを運用できている事とします。
本書付属サンプルはVisual C++プロジェクトとなります。
DX12は低レベル処理をプログラマーに委譲することで高速性を確保するAPIです。DX9やDX11が今まで自動的にやってくれていたことをDX12ではプログラマーがやらなくてはなりません。これはDX9やDX11に慣れている人にとっては脅威と言えます。本書はその脅威を解消すべく制作しています。
ちょっとここでDX12の清々しいまでの委譲っぷりを垣間見れる仕様をご紹介してみます。
(中略)
この辺の原理についてはもちろん本文の中にて複数個所で説明しています(「お弁当屋さん理論」)。
筆者の印象としては、DX12はプロジェクト開始の度に1からコーディングするというよりも、どこかの時点で一旦ライブラリ化しておいて、以降はそのライブラリを利用しながらライブラリを充実させていくという使い方が効率的なのかなと感じました。プログラマーが自分でライブラリシステムを構築して、そのライブラリを使う感じです。プロジェクトの度にそのまま使うにはあまりにも使い勝手が悪すぎます。
もちろんプログラマーが「ライブラリしか使えない」という状況だと何らかの不具合に対処できないので、DX12を1からコーディングできることはいつの時代も必要かとは思います。「ライブラリしか使えない」状況はいつか必ず大事故になります。
本書によりDX11プログラマー(やOpenGLプログラマー)が今までと同じようにDX12を扱えるようになる事が本書の狙いです。
本書概観
目次
はじめに 12
1章 各種概念 13
1節 コマンドリスト 14
001 コマンドリストとは 15
002 コマンドキューの作成 17
003 コマンドキューの作成(GPGPU用) 18
004 コマンドキューの作成(COPY用) 19
005 コマンドキューの作成(バンドル用) 20
006 コマンドリストの作成 21
007 コマンドリストの作成(GPGPU用) 22
008 コマンドリストの作成(COPY用) 23
009 コマンドリストの作成(バンドル用) 24
2節 フェンス 25
010 フェンスとは 26
011 フェンスの作成 28
012 フェンスでGPUとの同期をとる 29
3節 バリア 30
013 バリアとは 31
014 バリア(トランジション) 34
015 バリア(壁) 35
4節 リソース 36
016 リソースとは 37
017 リソースで大事な事 39
018 バーテックスバッファ 41
019 インデックスバッファ 43
020 コンスタントバッファ 45
021 テクスチャー 46
022 アクセラレーションストラクチャーバッファ 49
5節 リソースバインディング 53
023 リソースバインディングとは 54
6節 ルートシグネチャ 58
024 ルートシグネチャとは 59
025 ルートパラメーターとは 61
7節 パイプラインステートオブジェクト 66
026 パイプラインステートオブジェクトとは 67
8節 ディスクリプター 71
027 ディスクリプターとは 72
9節 ルートコンスタント 76
028 ルートコンスタントとは 77
029 ルートコンスタントによるバインディング 78
10節 ルートディスクリプター 79
030 ルートディスクリプターとは 80
031 ルートディスクリプターによるバインディング 81
11節 ディスクリプターテーブル 82
032 ディスクリプターテーブルとは 83
033 テーブル1つ、範囲1つ、ディスクリプター1つ 87
034 テーブル1つ、範囲1つ、ディスクリプター複数 91
035 テーブル1つ、範囲 複数、ディスクリプター1つ 同種のディスクリプター 93
036 テーブル1つ、範囲 複数、ディスクリプター1つ異種のディスクリプター 95
037 テーブル1つ、範囲 複数、ディスクリプター複数 同種のディスクリプター 96
038 テーブル複数、範囲1つ、ディスクリプター1つ 98
039 テーブルとヒープ、重要なこと 100
040 テーブル複数、範囲1つ、ディスクリプター1つ(ヒープ複数版) 101
041 テーブル複数、範囲1つ、ディスクリプター複数 102
042 テーブル複数、範囲 複数、ディスクリプター1つ 103
043 テーブル複数、範囲 複数、ディスクリプター複数 104
12節 デバッグ 105
044 デバッグレイヤーによるデバッグ 106
045 PIXによるデバッグ 108
13節 シェーダー種類別概説 113
046 パイプラインの各工程 114
047 バーテックスシェーダーとは 116
048 バーテックスシェーダーの仕事 最小サンプル 117
049 ジオメトリシェーダーとは 119
050 ジオメトリシェーダーの仕事 最小サンプル 120
051 ハルシェーダーとは 123
052 ハルシェーダーの仕事 最小サンプル 124
053 テセレーターとは 126
054 ドメインシェーダーとは 127
055 ドメインシェーダーの仕事 最小サンプル 128
056 ピクセルシェーダーとは 130
057 ピクセルシェーダーの仕事 最小サンプル 131
058 コンピュートシェーダーとは 134
059 コンピュートシェーダーの仕事 最小サンプル 135
060 ストラクチャードバッファとは 139
2章 ジオメトリの表示 141
1節 初期化 142
061 空ウインドウ(非クラス) 143
062 空サンプル(クラス形式) 144
063 DX12初期化と画面クリア 145
064 深度バッファありの初期化 156
2節 フルスクリーン 159
065 フルスクリーン 160
3節 点 161
066 点を3D空間に描画 162
4節 線 165
067 線を3D空間に描画 166
5節 ポリゴン 167
068 トライアングルのレンダリング 168
069 クアッドのレンダリング 171
070 クアッドのレンダリング インデックス使用 173
071 深度バッファありのレンダリング 176
6節 ワイヤーフレーム 177
072 ワイヤーフレーム 178
7節 テクスチャー 179
073 ポリゴンにテクスチャーを貼る 180
074 テクスチャーの切り替え 186
075 テクスチャーとシェーダー側レジスターの対応 188
076 サンプリング,フィルタリング,アドレッシングって何? 190
9節 テキスト 193
077 テキストのレンダリング 194
10節 スタティックメッシュ 203
078 メッシュとはトライアングルの集まり 204
079 スタティックメッシュとは 208
080 バーテックスバッファとは 209
081 インデックスバッファとは 211
082 頂点の順番 214
083 スタティックメッシュのレンダリング(OBJ) 215
084 スタティックメッシュのレンダリング(FBX) 217
085 スタティックメッシュのレンダリング(STL) 218
086 スタティックメッシュのレンダリング(オリジナルフォーマット) 219
087 スタティックメッシュ 複数対応版(OBJ) 221
11節 階層アニメーションメッシュ 222
088 階層アニメーションメッシュとは 223
089 階層アニメーションメッシュ(Xファイル) 226
090 アニメーションの制御(X) 228
091 階層アニメーションメッシュ(FBX) 229
092 アニメーションの制御(FBX) 231
093 階層アニメーションメッシュ(オリジナルフォーマット ソース内定義) 232
094 階層アニメーションメッシュ(オリジナルフォーマット バイナリファイル) 237
095 階層アニメーションメッシュ(オリジナルフォーマット テキストファイル) 239
096 アニメーションの制御(オリジナルフォーマット) 241
12節 スキンアニメーションメッシュ 242
097 スキンアニメーションメッシュとは 243
098 スキンメッシュ(Xファイル) 244
099 アニメーションの制御(X) 246
100 スキンメッシュ(FBX) 247
101 アニメーションの制御(FBX) 249
102 スキンメッシュ(オリジナルフォーマット ソース内定義) 250
103 スキンメッシュ(オリジナルフォーマット バイナリファイル) 255
104 スキンメッシュ(オリジナルフォーマット テキストファイル) 257
105 アニメーションの制御(オリジナルフォーマット) 259
13節 複数のレンダリング 260
106 複数オブジェクトのレンダリング 261
107 複数マテリアル 265
108 複数マテリアルの複数モデル 267
3章 ジオメトリのシェーディング 268
1節 法線とエッジ部分のシェーディング 269
109 ハードエッジと、ソフトエッジとは 270
110 フラットシェーディング(ハードエッジ) 275
111 スムーズシェーディング(ソフトエッジ) 276
2節 ディフューズ 277
112 色のみ 278
113 ランバート Lambert 反射モデル 280
114 オーレン-ネイヤー Oren–Nayar 反射モデル 285
3節 スベキュラー 288
115 フォン Phong 照明・反射モデル 289
116 クック・トランス Cook-Trrance 照明・反射モデル 294
4節 様々なシェーディング 297
117 アイスシェーダー 298
118 2 color 299
5節 サブサーフェイススキャッタリング 300
119 SSSとは 301
120 SSS 304
121 SSS 深度テクスチャー可視化 310
122 SSS アーティファクト対策 312
123 SSS+phong 314
124 SSS+テクスチャー 316
125 SSS+phong+テクスチャー 318
6節 バンプ 320
126 バンプマッピングとは 321
127 ノーマルバンプマッピングの原理 322
128 ハイトマップとノーマルマップ 326
129 ポリゴンにバンプ ノーマルマップ使用 328
130 ポリゴンにバンプ ハイトマップ使用 333
131 スタティックメッシュにバンプ ノーマルマップ使用 334
132 スタティックメッシュにバンプ ハイトマップ使用 335
133 スキンメッシュにバンプ ノーマルマップ使用 336
7節 テセレーション 337
134 テセレーションとは 338
135 パッチ、コントロールポイント、ドメインを理解する 339
136 テセレーション 四角 341
137 テセレーション 三角 353
8節 ディスプレイスメント 356
138 ディスプレイスメントマッピングとは 357
139 ディスプレイスメントマッピング 369
140 アダプティブ・ディスプレイスメントマッピング 密度マップ 374
141 アダプティブ・ディスプレイスメントマッピング 距離 383
142 海水面を表現 385
143 雪 386
144 ディスプレイス後の法線 388
9節 環境マッピング 389
145 スフィアマップでスカイドーム 390
146 キューブマップでスカイボックス 392
10節 反射、周囲の写り込み 393
147 法線からスフィアマップ用のUVを求める 394
148 スフィアマップで背景のみ映りこみ 頂点単位 399
149 スフィアマップで背景のみ映りこみ ピクセル単位 401
150 法線と視線からキューブマップ用のUVを求める 402
151 キューブマップで背景のみ映りこみ 頂点単位 404
152 キューブマップで背景のみ映りこみ ピクセル単位 405
153 キューブマップで他モデルの映りこみ 406
154 スカイドームと映りこみ 416
155 スカイボックスと映りこみ 417
11節 透過 418
156 アルファブレンディングとは 419
157 アルファブレンディング 有効・無効 421
158 汚いアルファブレンディング(失敗例) 424
159 綺麗なアルファブレンディング(解決策) 427
160 通常合成、加算合成その他 431
161 カリングトリック 435
12節 屈折 436
162 キューブマップ リフラクション 437
4章 シーン 439
1節 アンチエイリアス 440
163 アンチエイリアス 441
2節 フォグ 447
164 線形フォグ、指数フォグ 448
165 グラウンドフォグ、テクスチャードグラウンドフォグ 453
(重要)練習問題 457
3節 ぼけ 458
166 ぼけ 459
167 距離でぼけ変化 461
168 被写界深度(DOF) 464
169 ピクセルモーションブラー 466
4節 カメラ 469
170 カメラを移動 470
171 カメラを回転 473
172 カメラのワールド回転 475
173 カメラのローカル回転 477
174 ジンバルロックとは 480
175 実際にジンバルロックを体験してみる 481
176 ズームイン・アウト 485
177 カメラ自体移動でズーム 487
178 シーンのスケーリングでズーム 489
179 FPS風操作 491
180 3人称視点 494
5節 ライト 496
181 ディレクショナルライト 497
182 ポイントライト 501
183 ポイントライト 減衰 505
184 スポットライト 508
185 スポットライト 減衰 515
186 スポットライト ソフトエッジ 516
187 スポットライト ソフトエッジ 減衰 518
188 複数のライト 519
6節 影 521
189 丸影 522
190 丸影 ソフトエッジ 525
191 シャドウボリューム 527
192 シャドウマップ 548
193 キューブシャドウマップ 557
7節 ディファードレンダリング 563
194 ディファード・シェーディングとは 564
195 ディファード・シェーディングの原理 565
196 最もシンプルなディファード・シェーディング 567
197 ディファード・シェーディングのメリット・デメリット 574
198 ディファード・シェーディング VS フォワードシェーディング 575
199 G-Bufferに入れるものは自由 577
8節 マウス選択 578
200 3D物体のマウス選択 579
5章 高速化 582
1節 視錐台カリング 583
201 視錐台カリング 584
2節 オクルージョンクエリ 587
202 オクルージョンクエリ 588
3節 バンドル 592
203 バンドルとは 593
204 バンドルの効果 594
6章 マルチスレッド 597
1節 マルチスレッド 598
205 まずは純粋にマルチスレッドのみ 599
206 シングルスレッド 606
207 マルチスレッド 607
208 重たいCPU処理がある場合に効果大 610
209 マルチスレッドと速度アップについて 612
7章 GPGPU 613
1節 コンピュートシェーダー 614
210 GPGPUとは 615
211 GPUの計能能力は驚異的 616
8章 DXRによるリアルタイムレイトレーシング 622
1節 各種概念 623
212 RTPSOとは 624
213 DXILライブラリとは 626
214 アソシエーションとは 627
215 シェーダーコンフィグとは 629
216 パイプラインコンフィグとは 630
217 ペイロードとは 631
218 ローカル(グローバル)ルートシグネチャとは 633
219 シェーダーテーブルとは 634
220 Ray Typeとは 635
221 shader recordを分かつ要素 636
222 BLAS/TLASとは 637
2節 ミニマムなレンダリング 638
223 トライアングルのレンダリング 639
224 ボックスのレンダリング 651
3節 インスタンシング 653
225 インスタンシング 654
4節 ジオメトリの操作 656
226 行列でジオメトリを動かす 657
5節 インデックス 661
227 インデックスバッファを使う 662
6節 シェーダーの適用方法 664
228 ランバートシェーディング 665
7節 影 670
229 トライアングルとプレーンのレンダリング 671
230 トライアングルの影 676
231 ボックスの影 680
232 ボックスインスタンスの影 681
233 ボックスインスタンス動かした影 682
著者紹介 684
(注)青い項目はUltimate版のみです。
付属サンプルプログラムの実行ビデオ(全てではありません)
テーブル1つ、範囲1つ、ディスクリプター1つ
テーブル1つ、範囲1つ、ディスクリプター複数
テーブル1つ、範囲 複数、ディスクリプター1つ 同種のディスクリプター
テーブル1つ、範囲 複数、ディスクリプター1つ 異種のディスクリプター
テーブル1つ、範囲 複数、ディスクリプター複数 同種のディスクリプター
テーブル複数、範囲1つ、ディスクリプター1つ
テーブル複数、範囲1つ、ディスクリプター1つ
テーブル複数、範囲1つ、ディスクリプター1つ
テーブル複数、範囲1つ、ディスクリプター複数
テーブル複数、範囲 複数、ディスクリプター1つ
初期化
トライアングル
クアッド
クアッド インデックス使用
深度バッファありの描画
クアッドにテクスチャーを貼る
テクスチャーの切り替え
テクスチャーとシェーダー側レジスターの対応
テクスチャーとシェーダー側レジスターの対応その2
テキストのレンダリングシステム
スタティックメッシュ(OBJ)
スタティックメッシュ(FBX)
スタティックメッシュ(STL)
スタティックメッシュ(独自フォーマット)
スタティックメッシュ(OBJ) 複数対応版
階層アニメーションメッシュ(X)
階層アニメーションメッシュ(FBX)
階層アニメーションメッシュ(独自フォーマット ソース内に用意)
階層アニメーションメッシュ(独自フォーマット バイナリ)
階層アニメーションメッシュ(独自フォーマット テキスト)
スキンアニメーションメッシュ(X)
スキンアニメーションメッシュ(FBX)
スキンアニメーションメッシュ(独自フォーマット) ソース内に用意
スキンアニメーションメッシュ(独自フォーマット) バイナリファイル
スキンアニメーションメッシュ(独自フォーマット) テキストファイル
複数モデルのレンダリング
複数マテリアル
複数マテリアルの複数モデル
ハードエッジ
ソフトエッジ
カラーのみ
ランバートシェーディング
Oren-Nayar
フォンシェーディング
Cook–Torrance
アイスシェーダー
2色
SSS
SSS 深度テクスチャー可視化
SSS+Phong
SSS+Texture
SSS+phong+Texture
ポリゴンにバンプ ノーマルマップ使用
ポリゴンにバンプ ハイトマップ使用
メッシュにバンプ ノーマルマップ使用
メッシュにバンプ ハイトマップ使用
スキンメッシュにバンプ ノーマルマップ使用
最小テセレーション クアッド
最小テセレーション トライアングル
ディスプレイスメントマッピング
アダプティブ・ディスプレイスメントマッピング 密度マップ
アダプティブ・ディスプレイスメントマッピング 距離ベース
板ポリゴンで海を表現 ディスプレイス版
板ポリゴンで雪の堆積を表現
屋敷
スカイドーム
スカイボックス
スフィアマップ 頂点単位
スフィアマップ ピクセル単位
キューブマップ 頂点単位
キューブマップ ピクセル単位
キューブマップで本当の写り込み
スフィアマップとスカイドーム
キューブマップとスカイボックス
汚いアルファブレンディング
綺麗なアルファブレンディング
ブレンディング各種
カリングトリック
リアルタイムリフラクション
アンチエイリアス
アンチエイリアス比較
線形フォグ
指数フォグ
グラウンドフォグ
テクスチャードグラウンドフォグ
ぼけ
距離ベースぼけ
被写界深度
モーションブラー
カメラ移動
カメラ回転
カメラ ワールド軸で回転
カメラ ローカル軸で回転
ジンバルロック
カメラズーム
カメラ自体移動でズーム
シーンのスケーリングでズーム
カメラ FPS風操作
カメラ 3人称視点
ディレクショナルライト
ポイントライト
ポイントライト 減衰
スポットライト
スポットライト 減衰
スポットライト ソフトエッジ
スポットライト 減衰ソフトエッジ
複数のポイントライト
丸影
丸影 ソフトエッジ
シャドウボリューム
シャドウマップ
全視界キューブシャドウマップ
ディファードレンダリング基本
フォワードシェーディング有利シーン フォワード版
フォワードシェーディング有利シーン ディファード版
3D物体をマウスで選択
視錐台カリング
オクルージョンクエリー
16000枚描画
16000枚描画 バンドル使用
CPUマルチスレッド CreaetThread方式
シングルスレッド
マルチスレッド
重たいCPU処理がある場合(シングルスレッド)
重たいCPU処理がある場合(マルチスレッド)
GPGPU
DXRトライアングル
DXRボックス
DXRボックス インスタンス
DXRボックス 動かす
DXRボックス インデックス
DXRボックス ランバートシェーディング
DXRトライアングル プレーン
DXRトライアングル プレーン 影
DXRルボックス プレーン 影
DXRボックス プレーン インスタンス 影
DXRボックス プレーン インスタンス 動かす 影
ご購入は
当サイトオンラインショップで販売しています。