先日 NVIDIA の DXR Tutorial を試してみて、DXR界隈に第1歩を踏み出しました。あれからもうちょっと理解が進んだので、そのメモというか記録です。ようやくテクスチャを使ってみるところに到達です。
あれからどうしたか
チュートリアルをやった結果、便利なヘルパー関数を使わずにもう1度最初から始めてみました。また1つずつ積み上げて影が落ちている状態にまで順序立てて、プログラムを組み立ててみました。
チュートリアルで影を落とすところは手元でうまくコードに出来なかったので、そこを克服したかったというのが最初の目標でした。
- ヘルパー関数の除去
- シャドウレイを飛ばすシェーダーを稼働させる
- カメラを導入にして回転させる
結局シャドウレイが飛ばせなかったのは、設定がミスしていたからなのですが、ヘルパー関数を使っているとどこでミスしたのかが分かりづらかったように思います。
他、やっていること
以下のステップでコードを変更していました。
- 頂点バッファ・インデックスバッファを使うようにする
- ローカルルートシグネチャを設定する
- 頂点属性(アトリビュート)にアクセスする
- テクスチャを貼る
テクスチャを貼るまでは見た目にも変更がなく、進んでいる感じがあまりなかったですね。テクスチャを貼った後、「そういえばミップマップは?」と思い立って試してみたのが以下のものです。
これは適当に、ヒットした距離でミップマップ選択して描画しています(ミップマップごとの色分けしたテクスチャは別に用意しています)。
ここまでの感想など
やはり最大の手間は “D3D12_STATE_SUBOBJECT” でレイトレーシング用のパイプラインを構成することと、シェーダーのバインディングテーブルを作り上げることでしょうか。ここを失敗すると、簡単に GPU がハングアップ・リセットします。間違いがあると DirectX12 の検証レイヤーが警告を発してくれますが、それを取り切ったとしても設定ミスで簡単に動作不良に陥ります。このときに何も情報が出ないので、なかなかにしんどいです。ここがDXR入門の山となる印象があります。