ねこでじ(Nekodigi)

Nekodigi’s diary

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

【Processing】3DレンダリングエンジンにGlossyシェーダーと鏡面反射を実装する

成果物

f:id:Nekodigi:20200202170641j:plain
以前の画像と比べて、光を反射する物体が二種類増えています。一つは鏡に似ている鏡面反射で、もう一つは、粗さ?を変更できるGlossyシェーダーです。(金属に近い感じです)

仕組み

レンダリングエンジンの基本的な仕組みについてはこちらをご覧ください。
nekodigi.hatenablog.com

鏡面反射

反射の式は普通こちらになりますが、
r = d - 2 (d \cdot n) n
今回は、反射角d、法線nからから入射角rを求めるので、このような式を使います。
r = - d + 2 (d \cdot n) n
光は拡散しないので、関数fは単純に面の色を返します。

Glossyシェーダー

こちらの画像にあるように、GlossyシェーダーはDiffuseと鏡面反射の中間のような反射をしています。
https://www.scratchapixel.com/images/upload/shading-intro2/shad2-lobe1.png?
計算式も鏡面反射とDiffuseの中間のような形になっていて、鏡面反射の式で求めた入射角を中心に、Diffuseで使われていた半球上の点のサンプリングを行っています。

コード

今回もPath Tracingリポジトリの中に追加しました。
mirror_glossyと書いてあるのが今回のコードです。
github.com