ねこでじ(Nekodigi)

Nekodigi’s diary

学習中の気づきをまとめています。応援よろしくお願いします

【Processing】Path Tracingで3Dレンダリングエンジンを自作!

成果物

f:id:Nekodigi:20200202122001p:plain
とうとう、Processingでレンダリングエンジンを自作することができました!Rayを大量に発射して光の反射を計算しているので、リアルな質感になっています。

仕組み

Rayを使った、反射色の取得

カギになっているのがこの式です。x1が反射光の出発地点、ωが反射光の向き、xiが入射光の出発地点、ωi,1が入射光の向きとなっていて、光の通り道を遡って計算しています。
L_{o}( x_{1} ,\vec{\omega }) =L_{e}( x_{1} ,\vec{\omega }) +\frac{f( x_{1} ,\vec{\omega }_{i,1} ,\vec{\omega }) L_{i}( x_{i} ,\vec{\omega }_{i,1}) |\vec{\omega }_{i,1} \cdot \vec{n}_{1} |}{p_{\sigma }(\vec{\omega }_{i,1})}
Lは光の色、fは面の色になっています。ただしLiは初めはわからないので、関数Lを再帰的に呼び出すことによって少しづつ計算していきます。コードを見た方が実感がわくと思います。
このサイトに詳しい情報が載っているのでご覧ください。(Pσについての説明もあります)
rayspace.xyz

画面の全てのピクセルからRayを飛ばすカメラの仕組み

x,y,view_dist(定数)から座標系を変換して、Rayの向きを計算しています。
前回のサンプリングの記事で軽く触れているu,v,wマッピングの情報が参考になると思います。
nekodigi.hatenablog.com

コード

Python で作られたこちらのコードを参考にしながら作成しました。
github.com
Processingで作成することで、数百~千倍の高速化を実現しました。次は鏡面反射とGrossyの実装をしようと思います。所々Rayを変数を入れる箱として利用しているのでご注意ください。
github.com