Visual Studio 2019 で FBX SDK

ViewScene サンプルプロジェクトをテスト実行。

プロジェクト構成は x64 に変更し、VS2019 で実行したときに、FBX SDK 以下にフォルダが作られるため、アクセス権を設定しておく。

DirectX Raytracing のドキュメント

DirectX Raytracing (DXR) Functional Spec
https://microsoft.github.io/DirectX-Specs/d3d/Raytracing.html

DXR のドキュメント (リファレンス) は、少し前まで word ファイルで提供されていましたが、今は github io から閲覧できるようになったのですね。

公式のドキュメントを補足する形の情報が、こちらの github 上にまとめられているみたいです。
https://microsoft.github.io/DirectX-Specs/

HLSL ByteAddressBuffer の使い方

ByteAddressBuffer は引数にバイト数を指定する。

ByteAddressBuffer byteBuffer : register(t0);
uint value = byteBuffer.Load(0);

4 Byte 単位でメモリーにアクセスしてデータを取得出来るバッファータイプ。戻り値は uint (4 Byte) になる。Load 関数の引数は 4 の倍数でなければいけない。Load2(0) で指定すれば uint2 型で 8 Byte の連続した領域を取得できる。Load3(0) で指定すれば uint3 型で 12 Byte の連続したメモリー。

uint4 value = byteBuffer.Load4(4);
という指定をすれば、アドレスの開始位置が先頭から 4 Byte 目から、16 Byte の連続した領域を取得出来る。

DirectX12 HLSL Texture2D.Load にはまる

Texture2D の Load 命令は引数として int3 を受け取るため、texture.Load(int3(0, 0, 0)); のような形式で呼び出す。この時 x, y には UV ではなくて テクスチャの width -1, height -1 の値を指定する。当たり前だが、-1 に注意。そして z は mipmap を指定できる。

Texture サイズが 256×256 だとして、Load(int3(256, 256, 0)); とサイズを超えてしまった場合は 0 が返るようになっている。この時に大切なのが存在しない mipmap にアクセスした場合も 0 が返るという事。

int3 を指定せずに Load(0) とやるのは特に問題無いが、テストで Load(1) としてしまったとき、Load(int3(1, 1, 1)); になるため、もし mipmap が存在しないテクスチャに対してこれをした場合は 0 が返ってしまう。ちょっとしたテストで Load(1) をやった結果、原因を突き止めるのに時間がかかった。

Texture2D.Load は int3 でテクスチャ座標とミップマップ値に気をつけて使用する。

DirectX12 Misc

ID3D12Resource::GetGPUVirtualAddress

D3DResource は GetGPUVirtualAddress メソッドを持っており、Vertex Buffer を作るときなど View 構造体に対してアドレスを渡すときに使う。このメソッドは Buffer Resource のみで使用可能で、Texture Resource の時は使用できないため 0 が返る。

Root Parameter の並び順

アクセス頻度の高いものをインデックス 0 から並べた方が、パフォーマンスが良い? (未検証)

DirectX12 Root Signature

Root Signature を覚えるのは大変だ。これは抽象的な図や分かりやすい言葉で表すのは困難で (少なくとも自分には)、C言語を最初に学んだ時のポインタのように、苦しんで覚えるしかない類の物だと思ってる。

MS のドキュメントやこんなブログの内容を見るよりも、D3D12 のサンプルプログラムを実行し、修正しながら動作を確認するのが一番の近道な気がします。

自分は Root Signature を理解するのに最も大切な概念って Descriptor Table だと勝手に思い込んでいたのですが (いや重要なんですけどね…)、CD3DX12_ROOT_PARAMETER1 が大切で、この定義と、CommandList->SetGraphicsRootDescriptorTable() との関連性が理解出来れば、Root Signature って大体分かるんだと思う。