Houdini 19.0 レンダリング

Mantraレンダリングを理解する

On this page

概要

以下のMantraの動作方法に関する情報は、色々なパラメータとそれらのパラメータがレンダラー、パフォーマンス、品質にどのように影響しているのかを理解するのに役立ちます。

レンダリングエンジン

Mantraレンダーノードの設定では、 レンダリングエンジン を選択することができます。一般的には、それをデフォルト(“Raytracing”)のままにしておくべきですが、以下にその設定について説明します。

本質的にMantraには2つのオペレーションモードがあります: 物理ベースのレイトレーシングマイクロポリゴンレンダリング

マイクロポリゴンレンダリングは、最新のレンダリングセットアップのレイトレースに大きく差を付けられてしまったパフォーマンスの悪いエンジンとなってしまいました。 マイクロポリゴンのレンダリングアルゴリズムはメモリの効率化のために設計されました。つまり、ジオメトリを細分化して、一度シェーディングして、不要な箇所が破棄されます(光線が当たる部分がメモリ内に残ります)。 今では、私達は非常に膨大なポリゴン数のモデルを扱い、豊富なメモリを搭載したマシンがあるので、レイトレーシング/PBRが通常ではもっとも効率的なメソッドになっています。

物理ベースのレンダリング/レイトレーシング (PBR)が、ほとんどのレンダリングでは デフォルトの選択 になっています。 PBRは、現実世界のライトをシミュレーションしているので理解するのが簡単です。 PBRを使えば、レンダリングの技術的なトリックや複雑なシェーダを記述することなく、シャドウ、反射、セカンダリバウンスなどが“自由に”生成することができます。また、従来のメソッドを再利用して、例えば、ライトの正面に cucoloris gobo のジオメトリを配置したり、非常に強力なライトを使ってシーンの一部の明かりを“吹き消す”といった照明効果を表現することもできます。

これはランダムなサンプリングに基づいているので、PBRでは他のエンジンよりもノイズが多い画像を作成する傾向があります。ノイズを軽減する方法に関するTipsは、PBRノイズの軽減を参照してください。

“物理ベースのレンダリング”と“レイトレーシング”の設定は、大部分が同じ結果になります。その理由は、ほとんどのロジックがシェーダ内にあり、そのロジックがどちらのモードでも同じだからです。 この2つのモード間の違いに関する予備知識は、PBR vs. レイトレーシングを参照してください。

“物理ベースのマイクロポリゴン”設定は、それを必要と分かっている人のために存在しますが、実際には役に立ちません。

以下にマイクロポリゴンレンダリングエンジンを使用した方が良い場合の理由を載せています:

  • 多くのファーや煙(ディープシャドウマップを使用)、スプライトを必要とするシーンでは、シェーダでレイトレースシャドウや他のレイトレースを使用しない場合は、効率性を上げるために マイクロポリゴンレンダリング を使ってレンダリングする場合があります。マイクロポリゴンレンダリングを使ってファーとボリュームを別々のレンダーパスとしてレンダリングし、残りのシーンをPBRを使ってレンダリングしたい場合があることを知っておいてください。

  • マイクロポリゴン設定を使ってレンダリングした既存の映像に合わせる必要のあるシーン。

Mantraのレンダリングパイプライン

タイル

Mantraは画像をタイルに分割して、個々に各タイルのレンダリングを開始します。小さいタイルのレンダリングは、Render Viewでのレスポンスが良くなりますが、全体のパフォーマンスが悪くなります。

レンダリングをMPlayRender Viewで更新する時、クリックすれば、そのタイルをMantraですぐにレンダリングを開始させることができます。これによって、見たい領域を速くプレビューすることができます。

ジオメトリの読み込み

MantraはIFDファイルに保存したジオメトリをRAMに読み込みます。現在のバケットで必要なプロシージャルジオメトリをオンデマンドで読み込むこともできます。プロシージャルジオメトリは、bgeoファイル、Alembicファイル、VEXプログラム、他のソースから生成することができます。

ディスプレイスメントやNURBS、Bezierパッチのような滑らかなサーフェスでは、Mantraは、それを refine(精密化) して、シェーディングに十分な小ささになるまでジオメトリをもっともっと小さい パッチ に分割します。

シェーディング品質 は、精密化の最大量を制御します。シェーディング品質を上げるには、画像のジオメトリの品質(テクスチャ解像度ではなく)を上げます。マイクロポリゴンのレンダリングでは、平坦なポリゴンさえも精密化して、VEXのシェーディングポイントのグリッドを生成します。

Shading Qualityプロパティは、 プリミティブ単位 で設定することができるので、特定のオブジェクトだけにその値を上げることができます。ディスプレイスメントでは、Z-Importanceの値を上げて、ビューにエッジが載っているポリゴンをさらに細分化することができます。

ディスプレイスメント

サーフェス上のマテリアルに ディスプレイスメント を追加すれば、Mantraはディスプレイスメントシェーダを実行して、現在のジオメトリの一部を変形します。

ディスプレイスメントはジオメトリの形状を変更し、元の境界ボックスから外へジオメトリを押し出すことができます。

Displacement Bound プロパティは、Mantraにサーフェスのディスプレイスメントシェーダでジオメトリを移動させたい 最大 距離を指定します。この距離以上に変位させるものがないなら、値を低く設定しておくべきです。値を低くし過ぎると、変位ジオメトリが“クリップ”されてしまいます(この場合、Mantraは警告を出力します)。ディスプレイスメント境界を大きくし過ぎると、メモリと時間がかかります。

ディスプレイスメントシェーダがジオメトリを遠いところに移動させた場合、 Re-dice Displacements を有効にすれば、元のポリゴンから一番大きく伸ばされた箇所の変位ジオメトリの品質を上げることができます。初期に試したディスプレイスメントの後にジオメトリを再測定して細分化すれば、ディスプレイスメントがジオメトリの形状をどれだけ大きく変更したのか確認することができます。

レンダリング可能かチェック

ディスプレイスメントの後、ジオメトリの一部がバケット内でまだレンダリング可能ですか? パッチがまだレンダリング可能であればOpacityシェーダ に取りかかってください。 そうでないなら戻って 変位ジオメトリを再度精密化してください。

Opacityシェーディング

サーフェスマテリアルが 不透明度 (Of)を出力する場合、Mantraはサーフェスシェーダを実行(Ofの計算に最適化されます)して、現在のパッチの不透明度/透明度を取得します。

Mantraはカメラからピクセル毎にある程度の数の光線をサーフェスに送信します。各光線では、サーフェスに当たる毎に(Opacity Limitの値まで)、サーフェスシェーダを実行して、不透明度Ofを記録します。不透明なサーフェスでは、光線がサーフェスにあたると、完全な不透明度を記録します。透明なサーフェスとボリュームでは、光線は完全な不透明またはOpacity Limitに達するまで続きます。不透明度またはOpacity Limitを使ってシェーディングの量を制限することを、 オクルージョンカリング と呼びます。記録された不透明度の情報は、 Stochastic Transparency (確率的な透明度)を使ってフルサーフェスシェーディングを起こす箇所を決定します。

  • 精密化と変位は、オクルージョンカリングの 前に 起きるので、隠れたジオメトリで起きる可能性があることに注意してください。しかし、Mantraは完全に隠れたジオメトリで動作することを回避しようとします。

  • このステップでは、Mantraはコンパイルして、不透明度(Of)の計算で必要なコードのみを実行します。このステップがもっと速く動くように、このコードパス内で最低限の動作をするようにシェーダプログラムを構築するべきです。不透明度がIlluminance Loopなどのカラー計算に関係する動作に依存することだけは しないで ください!

  • vm_samples

  • vm_opacitylimit

  • vm_transparent

レイトレーシング/PBR

ピクセル毎にある程度の量の光線( プライマリサンプル )を送信します。各光線が当たる箇所で、サーフェスシェーダを実行(カラーCf用に最適化)し、サンプルをブレンドしてピクセルカラーを生成します。

画像の忠実度を上げるための主なメソッドは、ピクセルサンプルの数を増やすことです。ピクセルサンプルの数を増やせば、より詳細な結果になり、エッジの解像度が上がりますが、レンダリング時間が増えます。

(あまりいい理由はありませんが、ピクセルサンプルのパラメータは、2つのパラメータで表現します。例えば、3 × 3 = 9 ピクセルサンプル。2つの値を個別に変更する時があるのは、アナモルフィック・フィルムフォーマットにレンダリングする場合のみです。)

変位のあるサーフェスや非常に周波数の高いテクスチャ付きのサーフェスでは、ピクセルサンプルを最大で9 × 9まで上げる場合があります。それ以外は、丁度良い限界は5 × 5までです。

サンプリングは、レンダリングアルゴリズムに強く依存します。 “古い形式”のレンダーを、光源に対して固定近似と分布なしのレイトレーシングを使用してレンダリングした時、 サンプリングは、主にジオメトリのエッジのアンチエイリアス(またはテクスチャフィルタリング)に関係します。 モーションブラーや被写界深度に関しては、サンプリングを上げなければなりません。

PBRと他の洗練されたライティングに関しては、今ではサンプリングをもっと多く使用して、照明関数を収束させます。 そのため、サンプリングをより高く設定することが多いです。

ピクセルに対してサンプルをシェーディングした後は、その結果の間で Variance を計算します。

Varianceが許容する ノイズレベル を越えると、ピクセルを Max Ray Samples の回数まで再サンプリングします。

レンダリング画像に“直接サンプル”と“間接サンプル”を追加画像平面としてエクスポートすることができます。これらの平面は、このステップがピクセル毎に繰り返した回数を符号化します。これは画像のレンダリングを遅くさせている領域を特定するのに役に立ちます。

マイクロポリゴンレンダリング

ポリゴンを約ピクセルサイズの マイクロポリゴン に細分化します。 Shading Quality を上げると、ピクセル毎のマイクロポリゴンの数が増えます(Shading Qualityが1だと、1ピクセルにつき約1マイクロポリゴンを意味します。2だと、1ピクセルにつき約4マイクロポリゴンを意味します)。

頂点毎に サーフェスシェーダを実行(カラーCf用に最適化)し、頂点間をブレンドしてサーフェスカラーを生成します。これは、ハイポリゴンモデルでは頂点数が多すぎて非常に効率が悪いです。

PBRシェーディング

  • PBR(物理ベースのレンダリング)とはライティング、シャドウ、シェーディングの正確な物理シミュレーションをサポートしたシェーディングプロセスです。

    • PBRは自動的に、反射と屈折のレイトレース、光沢のある反射と屈折、光源の反射を有効にします。

    • PBRはたくさんのタイプのシーン、例えば、環境マップエリアライトからの柔らかいシャドウ、たくさんの間接照明(閉ざされた部屋での壁からの光の反射)、光沢のある反射と屈折、コースティクス(集光模様)が必要なシーンをレンダリングするのに役に立ちます。

    • MantraノードがPBRを使えるようにするセットアップ方法は、PBRのセットアップを参照してください。

  • PBRはシェーディングプロセスであり、Houdiniのサンプリングメソッド(マイクロポリゴンサンプリング、レイトレース)のどれかを扱うことができます。実際にMantraノードで Properties タブの Render サブタブの Rendering Engine パラメータからMicropolygon PBR(“マイクロポリゴンの物理ベースのレンダリング”)やRaytracing PBR(“物理ベースのレンダリング”)を選択することができます。

  • 従来のシェーディングでは、シェーダプログラムが副光線の数と分散をコントロールするのに対し、PBRでは、副光線はサーフェスの BSDF (Bidirectional Scattering Distribution Function)で制御します。

    • PBRでは、サーフェスシェーダがサーフェスのBSDFの計算の役割を担っています。従来のサーフェスシェーダがCf(サーフェスカラー)とOf(サーフェスの不透明度)のカラー値を設定するのに対し、PBRシェーダはFbsdfの値に設定します(bsdfはHoudini9で導入された新しいVEXデータタイプです)。

    • BSDFは入射角と反射角を受け取り、光が“跳ね返る”時の反射光の大きさを返します。

    • Houdiniではbsdfの値を作成するためのVOPやVEX関数がいくつか用意されています。例えば、ashikhmin()blinn()cone()isotropic()phonglobe()diffuse()specular()phong()が含まれています(完全なリストは、vcc -X surface | grep bsdfを使ってください)。

    • bsdfの値を加算して、ベクトルや浮動小数点でスケールすることができます。BSDFとカラーベクトルを乗算すると、サーフェスはそのカラーを反射します。

      // ディフューズ(半球状の)BSDFとテクスチャカラーを乗算します。
      // Phong BSDFと0.5を乗算して、2つのBSDFを加算します。
      F = texture(map) * diffuse() + 0.5 * phong(20);
      
      // 赤いディフューズサーフェス
      F = diffuse() * {1.0, 0, 0}
      
  • 各シェーディングサンプルのために

    • Mantraはシーンのライトすべてから 直接照明 のレベルを計算します。これは、1つのシャドウの光線をシーンのすべてのライトに向かって放射する必要があります。光源の反射を考慮すると、さらに光線が必要になります。

    • Mantraは人間の目線角度とBSDFに基づいた ランダムな方向 を受け取り、 間接照明 の光線を放射します。間接照明がサーフェスに当たると、Mantraはそのシェーダを実行して、現在のサーフェスのカラーに関係している箇所をサンプリングします。

      間接照明サーフェスのシェーダを実行すると、そのシェーダ用に副光線を放射し、それらの光線がサーフェスに当たり、またそこからシェーダが実行されてもっと光線が放射されます。このプロセスが永遠に続かないようにするために、Mantraでは反射の制限を設定( Properties タブの PBR サブタブ)することで、跳ね返りの数を制限することができます。

    • BSDFの各シェーディングサンプルで、Mantraは次の追加光線のみを生成します。光源の方向で直接照明の光線、光源の反射用に直接照明の光線、BSDFと通じて選択した方向に間接照明の光線。

    • 目線からの入射方向と直接・間接照明光線のBSDFの出力が最終的なサーフェスのカラーです。

    • 各サンプルは2,3の光線のみをトレースするので、異なるサンプルが完全に異なるカラーを計算する場合があります。このことから、PBRでは通常は1ピクセルに対して16×16、32×32、それ以上のサンプル( Pixel Samples パラメータ)を使います。サンプルをたくさん蓄積すると、2,3の光線だけをサンプリングした時の違いを平均化します。

  • 従来のシェーディングパイプラインとPBRパイプラインのどちらでも機能する単一のサーフェスシェーダを作成することができます。すべきことは、Cf/OfさらにFを設定/接続することです。例えば、VEXでは、以下のようになります:

    surface simple()
    {
       vector nn = nomalize(frontface(N, I));
       Cf = diffuse(nn);
       F = diffuse();
    }
    

    レンダリングエンジンは適切な変数を計算するのに必要なコードを実行するだけです。つまり、従来のシェーディングパイプラインでは、レンダラーは上記のコードの3~4行目を実行するのに対し、PBRパイプラインでは、5行目を実行するだけです。また、これはシェーダがFを計算するようにセットアップしていない状態でPBRレンダリングに切り替えた場合、従来のシェーディングコードが実行されないのでシェーダは黒を出力します。

非PBRシェーディング

  • シェーダとはレンダラーがいろいろなタイプのレンダリングの仕様(例えば、サーフェスのカラー)を実行できるプログラムのことです。MantraのシェーダはVEX言語でコードを記述したり、VOPノードネットワークで構築することができます。このネットワークは自動的にHoudiniでVEXに変換されます。

  • Mantraはディスプレイスメント、サーフェス、ライト、シャドウ、フォグの5つのタイプのシェーダを実行します。

    • ディスプレイスメントシェーダ が最初に実行されます。ディスプレイスメントシェーダはマイクロポリゴンのコーナーを移動させることができます。ディスプレイスメントシェーダはグローバル変数P(頂点ポジション)とN(頂点法線、ポジションを変更すると通常は法線が変わります)を変更することで機能します。

      ディスプレイスメントシェーダで重要な要素は、 ディスプレイスメント境界 の設定です。マイクロポリゴンレンダリングは一度にシーンの一部の領域を見るだけなので、もし変位がMantraが見ている領域の外へコーナーを動かすならば、マイクロポリゴンが切り取られて、穴ができます。ディスプレイスメント境界の設定では、Mantraにシーンで必要な 最大 変位距離(Houdini単位)を指定することができます。Mantraはこの数字を使ってメモリに保持しておくジオメトリの数を増やします。その数をシーンでの最大変位まで上げますがそれより高くしません。

      ディスプレイスメントシェーダは Export パラメータを使って頂点に値を記録することができます。例えば、サーフェスシェーダで使用するために、変位前のポジションと法線、変位距離などを記録することができます。サーフェスシェーダは、記録した値をdimport()VEX関数またはImport Displacement Variable VOPを使うことで取り出すことができます。

    • サーフェスシェーダ はディスプレイスメントシェーダの次に実行されます。サーフェスシェーダは、サンプリングした位置でサーフェスのカラーを計算する役割を担っています。

      サーフェスシェーダは次のグローバル変数を設定することで機能します:

      Cf

      サーフェスのカラー。

      Of

      サーフェスの不透明度。

      Af

      ピクセルの透明度(アルファ)。

      サーフェスの不透明度とピクセルの透明度は似ているように思えますが、実は違います。これらの変数はそれぞれ異なるエフェクトで利用します。Of(サーフェスの不透明度)はシェーディングするサーフェスの裏側にあるサーフェスの可視性に影響があります。Af(ピクセルの透明度)はレンダリングした画像のピクセルの透明度に影響があります。CfOfAfの変数の出力値はサンプルに記録されます。

    • サーフェスシェーダは、色々なVEX関数やVOPノードを使って 副光線 を放射してレイトレースを行なうことができます。これらの光線はそれぞれサンプリングとシェーディングが行われて、シェーダ側に値を返します。

      例えば、マテリアルが反射するなら、シェーダは反射光線(ぼやけた反射をするには複数の反射光線)を放射します。マテリアルが屈折するなら、屈折光線を放射します。より写実的なライティングをするならば、 Occlusion (オクルージョン)や Irradiance (グローバルイルミネーション)の光線を放射します。

      “従来の”(非PBR)シェーディングでは、サーフェスシェーダ(またはライトシェーダ)が、放射する副光線の数と光線の分散を決めます。このシェーダは、ライトが何百ものアンビエントオクルージョンの光線を計算する箇所やライトが最終的なカラーとまったく関係しないサーフェス(例えば、高い反射率のマテリアル)に対しては非効率になる場合があります。このような状況では、PBRシェーディングでハンドリングしたほうがよいです。

    • サーフェスシェーダは Illuminance Loop をコールすると ライトとシャドウのシェーダ を実行することができます。Illuminance Loopは各ライトで ライトシェーダ をコールしながら繰り返します。ライトシェーダはループの内側でCl(ライトのカラー)変数を設定します。ループ内のコードは、shadow(Cl)をコールします。これはライトの シャドウシェーダ を使って変数を変更します。変数L(サーフェスからライトまでの方向)もループ内で利用可能です。

      もちろん、ループ内のコードは、これらの値を無視したり別の方法で使う場合があります。例えば、ここに仮のVEXコードがあります。これはシャドウシェーダを使ってサーフェスがシャドウの中にあるのかどうか判断することができます。そして、シャドウが落ちていない領域すべてを青にして、シャドウの落ちている領域を赤にします。

      illuminance(P) {
          Cx = Cl
          shadow(Cl)
          if (Cl == Cx) {
              Cf = blue
          } else {
              Cf = red
          }
      }
      
    • フォグシェーダ があれば、それはサーフェスシェーディングの後に実行されます。フォグシェーダは、すべてのサーフェスの最終的なCf(サーフェスカラー)とOf(サーフェスの不透明度)を修正することができます。オブジェクトレベルでAtmosphereオブジェクトを作成して、そのオブジェクトのパラメータにシェーダを指定すればシーンにフォグシェーダを追加することができます。一般的には、ボリュームをレンダリングするなら、フォグシェーダを使うよりも大気のエフェクトをシミュレーションしたほうがより正確で柔軟性があります。

    • シェーダに渡す変数の引数は、シェーダが任意のアトリビュートにアクセスしながら、シェーディングしたジオメトリと同じ名前の任意のアトリビュートで上書きされます。また、色々な便利なグローバル変数があります。例えば、P変数にはシェーディングされるポイントの座標が格納されます。dPdsdPdtグローバル変数には現在のポジション(P)とその近接のマイクロポリゴン頂点のポジションとのSとT方向別の差分が格納されています。これらのベクトルを使ってマイクロポリゴンのエッジのおおよその長さを取得することができます。シェーディングコンテキストのグローバル変数の一覧を参照してください。

シェーディングをセットアップする方法は、マテリアルとシェーダの使い方を参照してください。

ボリュームのサンプリングとシェーディング

  • Mantraはマイクロポリゴンと同様にボリュームに対してサンプリングとシェーディングをします。マイクロポリゴンレンダリングはサーフェスを四角のマイクロポリゴン(それぞれのサイズはdPdsdPdtで測定します)に細分化するのに対して、マイクロボリュームレンダリングは、プリミティブボリュームをマイクロボリュームに細分化します。

    • Mantraはすべての寸法で対称的に、マイクロボリュームがmicropolygon area x depthに比例した体積になるように細分化します。

    • マイクロボリュームの高さと幅は、まさにマイクロポリゴンと同様に シェーディング品質 から設定されます。Z深度は Volume Quality の設定によってコントロールします。

    • dPdzグローバル変数には現在のマイクロボリュームのZ深度の差分が含まれています。

  • マイクロボリュームのシェーディングはサーフェスのシェーディングと同じシェーディングパイプラインを使います。サーフェスに使用する標準タイプのシェーダすべてがボリュームでも使うことができます。ディスプレイスメントシェーダはマイクロボリュームを動かして、ボリュームに詳細を簡単に加えることができます。

    • ボリュームを扱うサーフェスシェーダやディスプレイスメントシェーダを書く方法 はサーフェスの場合と異なります。

    • サーフェスシェーダでは、一般的にはシェーディングするボリュームステップ(dPdz)を考慮してOf出力をスケールします。

    • ディスプレイスメントシェーダでは、法線方向に変位するとボリュームのグラデーションに沿って変位しますが、通常あなたがやりたい事は法線とは関係のない3D変位を実行することです。

  • ジオメトリアトリビュートは標準のサーフェスシェーダと同じくシェーダで利用可能です。さらに、レンダリングされるマイクロボリュームではdensity変数はボリューム密度(浮動小数点としてシェーダに渡されます)を意味し、グローバル変数Nはグラデーションベクトル(密度で一番大きく変化している方向)を意味します。

    Nameサーフェスノードを使ってボリュームプリミティブに名前を付けると、そのノードはボリュームの名前(例えば、densityvel.xtemperatureなど)を特別なnameアトリビュートに記録します。シェーダ上にdensityveltemperatureなどの名前のパラメータを作成することができます。それらのパラメータは自動的にそのパラメータの名前のボリュームの値と紐付けられます。例えば、これをボリュームのtemperatureのサーフェスシェーダのカラーのベースにします。

  • ボリュームはサーフェスと同じパイプラインを使ってレンダリングするので、サーフェスと同じ機能が使えます。例えば、不透明度カリング、インスタンス化、シャドウマップ、被写界深度、モーションブラーが使えます。一番のメリットは、サーフェスと同じく半透明のマイクロボリュームを合成できるので、ボリュームとサーフェスを正確に合成することができます。これはサーフェスに対してサーフェスシェーディングと合成を後処理として実行するフォグシェーダとは逆です。つまり、半透明サーフェスは適切にフォグと合成しません。

  • ボリュームは色々な方法で生成可能です:

    • ダイナミクスやIso Offsetサーフェスノードを使ってHoudiniのボリュームプリミティブを生成します。

      複数のHoudiniプリミティブを単一のレンダリングされるボリュームプリミティブにマッピングすることができます。各Houdiniのプリミティブは別々のVEX変数で表現されます。これによってボリュームの別々の“チャンネル”に別々の解像度を適用することができます。例えば、ボリュームに高解像度の“density”チャンネルと低解像度の“color”チャンネルを持たせることが可能です。

    • 3Dテクスチャファイルのi3dを使います。i3dファイルを使うと仮想メモリを使用することができます。i3dファイルの各チャンネルは別々のVEX変数で表現されます。

    • メタボールをボリュームとしてレンダリングすることができます(メタボールはdensityフィールドを定義しているので、自然とボリュームにマッピングされます)。メタボールプリミティブのPointアトリビュートはシェーダのVEX変数にマッピングします。

ボリュームのセットアップの方法は、ボリュームレンダリングの使い方を参照してください。

フィルタリング

  • Mantraがシェーダを実行して各サンプルで値を取得した後は、各ピクセルのサンプルの影響度から総計してピクセルカラーを取得します。 Pixel Filter では各ピクセルが最終的な値にどれだけ影響を与えるのか制御します。デフォルトではマイクロポリゴンの中心に近いサンプルほど影響度が高いです。 Filter Width は、ピクセルサンプルが考慮される領域の半径を設定します。 Filter Width を大きくするとアンチエイリアス/ブラーが大きくなります。これは Properties タブの Output サブタブの Pixel Filter パラメータで設定します。デフォルトは2×2 Gaussian Filterです。

  • レンダラーが一度ピクセルカラーを総計すると、浮動小数点カラーを指定したカラーフォーマット(例えば8ビットや16ビット整数)に数値化して、最終画像のC(カラー)平面にあるピクセルの最終的な値を取得します。

  • レンダラーはピクセルの値を出力デバイスドライバに送ります。例えば、TIFFやJPEG、ipデバイスのようなファイルフォーマットドライバはMplayで画像を表示します。

PBR vs. レイトレーシング

レイトレーシングエンジン(RT)とPBRレンダリングエンジン(PBR)は非常に似た結果を生成しますが、それらのエンジンは、内部的には若干異なった動作をしています。

主な違いは、VEXシェーダの評価方法です。 Of(不透明度)変数は別として、レイトレーシングエンジンはCf変数のみを評価します。 その一方で、PBRエンジンはCfAfの計算に必要な計算をすべて無視し、F(BSDF)変数のみを評価します。

以下の単純なシェーダを例にすると:

surface
clay(vector diff=1; float rough=.1; vector Cd=1)
{
    vector    nml;

    nml = frontface(normalize(N), I);
    Cf  = diffuse(nml, -normalize(I), rough);
    Cf *= Cd * diff;
    F = (Cd * diff) * diffuse();
}

レイトレーシングエンジンは、以下のようにシェーダを見ます:

surface
clay(vector diff=1; float rough=.1; vector Cd=1)
{
    vector    nml;

    nml = frontface(normalize(N), I);
    Cf  = diffuse(nml, -normalize(I), rough);
    Cf *= Cd * diff;
}

PBRエンジンは、以下のようにシェーダを見ます:

surface
clay(vector diff=1; float rough=.1; vector Cd=1)
{
    F = (Cd * diff) * diffuse();
}

レイトレーシングエンジンはCf変数を受け取り、ピクセルサンプルにその結果を格納します。 PBRエンジンに関しては、すべてのシェーディングがpathtracerシェーダ内で起こります。 これは、フォグ/大気のシェーダと同様で、サーフェスシェーダの結果(PBRの場合はF変数)が入力に渡され、その結果を使用してCf変数を計算します。 これにより、Mantraは、同じ方法ですべて動作するいくつかの異なるパストレーサー(photon tracer, light tracer, path tracerなど)を持つことができます。 これらのパストレーサーは、サーフェスシェーダで計算されたF変数を受け取り、その変数を使用して、その結果となるカラーを計算します。

とはいえ、この2つのレンダリングエンジンは、ほぼ同じ画像をレンダリングすることが多いです。 なぜなら、両方のエンジンはpbrlighting()シェーダを利用することが多いからです。 このシェーダは、BSDF入力を受け取り、その結果となるカラーを計算します。

このことは、Houdiniに最初から入っているplastic.vflシェーダで確認することができます。このシェーダは、以下のようなものを見ます:

import pbrlighting;
surface
plastic(
    vector diff=0.8;
    vector spec=0.2;
    float rough=0.2;
    vector Cd=1;
    ...
    export vector direct=0;
    export vector indirect=0;
    export vector indirect_emission=0;
    ...
)
{
    float    exponent = 1.0 / rough;

    F = (Cd * diff) * diffuse() + spec * phong(exponent);

    pbrlighting(
            "direct", direct,
            "indirect", indirect,
            "indirect_emission", indirect_emission,
            ...
            "inF", F);

    Cf = direct + indirect + indirect_emission;
}

レイトレーシングエンジンでは、このシェーダは、pbrlighting()関数で必要となるBSDF Fを計算します。 そのカラー =Cf= は、pbrlighting()関数を実行することで計算されます。

PBRに関しては、Cfの計算に必要な計算すべてが完全に無視されます。つまり、PBRのシェーダは、以下のようにサーフェスシェーダを見ます:

import pbrlighting;
surface
plastic(
    vector diff=0.8;
    vector spec=0.2;
    float rough=0.2;
    vector Cd=1;
    ...
    export vector direct=0;
    export vector indirect=0;
    export vector indirect_emission=0;
    ...
)
{
    float    exponent = 1.0 / rough;

    F = (Cd * diff) * diffuse() + spec * phong(exponent);
}

PBRエンジンは、pathtracerシェーダをコールしてFを評価します。 デフォルトのpathtracer()関数は、単にpbrlighting()をコールしているだけで、最終カラーに非常に近いシェーディング結果になります。

他にも、正確にエクスポート変数を評価する時期などの若干の違いがありますが、主な違いは、サーフェスシェーダを評価する方法です。

VOPを使用して構築されたほとんどのシェーダは、Compute Lighting VOPを使用しています。これはpbrlighting()をコールします。 例えば、Mantra SurfaceとPrincipled ShaderのどちらもCompute Lightingを使用しているので、どちらのエンジンを使用しても、ほぼ同じ結果を生成するはずです。

レンダリング

Mantraユーザガイド

基本

ライティング

次のステップ

導師レベル

他のレンダラー