« Triangle Visibility Buffer記事 | トップページ | WinMLの始め方 »

2018.04.03

DirectX Raytracing (DXR) の話 その1 APIの構造など

最近、DXRを触り始めていますが、少しずつメモとして中身について書いていこうと思います。

今回は、APIの構造などについてですね。

DXRのサンプルなどはGitHubにあるのですが、ドキュメントに関しては、DXRSDK_v0.09.01.zipをダウンロードするとその中に入ってます。

Getting Started with Raytracing
http://forums.directxtech.com/index.php?topic=5860.0

それからGDC 2018のスライドも良いと思います。

https://msdnshared.blob.core.windows.net/media/2018/03/GDC_DXR_deck.pdf

NVIDIAのIntroduction to NVIDIA RTX and DirectX Raytracingも導入にはわかりやすいと思います。

https://devblogs.nvidia.com/introduction-nvidia-rtx-directx-raytracing/

この記事では、DXRSDK_v0.09.01.zipに付属する4.5 Ray-geometry interaction diagramにある図を取り上げます。

Dxr

DXRはDirect3D12の上で動いてますので、Command Queue、Command Lists、Descriptor Heapなどについては考え方は同じです。あと、頂点バッファ、インデックスバッファも使いまわしが効きます。

レイを飛ばすのはCommand ListsのDispatchRays()をします。これによりレイトレーシングのためのシェーダが実行されますが、今回はこの話は置いておきます。あと、構造的に近い部分のあるOptiXの話もしません。

今回は、2つの話題Acceleration structureとshader tableの話題をします。

Acceleration structureの話

図の話に戻りますが、DXRではまずはAcceleration structureというものがあります。Accelerationは2つに分かれています。図でいうと上半分ですね。

・top level acceleration structure
・bottom level acceleration structure

top level acceleration structureは、instanceというものを持ちますが、これにはレイを飛ばしたあとのシェーダやbottom level acceleration structureや各種マトリックスなどが入っています。

bottom level acceleration structureはレイをうけるジオメトリを登録しておきます。ジオメトリには三角形メッシュやAABBなどの形状を選択することができます。bottom level acceleration structureには複数のジオメトリを登録しておくことができますので、あらかじめ頂点やインデックスバッファを連結などしておく必要はありません。

bottom level acceleration structureは、ゲームなどで言えばキャラクターや背景などのジオメトリなどが格納されるわけですね。

一方。top level acceleration structureはレイを飛ばす側の例えば、カメラからレンダリングしたいとかShadow Rayを飛ばしたいとかでは、instanceを複数作るわけですね。

なお、DXRのAPIではAcceleration structureはID3D12Resourceのようです。

Shader tableとshader recordの話

つづいて図の下半分の話をしますが、下半分はシェーダの話です。

DXRでは、実行したいシェーダやパラメータのセットをテーブルに登録します。これがshader tableですね。shader tableの1つ1つはshader recordと呼ばれます。

top level acceleration structureのinstanceでもつShaderIndexはテーブル内のインデックスということになります。

なお、shadertable内のindexの指定方法ですが、instance 1つにつき1 shader recordを実行する他に、開始インデックスを決めてそこから連続した shader recordを複数連続で実行する指定方法があります。

shader recordは、shader identifierを言うのを持ちますが、これは図ではhit groupという構造になります。

DXRでは、頂点シェーダからピクセルシェーダのようなGPUのパイプラインと違いhit groupに呼び出すシェーダを登録しておきます。

hit groupにはレイを飛ばした時にヒットしたときに実行されるシェーダやヒットしなかったときのシェーダなどのレイを飛ばしたあとに呼び出されるシェーダのセットを持ったものになります。

shader recordは、shader identifier以外にRoot ConstantやDescriptor Tableなどシェーダのリソースバインディングにかかわる情報を持ちます。Descriptor HeapはDirect3D12に引き続き使用されます。

DispatchRaysの単位でのリソースバインディングについてはshader recordが重要になるわけですね。

今回のまとめ

DXRのプログラムに入る前に、まずはこの構造を頭に入れてC++のコードを読むと良いんではないかと思います。あと、Direct3D12自体のAPIの知識は必須です。

次回はDXRのシェーダ部分について書きます。

« Triangle Visibility Buffer記事 | トップページ | WinMLの始め方 »

Programming」カテゴリの記事

画像付き」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

« Triangle Visibility Buffer記事 | トップページ | WinMLの始め方 »