Month: 4月 2019

RadeonRaysを使ってみた2:Instancing編

前回の記事:RadeonRaysを使ってみた

 

どうも,チョコです.OBになりました.

前回は,手軽にレイトレ―シングができるRadeonRays(以下RR)というライブラリを紹介しました.そこで,同じオブジェクト(玉としましょう)をたくさんシーンに入れようとすると,オブジェクトを複製しなければなりませんでした.メモリに不親切ですね.

さて,RRのAPIを見ると,このようなものがありますね.

どうやら,同じオブジェクトを重複に使用できるんですね.使用例を探してみましょう.

 

うん,ない.

 

マジで.RRを使ったサンプルレンダラーのBaikalのコードですら,CreateInstanceをヒットしなかった(あったら教えてください).

仕方ないですね.この2行のコメントを元に実装してみましょう.

とりあえず,玉を2つ書くコードを考えましょう.まず,玉のShapeを作って,APIに渡します.次に,CreateInstanceはShapeを複製してそうなので,このShapeを渡します.出てきたものを少しOffsetを与えてAPIに渡します.

これを前回のようにレンダーすると...

Screenshot (571)

おおお,玉が2つになりましたね.いいですね.

が,これはよく見るとおかしいですね.

Screenshot (571) - Copy

反射が足りないですね.

...

とりあえず,玉の表面位置を色にしてみましょう.

Screenshot (572)

なるほど.Instanceになっていると,位置は元のオブジェクトのままですね.つまり自分で変換しろと.

さて,変換するにはInstanceIDが必要ですが,RRが提供しているIntersectionの構造体を見てみましょう.

なるほど.すべて解けましたね.確認のため,この値を(2で割って)色にしてみましょう.

Screenshot (573)

当たりですね.では,すべてのオブジェクトの変換行列をkernelに渡しましょう.

そして,CLのほうで:

これで実行してみましょう.

Screenshot (576)

いいですね.ちゃんと反射するようになりましたね.

これで終わりなので,確認のために100コの玉で例の画像を作ってみましょう.

Screenshot (577)

(フルサイズで見ましょう)

きれいですね.では.