RadeonRaysを使ってみた2:Instancing編
前回の記事:RadeonRaysを使ってみた
どうも,チョコです.OBになりました.
前回は,手軽にレイトレ―シングができるRadeonRays(以下RR)というライブラリを紹介しました.そこで,同じオブジェクト(玉としましょう)をたくさんシーンに入れようとすると,オブジェクトを複製しなければなりませんでした.メモリに不親切ですね.
さて,RRのAPIを見ると,このようなものがありますね.
どうやら,同じオブジェクトを重複に使用できるんですね.使用例を探してみましょう.
うん,ない.
マジで.RRを使ったサンプルレンダラーのBaikalのコードですら,CreateInstanceをヒットしなかった(あったら教えてください).
仕方ないですね.この2行のコメントを元に実装してみましょう.
とりあえず,玉を2つ書くコードを考えましょう.まず,玉のShapeを作って,APIに渡します.次に,CreateInstanceはShapeを複製してそうなので,このShapeを渡します.出てきたものを少しOffsetを与えてAPIに渡します.
これを前回のようにレンダーすると...
おおお,玉が2つになりましたね.いいですね.
が,これはよく見るとおかしいですね.
反射が足りないですね.
...
とりあえず,玉の表面位置を色にしてみましょう.
なるほど.Instanceになっていると,位置は元のオブジェクトのままですね.つまり自分で変換しろと.
さて,変換するにはInstanceIDが必要ですが,RRが提供しているIntersectionの構造体を見てみましょう.
なるほど.すべて解けましたね.確認のため,この値を(2で割って)色にしてみましょう.
当たりですね.では,すべてのオブジェクトの変換行列をkernelに渡しましょう.
そして,CLのほうで:
これで実行してみましょう.
いいですね.ちゃんと反射するようになりましたね.
これで終わりなので,確認のために100コの玉で例の画像を作ってみましょう.
(フルサイズで見ましょう)
きれいですね.では.
Posted on: 2019年4月8日, by : chokopan