レイヤ シェーダ

レイヤ化シェーダ

この図は、レイヤ化シェーダを単純に接続できる/すべき方法を示しています。レイヤ化ネットワークの基本レイアウト。

これらのシェーダにはレイアウトにおいて高い柔軟性があり、そのコンポーネントのインスピレーションとして NVIDIA ARCS の MDL を使用しています。この図からは分かること:

この図は、ネットワークに別の結合シェーダを挿入する方法を説明しています。2 段階のレイヤ化ネットワークのレイアウト。

予備の出力パスはライト パス エクスプレッション(LPE)の項を使って指定することができます。これらの LPE の一部がレイヤ化シェーダでサポートされています。カメラから名前で指定するだけで、自動的にユーザ フレームバッファに書き込むことができます。グローバル文字列オプションを使用して、どの LPE が任意に名前をつけたユーザ フレームバッファに行くことができるかを指定することもできます。最も一般的なシェーディング サブセット出力(『拡散」など)を表すことができ、すべての分割された出力を「結果」ビューティ出力に直線的に足し合わせる必要があります。したがって、これらの 加算パスはそのまま合成できます。サポートされている現在のパスは、「複数の LPE パス」に詳しく説明されているパスを含みます。

グローバル設定

シェーダは、いくつかのグローバル設定を文字列オプションとして受け入れ、一部はテスト用、一部は機能の微調整用です。

レイヤ シェーダのグローバル文字列オプション
"light relative scale" シェーダは、BSDF のシェーディングと一致するシェーディングで "light relative scale" をリッスンします。つまり、"light relative scale" に基づいてライトの解釈を調整します。mia_material シェーディングと一致するように、"light relative scale" は 1/PI である必要があります。
"mila ray cutoff" これはカットオフ重要度で、このポイントからレイが無視されます。グローバル設定であることを除き、mia_materialrefr_cutoff と似ています。既定値は 0.01 です。つまり、効果が 1 % 未満のレイから拒否されます。 "mila clamp output" オンまたはオフです。mila_material で出力値のクランプを有効/無効にします。既定はオフです。 "mila clamp level" 上記のクランプ出力が有効になっている場合、大まかに輝度として、クランプするレベルにこの値を使用します。既定値は 1.0 です。出力が 1 を超えることは認められているが、ダイナミック レンジの減衰して最適化する必要がある場合、1 ~ 5 の間の値を試してください。これは、シーンとパイプラインの要件にも依存するためです。 "mila quality" レイヤ化ライブラリ内のその後に続く他のすべての品質設定に対する品質乗数。この既定値は 1.0 です。 "mila glossy quality" 光沢反射または光沢透過でのサンプル数をコントロールします。この既定値は 1.0 です。これは、公称のサンプル数を使用し、光沢シェーダでの粗さに加え、トレース深度と重要度によってもコントロールされます。 "mila scatter quality" レイの当たるポイントの付近をサンプリングするスキャッタのサンプル数をコントロールします。既定値は 1.0 です。重要度、トレース深度などに関するその他のすべての要素が高い場合、公称では約 64 サンプルです。 "mila diffuse quality" 間接拡散詳細が使用されているときに、間接拡散反射のサンプル数をコントロールします。この既定値は 1.0 です。 "mila diffuse detail" オンまたはオフです。間接拡散詳細モードを有効にします。mila_diffuse_reflection によるシェーディング専用の AO カラー ブリード/FG フォースと同様です。 "mila diffuse detail distance" 詳細に使用される距離です。この距離を超えると、通常の間接拡散コントロール(GI/FG)が使用されます。 "LPE: XXX" 非推奨になりました。現在は、フレームバッファ LPE アトリビュートを使用します。どのユーザ フレームバッファにライト パス エクスプレッション XXX を書き込むかを定義します。現在サポートされているパスの詳細は、ここをご覧ください。文字列オプションの先頭は必ず「LPE: 」にしてください。LPE の指定の前に、コロンと半角スペースを挿入する必要があります。一般的なパス名に基づいた文字列オプションの例を次に示します。
  • "LPE: L<RD>E" "diffuse"
  • "LPE: L.+&ltRD>E" "indirect"
既定のユーザバッファの名称は、上記のリンク先に説明されている表から、内容が分かりやすい名前になっています。
"mila share lights" デバッグやパフォーマンスの比較のために使用することができます。オフの場合、ライトの共有は無効になり、すべてのレイヤ シェーダ(コンポーネント シェーダ)がそれぞれのライト ループを実行します。既定はオンです。
"mila propagate importance" デバッグやパフォーマンスの比較のために使用することができます。オフに設定すると、サブシェーダおよびサブレイへの重要度の伝播が無効になるため、この最適化の影響を判断することができます。既定はオンです。
"mila separate interactions" デバッグやパフォーマンス比較に使用されます。最初にレイが当たった後に、コンポーネントの確率(その計算された最終ウェイト)に基づいて二次レイをトレースするかどうかを決定します。既定はオンです。



ルート レイヤ化シェーダ mila_material

このシェーダは、シェード ツリーのルート シェーダである必要があります(そうでない場合、透明度とシャドウがまったく機能しなくなります)。また、必要に応じてフレーム バッファに書き込むことができます。

 declare shader "mila_material" (
         # Shader to call
         shader "shader",
         #
         boolean "thin_walled",
         shader  "backface_shader",
         #
         scalar "visibility" default 1.0,
         #
         # Debug/test tool: Show a given fb as beauty
         #   1 = ALL, 2 = transparency, 3 = absorb, 4 = LrDE, 5 = LrGE etc.
         integer "show_framebuffer" default 0,
         #
         # overall bump vector for whole material
         vector  "bump",
         #
         # Name of framebuffers to output to
         # If empty, nothing is written

         array struct "extra_color" {
             color   "color",
             string  "color_fb",
             boolean "color_comp"
         },
         array struct "extra_vector" {
             vector  "vector",
             string  "vector_fb",
             boolean "vector_comp"
         },
         array struct "extra_scalar" {
             scalar  "scalar",
             string  "scalar_fb",
             boolean "scalar_comp"
         } 
      )
      apply material, shadow, photon
      version 4
 end declare

ルート シェーダ mila_material は、"shader" スロットへの入力として単一の mila_layer または mila_mix必要とし、およびシェーダ ツリーはそこから広がっていきます。

また、次に示す追加の入力もあります。

thin_walled
ジオメトリをソリッド オブジェクトの入口と出口のサーフェス、またはマテリアルの非常に薄いシェルとして解釈する場合に定義します。これは屈折のインデックスをシェーダがどのように使用して解釈するかに主に影響します。たとえば、ガラスの球を作成するには thin_walled はオフを使用しますが、同じジオメトリを使用してせっけんの泡を作成するには thin_walled をオンにします。オンにすると、このシェーダ ネットワーク内に接続されている mila_layer で、すべての辺がフレネルの計算で外側とみなされます。
backface_shader
必要に応じて、mila_material は、単一の mila_layer または mila_mix を "backface_shader" スロットの入力として扱うこともできます。内部のレイ インタラクションには、シェーダなどがここにつながっている場合はそれが使用され、そうでなければ "shader" スロットにあるサーフェス シェーダが使用されます。これは、異なるシェーディングのレイヤがいずれかの側に存在する(たとえば一方は転写で他方はそうでない)薄壁マテリアルに便利です。
write_framebuffers
オンの場合、シェーダは指定したフレーム バッファに書き込むようになります。
show_framebuffer
デバッグ ツールです。テストに使用されます。0 (ゼロ)に設定すると、何も実行されません。1 に設定すると、最初のフレーム バッファ(間接)がビューティ出力にコピーされ、レンダーに直接表示されるようになります。2 に設定すると、拡散フレーム バッファがコピーされ、以降も同様となります。
bump
ゼロ以外の値のときに、マテリアル全体に対する全体のバンプとして使用する法線になるベクトルです。すなわち、すべての要素コンポーネントによって使用されます。法線マッピングにもバンプ マッピングにも使用することができ、それはバンプ シェーダの機能によります。
extra_color
出力する追加のカラーの配列です。配列の各項目には、書き込むカラーのための入力 color、カラーを書き込むフレーム バッファの名前 color_fb、透明度を後の値で合成するかどうかを定義する color_comp があります。extra_color の入力は、このマテリアルを使用するオブジェクトに対してマットを指定するときに役立てることができます。
extra_vector
ベクトルの値に作用すること以外は extra_color と同様に機能します。これにより、フレームバッファに書き込む値を追加してカスタマイズすることができます。
extra_scalar
スカラー値であること以外は extra_color と同様に機能します。これにより、カスタマイズを目的としてフレーム バッファにその他の追加の値を書き込むことができます。

結合シェーダ mila_layer and mila_mix

シェーダの mila_layer および mila_mix は、レイヤ化と混合の「ハード リフト」をすべて行います。これらは、次の条件でのみ使用してください。すなわち、

このシェーダは、レイヤ化シェーダ システムの外側では正しく機能せず、他の場所で使用しようとした場合はクラッシュすることもあります。

これらのシェーダは、レイヤとして入力された結合シェーダ コンポーネントを表す単一のカラー出力を返します。mila_layer シェーダのインタフェースは、初期パラメータがあり、その後に構造体の配列(下記参照)がレイヤごとに 1 ずつあります。一部の DCC アプリケーションで使用する場合、「構造体の配列」というタイプのパラメータは、ユーザ インタフェースでサポートされないため、注意してください。この問題を解決するために、レイヤの固定セットが使用できるフェノメナが用意されています。

declare shader 
        color "mila_layer" (

        array struct "layers" {
            shader  "shader",
            boolean "on"                     default on,
            scalar  "weight"                 default 1.0,     #: min 0 softmax 1
            color   "weight_tint"            default 1 1 1 1,
            boolean "use_directional_weight" default off,
            integer "directional_weight_mode" default 0,       #: enum "fresnel:custom"
            scalar  "ior"                    default 1.2,
            scalar  "normal_reflectivity"    default 0.05,
            scalar  "grazing_reflectivity"   default 1.0,
            scalar  "exponent"               default 5.0,
            vector  "bump"
        }
     )
     version 5
end declare

mila_layer シェーダは合成システムで「over」操作に似たウェイト シェーダを使用します。ここでのウェイトは、最上位のレイヤの、その下に積み重ねられたすべてのレイヤに対するパーセントで表します。言い換えると、最初(一番上)のコンポーネントが指定のウェイトそのもので使用され、その下にあるすべてのレイヤが「1 からウェイトを引いた値」によって重み付けされます。これは、指定が行われた順番で上からレイヤ全体に再帰的に適用されます。この動作は、mia_material のビルトインのエネルギー保存と似ています。入力パラメータは次のとおりです。

layers
次の内容を含む構造の配列です。配列の項目はレイヤの上から下へ論理的に並べられています。構造体のメンバーは次のとおりです。
shader
パラメータは、そのレイヤのシェーダです。これは必ずmila_* シェーダのうちの 1 つか、他の mila_layer である必要があります。その他のシェーダを使用すると確実にクラッシュします。
on
オン/オフを切り替える単純なブール スイッチです。これは、レイヤのウェイトを 0 (ゼロ)に設定することと同様ですが、UI でテストするときに簡単に使用できます。
weight_tint
カラーとしてのレイヤ ウェイトです。以下のウェイトと組み合わされます。
weight
レイヤのスカラーのウェイトです。上の weight_tint カラーは、この値によってウェイト付けされます。ただし、mila_layer に関して、これが最終的なウェイトでない可能性があります。それは方向依存パラメータ(下記参照)に依存する可能性があるためです。
use_directional_weight
オンの場合、次のモードによってコントロールされるように、方向依存ウェイトの係数でウェイトを乗算します。
directional_weight_mode
方向に対するウェイトの依存性を計算する方法を定義します。
0
「フレネル」を意味します。ウェイトは、以下に供給された ior を使用した方向依存のフレネル方程式によって乗算されます。
1
「カスタム カーブ」を意味し、mia_material の反射と同様、normal_reflectivity (0 度)、grazing_reflectivity (90 度)、および exponent (カーブ シェイプ)の各パラメータで方向依存の重み付けの動作を定義しています。
bump
ゼロ以外の場合、このレイヤのシェーディングに使用される法線となるベクトルです。
declare shader 
     color "mila_mix" (
        boolean "clamp"                     default off,

        array struct "components" {
            shader  "shader",
            boolean "on"                    default on,
            scalar  "weight"                default 1.0,     #: min 0 softmax 1
            color   "weight_tint"           default 1 1 1 1,
            vector  "bump"
        }
     )
     apply material, texture, shadow, photon
     version 2
end declare

mila_mix シェーダは、2 種類の塗料をバケツに入れて混ぜるように、コンポーネントを混合します。mila_mix では、コンポーネントの入力は概ね同様ですが、ウェイトの方向依存がありません。ウェイトは、レイヤが行うようなパーセンテージとしては解釈されません。したがって、エネルギー保存のため、もう 1 つのパラメータを使って指定のウェイトを次のように混合します。

clamp
シェーダの混合動作を定義し、ウェイト値を解釈します。オン/オフの解釈:
オフ
「正規化ミキシング」を意味します。各レイヤは weight パラメータで指定されたウェイトそのもので使用されます。すべてのウェイトの合計が 1.0 を超える場合にのみ、合計がちょうど 1.0 になるようにすべてのウェイトが均等に減らされます。
オン
「クランプ ミキシング」を意味します。前述のように、各レイヤは最初のレイヤから開始して 2 番目、3 番目と指定されたウェイトで使用されます。次のレイヤのウェイトで合計が 1.0 を超える場合、そのレイヤのみのウェイトが減らされて合計 1.0 以下が保持され、以降のレイヤのウェイトは強制的に 0 (ゼロ)になります。