DirectXRayracingで三角形の描画に挑戦した時のメモ
今回はDirectXRaytracingで三角形ポリゴンの描画を挑戦したので、そこで気になったことをメモしました。
レイトレーシングについての簡単な概要
視点からスクリーン上に向けてレイを飛ばして、ポリゴンの衝突、屈折、反射などによるレイの動きを追跡して、最終的に光源を求め、描画結果を得る方法。
レイトレーシング用のパイプラインについて
基本的には1方向の流れのラスタライズ法のパイプラインと大きく動きが異なる。
交差した際のシェーダーや、交差なしの場合などの複数のシェーダーを使い、レイの動きによって再帰処理なども行っていく。
描画までの流れ
<ラスタライズ法と共通の流れ>
- ID3D12Deviceの作成
- ID3D12GraphicsCommandListなどの描画用リソースの作成
<DirectXRaytracingでの流れ>
- 頂点情報(今回は三角形ポリゴン)の作成
- Acceleration Structure
- Top Level Acceleration Structureの作成
- Bottom Level Acceleration Structureの作成
- PipeLineStateObjectの生成
- 各種リソースの生成(レンダリング先のリソースや、TLAS用のViewの生成など)
- ShaderTableの生成
- DispatchRays(描画)
Top Level Acceleration Structure(TLAS)とBottom Level Acceleration Structure(BLAS)について
空間を下位と上位に分けて、レイトレーシングでの交差判定処理の高速化を行うための仕組み。
古典的なレイトレにおけるBVHによる最適化と似たようなことだと思っている。
BLASがメッシュの頂点情報を持っていて、TLASはBLASを箱のように大きく囲っていて、この箱に交差するとさらに内部のBLASで交差判定を行うようなイメージ。無駄な交差判定を行わないのは正義。
BLASはメッシュからさらにポリゴンを分けてたイメージを持っていたが、実際はメッシュ単位?大きなメッシュの場合、交差判定のコストが増してしまいそうなので、その部分の対策方法もありそうだなと思った。
GlobalRootSignatureとLocalRootSignature
GlobalRootSignatureは、通常のラスタライズ法のパイプラインにおけるRootSignatureと変わらない。全てのシェーダーで使用するリソースの設定を行う。
これに対して、LocalRootSignatureはLocalの名の通り、各シェーダーやヒットグループごとに設定を行えるものらしい。
さいごに
初めてDirectXRaytracingに触れてみて、さらに新たな概念が増えて、DirectX12もまだ全然理解していないのに、こまった。こまった。
レイトレーシング用のパイプラインの動きに特徴があるので、ShaderTableやShaderLibrary、ペイロードなど、シェーダー周りが特に複雑だなーと思った。
ShaderTableの生成においては、今までもGPUのメモリを意識することがあったが、ほとんどはAPI側がなんとかしてくれていたので助かっていたが、直接メモリに書き込んでいくようなイメージでより一層、深みに触れた気がした。