レイトレ日記 2022/05/30

昨日というか,今日は,
論文ばっかり読んでいても実装して動くプログラムを作らなきゃいけないと思い始めて,とりあえずひな形を用意することに。
前回の合宿では,GPUレイトレする人が多かったので,今回はGPUレイトレすることに。
OptixやCUDAで組んでいもいいんですが,やっぱりゲームプログラマーならDXRよな!と思い,クソ使いづらいDXRベースでプログラムを組むことに。実行大臣から面倒くさいとの文句が出そうだが,「高い金払ってるんだ,きちんとやりやがれ!」と反論できるな,と思ったので,DXRで組むことにしました。実行大臣、期待してますよ。ファファファファファ…。

まずは,レギュレーションを満たさなければ何をやっても無と帰すので…
60FPSのアニメーションを10秒間で作れるようにするために,16ms以内に1フレームのレンダリング結果を出力できるようにするところから,実装をすることに。
で,前回の合宿とかはstb_image_writeとかを使っていたので,処理速度どんなもんだろ?と思ってデバッグビルドで処理速度を図ってみる。
3000[ms]から4000[ms]の間とのデバッグログが表示される。
「え?4秒?、ヤバくね?」
焦りまくる。簡単に済ませようとしていたのに,4秒? 16[ms]で終わらんやん。10秒でレンダリングとか無理ゲじゃね?
そう思い焦りまくる。
実際にウィンドウ上に表示されるFPSは7と表示されている。
「え?」ってなった。「勘違いではないぞ」
ヤバい、ヤバい、ヤバい、ヤバい、ヤバい。
これだと,またブービーまっしぐらだ,Sさんに馬鹿にされる。ヤバい、ヤバい、ヤバい。
せめてもう少しまともなプログラム書かねば。

ファイル出力がボトルネックとかヤバすぎる。
もっと早いpng出力は無いものか?
bmp出力ならフォーマットが分かっている分,如何様にもできるのだが,レギュレーションとしてpng or jpgというのが定まってしまっている。これは守らねばなるまい。
まぁ,png出力ライブラリなんてlibpng使った意外に書いた経験なんてないので,必死にググる。

…で,ググったところ fpng というライブラリにヒットした!
後で気づいたのだが,自分 star 押している。昔のオレ、ナイスぅ!
まぁ,早速速いということで当然組み込んでみたよね。
で,デバッグビルド測ってみても100倍ぐらい速くなっているぅぅぅ。
Releaseビルドで測ってみると5[ms]未満ぐらいで収まるが,5[ms]-28[ms]ぐらいで結構フレームによって不安定。
もうちょい何とかできんかなと思って,ソースコードを見てみると,std::vector()を使っていて,動的アロケーションが走るコードになっている。けしからん!本当にけしからん!
結局ソースコードを書き替えて,std::vector()を使うけども,最初の1回だけで無駄にアロケーションが走らないように,最大メモリで使いまわすコードに改変。微妙だけども,4ミリ秒ちょっとぐらいで,毎フレーム回るようになった。
とりあえず,これで16[ms]以内にファイル出力を毎フレームできるようになった。

つづいて,自動終了の対応。
60FPSで10秒のアニメーションだから,10秒で終わるようにコードを組んだ。
前回は,16[ms]以内にレンダリング終わらないプログラムだったので,監視用スレッドを立てて,そっちで一定時間たったら,stb_image_writeで出力みたいなコードにしていたんだけども,16[ms]以内できちんと収まるなら,別にスレッド立てるまでも無いかなとおもったので,今回はメインループで回るたびにチェックするプログラムにした,10秒経ったら,PostQuiteMessage(0)を投げて,アプリが終了する作りに。
これで,一応最低限のレギュレーションは守れるはず!!

で,落ち着いて合宿のレギュレーションを見直してみると
『フレームレートは10fpsから60fps、長さは3秒以上10秒以下のアニメーションを10分以内にレンダリングしてください。』

…あはは。
おじさん、60FPSで10秒以内でレンダリングしないといけないかと勘違いしてたよ。
10分ね。10分。
へへ、へへっ。

まぁ,高速化するに越したことはないよね。…と自分に言い聞かせた。
とりあえず,明日からナイーブならパストレぐらいは出来ないとダメかなと思ったので,ナイーブならパストレ実装することにします。
Ray Tracing Gems2 を見たら,Reference Path Tracingという記事があって,色々と参考になりそう。
RWTexture2D OutputはInterlockedAddできんやん!って思っていたら,Gems2の記事で

preColor = Output[uv];
Output[uv] = preColor + radiance;

と書いてあって,「あっ、なーほね!」って思いました。
頭全然回っとらんなぁーと思う,月曜日の夜でした。
まぁ、最下位脱出に向けて頑張ることにします。どうせ、上位勢には叶わんと思うので,下っ端は下っ端なりの頑張りを示せれば,それでいいかなと思っているので。
別に笑われたっていいんすよ。自分なりに精一杯,ちゃんと頑張れたなら…。
上位勢とは頭の良し悪しも違うし,キャリアも違うし。へぼはへぼなりに頑張れればそれでいいかなと思うんです。

残り93日。