RadeonRaysを使ってみた
どうも,チョコです.
最近レイトレーシングをちょっとやってるんですけど,流石に自分でメモリ構造体を作るのが不効率すぎて辛い.昨日Siggraph Asia行った時に見たRenderMan22が速すぎて衝撃を受けました.
そこで,AMDが開発したRadeonRays(以下RR)というオープンソースなライブラリを見つけました.しかもopencl1.2なのでいろんな環境で動きますね.
(ここでレイトレプロのみなさんへの忠告です.この記事を書いた僕はくそレイトレ―シング初心者です.画像を見て吐き気がしたら見るのをやめましょう.)
さて,RRのサンプルを動かしてみよう.ここではVisualStudioを使ってCornellBoxサンプルをコンパイルして見ましょう.
おう.すごい.
しかし,これだとレイトレっぽくないので,とりあえず反射を入れましょう.
反射とは要するに,レイをdとしたら,表面の法線nに対して
d’=d−2(d⋅n)n
を計算すればいいですね.また,この時,最終の色は元の色と乗算します.
レイトレっぽくなりましたね.
次に,反射をDiffuseにしましょう.ここではLambertを使います.Lambertは簡単にいうと,入射角と法線の内積で明るさが決まりますね.まずは単純に,表面から半球の法線をランダムに決めて内積を取って乗算します.ただし,ここでは光源を円に変え,円に当たらなかったレイは黒にします.
ノイズ高いですね(適当).
Diffuseの次は当然Specularですね.ここではBeckmannを使います.説明が面倒なのでググって.ただし,普通にランダムに取ると収束まで結構時間がかかりますので,ここではImportance Samplingを行います.
BeckmannのImportance Samplingはここを見てください.
LambertのImportance Samplingはここを見てください.
Specularだけだとこうなります(Beckmann coefficient = 0.2).
ピカピカですね.
DiffuseとSpecularの組み合わせはShlick’s Fresnelを使います.とりあえず単純に,このFresnelの値を確率のカットオフとして,ランダム値がこの値より小さかったらSpecular反射を解散して,そうでなかったらDiffuseということにします.こういうことです.
すると結果はこうなります(Specular = 0.4).
ノイズ高いですね(これしかコメント言えん).
箱は見飽きたので,サルを入れてみましょう.サルは金属にしましょう.
ふむ....
サルは可愛くないので,シャロちゃんを入れましょう().CornellBoxも消して,Skyboxを入れましょう.
レイが表面にぶつからなかった時,方向を使ってSkyboxから色をこのように取ります.ただし,レイがまだ反射していないものなら黒にします.
するとこのようになります(適当).
かわいい...
まだまだダメですが満足したのでやめます.最後にコメントです.
RRのGeneratePerspectiveRaysは視野を気にしないので,表示の縦横比を帰ると変になります.そのため,GLMの行列を使って書き換えます.
Importance Samplingが入っているLambertとBeckmannのコードです.ただし,乱数生成器はXorshiftを使います.
では.
Posted on: 2018年12月8日, by : chokopan