レイトレ日記 2022/06/12

今日は,目標だった交差判定するところまでを実装した。

DXRでレイとヒットしたところが,赤くなる。
あとは,使うかわからんが,デノイズ処理用にアルベドと法線のデータも毎フレーム作成するようにした,デバッグビューで表示できるようにもしておいた。

あとは,マテリアルのデータや頂点データ等がちゃんとレイヒット時に取れるようになれば,パストレが組めそう。
で,そのためにはシーンデータの管理周りを整備しなくちゃなということで,実装に着手。シェーダ側は既に実装済み。

色々と進めると,作ったModelMgrクラスが根本的にダメなことがわかったので修正した。
HLSL側にでっかいVertexBufferとIndexBufferを渡して使う仕組みだったんだが,UINT32_MAX以上の数扱えないことに今更気が付いたという感じ。
結局,VertexBufferとIndexBufferは各メッシュごとに小分けに作ることにした。
HLSLはDynamicResourceで直接ResourceDescriptorHeapから頂点バッファとインデックスバッファを参照するように変更。
このために,DescriptorIndexを渡す必要があるので,

struct Instance
{
    uint32_t VertexBufferId;
    uint32_t IndexBufferId;
    uint32_t MaterialId;
};

という構造体を作って,これをバッファ化することに。このバッファにはInstanceID()を使ってアクセスする。
無理やりInstanceIdにマテリアルIDとジオメトリIDをパッキングする方法をやめたので,マテリアル数も少し多く扱えるようになった。
DynamicResource様様ですね。大分実装が楽になった。
結構めんどっちい実装なので,アドベントカレンダーのときに,ざっくりどんなつくりは説明しようかなって思っています。

残り79日!