On this page |
MantraのPBRエンジンは、VEXで記述された関数を使用してライティングを計算します。
それらの関数に対するデフォルトの実装は、$HFS/houdini/vex/Surface
にありますが、それらの実装を独自の実装に置換することができます。
pbrlighting() ¶
MantraのPBRエンジンは、ライティングを計算する際にpbrlighting()
をコールします。
まず最初にpbrlighting()
は、pbr_bounce_mask()
をコールすることで評価可能なライトパスを計算します。
pbr_bounce_mask()
は、Bounce Limitsを使用してレイツリーから余計なライトパスを除去します。
Direct Lightingが要求されると、pbrlighting()
関数は、すべての光源に対してそれぞれpbr_direct_lighting()
をコールして直接照明を計算します(以下を参照)。
また、必要であればpbrlighting()
は_pbr_pathtrace()
をコールすることで間接照明も評価します(以下参照)。
pbrlighting()
関数は、直接照明と間接照明を計算した後に、それらの照明を結合して、それらの値をLight Exportに保存します。
この後、シャドウマット評価の特別なケースが計算されます。
pbr_direct_lighting() ¶
この関数は、一見すると非常にわかりやすいように思えます: この関数は光源毎にlt->illuminate()
をコールして、その光源からの照明量を計算します。
とはいえ、lt->illuminate()
関数はOpaque(プライベート)構造体のメソッドとして実装されているので、少し内容が不透明です。
現在のところ、illuminate()
メソッドはmislighting()
シェーダ($HFS/houdini/vex/Surface/mislighting.vfl
)にハードコーディングされています。
mislighting()
シェーダは、ライト基準とサーフェス基準の両方の光源サンプリングをします。
ライト基準とサーフェス基準のサンプリングの配分は、通常ではサーフェスのBSDFを検査することで自動的に決まります。
とはいえ、vm_misbiasプロパティを使用することで、そのサンプリングを手動で調整することもできます。
ライト基準のサンプリングは、光源をサンプリングして、光線をサーフェスに送信します。
これは、光源にサンプルポイントを生成するsample_lightをコールすることで処理されます。
内部的には、sample_light()
関数は、Mantraのlight:samplershader
プロパティで定義されたシェーダを見ます。
このシェーダは、通常ではSOHO light wrangler($HH/soho/wranglers/HoudiniLightIFD.py
)で自動的に定義されます。
現在のところ、このパラメータはHoudiniパラメータで上書きすることができず、sampler_pclight()
またはsampler_geometry()
関数($HH/vex/Light
にあります)のどちらかになります。
sample_pclight()
は、ライトと紐付いているポイントクラウドのサンプリングに使用されます。
wranglerは、そのpcfile
を適切に設定します。
sampler_geometry()
はsample_geometryをコールします。
この関数は、Mantraの内部的な構造体を使用して、光源のジオメトリのポイントを評価します。
光源に関してsample_geometry()
は、大きく分けて3つのカテゴリのライト: Point Lights, Environmentライト, Distant/Sunライトに対して異なった処理がされます。
ジオメトリオブジェクトに関しては、sample_geometry()
は、レンダリングされるジオメトリを評価して、シェーディングポジションを決定します。
_pbr_pathtrace() ¶
この関数は、色々なパラメータを使用して可変的なアンチエイリアスを生成して間接照明を計算します。 これは、シェーディングされるサーフェスのBSDFの評価に基づいて光線を送信します。 この関数は、シーン内を伝搬して、照明を最終結果に累積させていきます。
シェーディングサンプル毎に、pbr_bounce_mask
(pbrlighting()
に関しては、上記参照)を使用して、有効なライトパスが計算されます。
Direct Lightingが要求されると、pbr_direct_lighting()
をコールしてそれが計算されます。
光線を送信する時、シェーダがsample_bsdfをコールして、評価するライトパスの光線情報を計算してから、traceをコールして光線を送信します。 必要に応じて、その光線は、当たった位置から伝搬します。
間接照明で光線がどのジオメトリにも当たらなかった場合、resolvemissedrayがコールされます。この関数は、どのジオメトリにも当たらなかった光線の処理に関するMantra設定を見ます。