どうも篠島です。以前に Mantra の記事を書いてMicropolygon rendering と Raytracing を使うとIlluminance Loop が使われると説明しましたが、今回はその Illuminance Loop について見ていきたいと思います。
今回のサンプルファイルです。
Illuminance_Loop.zip
Illuminance Loop はその名の通り、照明用のループで、シーン内に置かれたライトの数だけループされます。このループ内でVOPを組み合わせる事で、ライトに対してどういった処理をさせるかというのを好きなように設定することができます。
簡潔なシェーダー
いきなり Illuminance Loop の使い方だと難しいと思うのでシェーダーの作り方から簡潔に説明していきます。まずはコンスタントシェーダーを作ってみましょう。MATネットワークで Material Builder を作成して、中でVOPノードを組み合わせてシェーダーを作ります。今回はディスプレイスメントは必要ないので削除しました。そして 以下のようなネットワークを作ります。Constant VOP で色を指定して、 Cf に繋ぐだけです。これでコンスタントシェーダーができました。Cf は最終的なサーフェースの色を表します。それに透明度の Of 等が関わり合い最終的な色になります。
内積でディフューズを作る
以前に内積の記事で説明しましたが、内積を使って簡易的なディヒューズを表現することが出来ます。内積は英語で Dot Product というので、Dot VOP を使うことで内積を表せます。Constant VOP で擬似的にライトの位置を(1,1,0)に定義して、ジオメトリの法線 N との内積を求めます。後は先程の色を付けたConstant VOP と掛け合わせればディフューズの表現ができます。
基本的なIlluminance Loop の使い方
さて、上記のディフューズまで設定できたら Illuminance Loop を使う準備が出来ました。先程の例ではライトの位置を(1,1,0)にしましたが、Illuminance Loop を使うとライトの位置をシーン上から取得してくれます。上記のディヒューズをIlluminance Loop で作成する前に、まずは基本的な Illuminance Loop の使い方を見てみましょう。
Illuminance Loop を使う時は、何かしら値(色など)を計算すると思うので、その値を保持する変数を作る必要があります。ここでは Constant VOP で myColor と名付けた、(0,0,0)の値に設定したものを Illuminance Loop の next インプットに繋ぎます。すると、 Illuminance Loop 内の Subnet Input で myColor が利用可能になり、ループ毎に値を変更する事ができます。例えば、 Illuminance Loop 内で一定の値(ここでは0.25)を Add VOP で追加してみましょう。するとライトの数だけ明るさが 0.25 増加します。
本来ならば Illuminance Loop に 位置(P) と法線(N)を繋げなければならないのですが、繋がないとデフォルトで Global Variables から P と N が使われます。
ライトは下の様に配置しました。ループ毎に明るさを0.25追加するだけですが、一応法線が反対向きの部分は明るくならずに影の様になっています。単純なシェーダーですが、トゥーンの様な表現をすることができました。
Illuminance Loop 内で内積を使ったディヒューズ
今までの知識を組み合わせて、Illuminance Loop 内で内積を使って自然なライティングになるようにしましょう。Illuminance Loop 内のVOPネットワークを以下のように変更します。Illuminance Loop 外部のネットワークはそのままです。Illuminance Loop の Global Variables にはライティング用に2つの変数が増えています。ライトカラーの Cl と、シェーディングポイントからライトの位置までのベクトルを表す L が利用可能になっています。ここで、ジオメトリの法線 N と、ライトまでのベクトル L を標準化して内積を取ります。Constant で設定した色に対して、ライトカラーの Cl、そして内積の結果をかけ合わせると、ループで処理しているライトのディヒューズが計算できます。これを前回のイテレーション結果の myColor に追加して、最終的に出力、もしくは次のループに渡します。
影を作る
Illuminance Loop を使ったディヒューズは出来ましたが、まだ影が落とせていません。影を落とすには Shadow VOP を使います。先程のライトカラーの Cl を繋げた部分に、Shadow VOP を挿入します。すると他のオブジェクトに影が落とせるようになりました。
補足
ライトの色や強度、Constantで設定した色を(1,1,1)にしたりしてもレンダリング結果に反映されているのが分かるかと思います。ちなみにこのシェーダは Cf を評価しているので Micropolygon rendering と Raytracing でしか正しくレンダリングされません。
Cf を使ったシェーダーをPhysically Based Rendering でレンダリングしたい場合、Cf をBind Export に繋ぎ、Name を Ce(エミッション)に設定します。すると物理ベースのエンジンで発光体として色がレンダリングされるようになります。
興味がある方はHoudini標準で搭載されているトゥーンシェーダーの内部を見てみましょう。プライマリレイで得られた色だけを Ce として出力するようになっています。