すらりんラボさんの
「DirectX12 Programming Vol.1」を読んだ。
技術書典に行けなかったのでBOOTHからpdfを購入。
購入はこちら(https://booth.pm/ja/items/1286096)
本の感想じゃないのも含まれているが、12章まで読んだので思っていること
以下は読みながら書いたメモ
特に推敲とかなく順番も適当、書いてることもバラバラ
序盤は普通に読み物として読み進めて問題なく対象読者だとかD3D12とは何かとか開発環境のセットアップなど。
D3D11を踏まえてのD3D12がどういった位置付けなのかをある程度解説してありわかりやすかった。
他で読んだことと合わせて自分なりにD3D12を解釈すると、
みたいな感じだと思う。
つまりよりGPUに近いAPIになってアプリケーション側で考えることが増えた代わりにいままでGPUにまかせてふわっとしていた部分まで設定ができるようになったということ。
個人的には今からグラフィックスAPIをちゃんと学び始めるなら、このような丁寧に解説がある本もあるし12からでいいのではないかと思った。
OpenGL書いてるコードがどうGPUに影響しているのかいまいち分かりづらい印象があったし。(もちろん自分がそこまで理解できなかったのかもしれないが。)
あと2.4のCPUとGPUという部分の図は重要。
CPUとGPUは非同期に動いていて、命令をコマンドバッファに記録しコマンドキューに積む。GPUはコマンドキューに積まれた命令を実行していく。メモリはCPUGPU間で共有できるメモリとGPU専用のメモリ(VRAM)がある。VRAMのほうが早い。
ここからはコードベースな解説が続くと思うので印象に残った部分の断片的なメモ
本ではコードが抜粋されているので本をもみながらGithubのコードを写し書きしていく。
コマンドキュー
本では1つのみの使用だが複数使用するケースはどんなケースか
ディスクリプタヒープは重要そう
メモリ管理について
メモリ管理についてリソースの確保に以下のメソッドが用意されているが
この本ではCreateCommittedResource以外取り扱わないので余裕があれば調べる
コマンドアロケーター
コマンドアロケーターの生成もD3D12_COMMAND_LIST_TYPE_DIRECTのみを使用しますとかいてあるので他も余裕があればみておく
ここまでくるとひとまず画面がクリアできる。
fenceを使って待機させるところは自分で深く考えて理解する必要があった。
たぶんこれで合ってると思う。
6~8章は9章以降に出てくる用語などの解説が多いので一旦読んでおいて、9章以降で詰まったら参照するみたいな流れになりそう。
レンダリングパイプラインとルートシグネチャについての解説。
具体的な実装には触れてないので実装するときにまた見ることになる章かな。
HLSLの基本構文はわかってるつもりなので流し見
アップロードヒープ?デフォルトヒープ?となったので要復習
テクスチャやvertex buffer, 定数バッファなどのリソース関連の章
このへんGPUとのやりとりに関わるのできちんと理解したい。
Mapを使用してのバッファへの書き込みの部分、buffer.Map()関数を使用すると第三引数に書き込むポインタがセットされて、そのあとのmemcpyでデータをそこのポインタにセットするという理解で正しいのかな。
そしてそのbufferは元々CreateCommitedResource()で確保したリソースなのでどうやら正しそう。
まとめると、
と理解した。
vertex/index bufferにはそれぞれ生成が必要で使うためにはbuffer viewというものが必要
constant bufferにも同様。
6~8章に説明がされていたことを使って三角形を書いてみる章。
実際に書いてみることで理解が深まったが、ルートシグネチャに関しては今回はシェーダーに渡すものがないので理解を次章以降にまわした。
終了処理に関して、めんどくさいながらもfenceを使ったGPUの処理待ちの部分を自分なりに噛み砕いて理解していたおかげですっと理解できた気がするので、ちゃんと読むって大事だなと感じた。
次のテクスチャがはられたキューブの描画に向けてテクスチャ関連の説明をしている章。
個人的に、OpenGLだとサンプラーがテクスチャと一緒に設定されて(多分)、両者が別れている概念だということがいまいち理解できなかったのでD3D12のほうがわかりやすくていい気がする。
12章を読みながらもう一度戻って読む章。
ディスクリプタヒープって何だったかすっかり忘れていた。
4章に詳しく書いてある。抜粋すると
DirectX 12でのディスクリプタとは、各GPU固有のデータで、メモリ上に置かれ たリソースをどのように解釈するかを記録しているものとなっています。そして、こ のディスクリプタはレンダーターゲットビュー、デプスステンシルビュー、サンプ ラー、シェーダーリソースビューといった分類で分けられています。
こういうことらしい。
ちなみに
CBV: Constant Buffer view
SRV: Shader Resource view
UAV: Unordered Access View
と予想。(UAVだけ調べた。まだ使ったことない)
一通り実装したけど要素多すぎて全然覚えられなかった。
ここまでの内容は脳内再生できるくらいにしておかないといけないように感じるのでまた別の実装でやってみたいと思う。
ルートシグネチャについて詳細。
読んで理解はできたけど、教科書を読んだけどテストでは解けない程度の理解にとどまっているので、後日読んだらまた理解が深まりそうな部分。
13章までの内容で満足してしまったので読んでなくて、いつか読む。