コンポーネント シェーダ

高速散乱

実際に散乱を行うメイン シェーダです。高度なモジュール方式で、複数のプラグイン シェーダで動作し、自身の内部に自身を重ねることによって(misss_fast_skin_phen と同じように)マルチレイヤ散乱を行うことも可能です。ライトマップからの散乱ライトを使用してプラグイン シェーダからの結果をレイヤ化し(いくつかの合成アプリケーションで「スクリーン」転送モードと呼ばれる方法を使用して、オプションでノンリニアに処理することもできます)、結果を最終的な合成カラーとして出力します。

misss_fast_shader
color "misss_fast_shader" (
    color texture   "lightmap",
    color texture   "depthmap",
    shader          "bump",
    shader          "diffuse_illum",
    color           "diffuse_color",
    shader          "specular_illum",
    scalar          "diffuse_weight",
    color           "front_sss_color",
    scalar          "front_sss_weight",
    scalar          "front_sss_radius",
    color           "back_sss_color",
    scalar          "back_sss_weight",
    scalar          "back_sss_radius",
    scalar          "back_sss_depth",
    scalar          "scale_conversion",
    boolean         "screen_composit",
    boolean         "output_sss_only",
    scalar          "falloff",
    integer         "samples"
    shader          "fallback_shader")
lightmap
depthmap
ライトとデプスマップのペア。ここからデータを抽出します。詳細は、misss_lightmap_write および自動でライトマップを生成するの項を参照してください。
bump
法線を摂動させるシェーダです。シェーダリストを使用したり、このシェーダの前に mib_bump_passthrough を使用したりすることもできますが、散乱半径が大きい場合はバンプ マッピングの前にシェーダが法線ベクトルを認識する方がよいでしょう。バンプ マッピング シェーダが代わりにこのパラメータに割り当てられた場合は、misss_fast_shader がバンプ マッピングの前後両方の法線を認識します。
diffuse_illum
拡散イルミネーションに使用する任意の法線イルミネーション シェーダ(カラーを戻します)で、通常は mib_illum_lambert に基づいて指定されたシェーダを渡します。何も渡さない場合は、自動的に既定の Lambert に設定されます。
diffuse_color
散乱された成分を含むすべての拡散光に適用される、全体的なカラーです。
specular_illum
スペキュラコンポーネントおよび反射コンポーネントに使用する任意の法線イルミネーション シェーダ(カラーを戻します)を渡します。何も渡さない場合は、スペキュラ シェーディングは行われません。すべての拡散成分の上位にレイヤ化されます。
diffuse_weight
簡単な調整を行うために、diffuse_illum シェーダによって戻されるカラーに使用する単純なスカラー乗数です。
front_sss_color
front_sss_weight
前面サーフェス スキャタリングに使用するカラーとウェイトです。
front_sss_radius
前面サーフェスの散乱半径です。光は(モデルの作成に使用された単位を問わず)サーフェス上で、この距離で散乱されます。
back_sss_color
back_sss_weight
後面サーフェス スキャタリング(または貫通スキャタリング)に使用するカラーとウェイトです。
back_sss_radius
散乱の半径です。また、 back_sss_depth は後面の深度です。通常は半径と深度は同じ値に設定します(深度が指定されていない場合には既定で半径と同じ値に設定されます)が、個別に設定してより詳細にコントロールすることもできます。
scale_conversion
すべての距離をリニアに分割できる単純なユーティリティ機能です。散乱は距離に依存するので、インチ単位を使用したモデル用に設計されたマテリアルをメートル単位のモデルにロードしてもうまくいかなかったり、またその逆のこともあります。そのような場合は、ここで変換係数を渡します。
screen_composit
オンにした場合は、スクリーン合成が選択されます。多数のライトのレイヤの成分を単純に加算した場合は、すぐに露出過多で白飛びしてしまいますが、人間の目は本質的にリニアではなく、別の方法で強度を感知します。このオプションでは、多くの合成アプリケーションでレイヤ間におけるスクリーン転送モードと呼ばれる、よりソフトでより見栄えのよい結果を生み出す機能を使用できます。オフにした場合は、通常の追加が使用されます。ハイダイナミック レンジでレンダリングし、最終出力段階ですでに最終的な輝度を圧縮して適切なトーンオペレータを適用してあるのであれば、このオプションはオフにします。それ以外の場合は、このオプションをオンにすることによって、より見た目のよい結果が得られます。
output_sss_only
デバッグやテスト、あるいは外部的な合成の準備用に使用します。このオプションがオンの場合は、散乱された成分だけが表示されます。
falloff
散乱半径に沿った距離減衰のシェイプを設定します。この値が高いほど減衰は急になり、低いほど緩やかな減衰になりますが、同時に明確な散乱距離も短くなるので、もう少し「ソフトな」外観を得たいという場合には、実際の散乱距離を長くすることによって埋め合わせる必要があります。値が高い場合(1.0 から 10.0)は、散乱半径よりも小さいサンプルのうちほぼすべてのウェイトが同等になります。値が低い場合(0.1 から 1.0)は、散乱半径のエッジに近いサンプルのウェイトが少なくなります。
samples
レンダリング後の個々のレイごとに、ライトマップからのサンプル量を(最大で)どれほど考慮するかを、できれば 2 の累乗で設定します。使用可能な範囲での最小値は 32 で、通常は 128 で十分です。
fallback_shader
格納されているライトマップ サンプルが散乱半径内に見つからない場合に使用されるシェーダです。 このパラメータを設定しない場合は、組み込みの Lambert シェーダが使用されます。 このパラメータを設定する場合は、アタッチされたシェーダから返される値が使用されます。 最適な結果を得るためには、このシェーダはライトマッピング段階でライトマップ サンプリング シェーダとして使用したシェーダと同じである必要があります。
misss_fast_shader_x
struct {
    color "result",           # composited color

    color "diffuse_result",   # diffuse layer
    color "diffuse_raw",
    color "diffuse_level",

    color "specular_result",  # specular is not altered by the shader, but
                              # passed through from "specular_illum" sub-shader

    color "front_result",     # the "front" SSS layer
    color "front_raw",
    color "front_level",

    color "back_result",      # the "back" SSS layer
    color "back_raw",
    color "back_level"
}
"misss_fast_shader_x" (
    color texture   "lightmap",
    color texture   "depthmap",
    shader          "bump",
    shader          "diffuse_illum",
    color           "diffuse_color",
    shader          "specular_illum",
    scalar          "diffuse_weight",
    color           "front_sss_color",
    scalar          "front_sss_weight",
    scalar          "front_sss_radius",
    color           "back_sss_color",
    scalar          "back_sss_weight",
    scalar          "back_sss_radius",
    scalar          "back_sss_depth",
    scalar          "scale_conversion",
    boolean         "screen_composit",
    boolean         "output_sss_only",
    scalar          "falloff",
    integer         "samples",
    shader          "fallback_shader")

このシェーダは misss_fast_shader と同じ動作をしますが、シェーディング結果の個々のコンポーネントを最終的なカラー値に合成する前に出力値として提供します。 このシェーダは合成を外部パッケージで実行する、マルチチャネル レンダリング手法をサポートしています。

高速散乱 2

misss_fast_shader2

高速散乱シェーダの更新バージョンで、高速散乱シェーダよりもやや物理的なシェーダです。 主な違いは散乱半径がカラーごとに定義されることです(赤、緑、青の各コンポーネントについて散乱半径が個別に定義されます)。 また、減衰を変更するための明示的なパラメータが用意されていた古い misss_fast_shader とは異なり、光のエネルギーの減衰は常に指数関数的です。

この新しいシェーダの主な利点はよりリアリティーのある効果が得られることです。現実世界の散乱は指数関数的で波長に依存するからです。 また、現実的な効果を得るのに必要な散乱レイヤの数も減少します。以前は、肌をシミュレートする場合には、赤のカラーの散乱を大きくするために少なくとも 2 つのレイヤが必要でした。 これはこの新しいシェーダではもう必要ありません(ただし、芸術的な見地からのコントロール性を高めるために、引き続き複数のレイヤを使用することもできます)。


古いシェーダ(左)と新しいシェーダ(右)の比較

左側は古いシェーダです。 シャドウに放出される光のカラーは均一(この画像ではグレー)です。オブジェクトから染み出すライトのカラーは赤です。これは単に既定の back_sss_color が赤であるためです。 一方、右側は波長に依存する散乱です。 シャドウに散乱する光には、白から黄、さらに赤までのカラー範囲があります。これはオブジェクトから散乱する光についても同様です。 このような赤方偏移が生じたのは、赤、緑、青の散乱半径が異なっているためです。右側の画像では、すべての散乱カラーが白に設定されています。

misss_fast_shader2 のパラメータを次に示します。

    color "misss_fast_shader2" (
        color texture "lightmap",
        color texture "depthmap",
        shader        "bump",
        shader        "diffuse_illum",
        color         "diffuse_color"    default 1 1 1,
        shader        "specular_illum",
        scalar        "diffuse_weight"       default 0.5,
        
        color         "front_sss_color"      default 0.8 0.8 0.8,
        scalar        "front_sss_weight"     default 0.5,
        vector        "front_sss_radius"     default 20 10 5,
        color         "front_sss_radius_mod" default 1 1 1,

        color         "back_sss_color"       default 0.8 0.8 0.8,
        scalar        "back_sss_weight"      default 0.5,
        vector        "back_sss_radius"      default 20 10 5,
        color         "back_sss_radius_mod"  default 1 1 1,

        scalar        "back_sss_depth",      # unassigned (zero) means "same as radius"
        scalar        "sampling_radius_mult" default 3.0,
        
        scalar        "scale_conversion"     default 1.0,
        boolean       "screen_composit"      default off,
        boolean       "output_sss_only",        
        integer       "samples"           default 64,
        shader        "fallback_shader"
    )
ほとんどのパラメータの動作は misss_fast_shader と同じです。ただし、次に示す例外と注意事項があります。
front_sss_radius
これはスカラーではなく、赤、緑、青のそれぞれの光に対応する 3 つの異なる半径を持つベクトルです。 一般に、赤の散乱が最も大きく、緑の散乱はそれより小さく、青の散乱は非常に小さくなります。 減衰は指数関数的で(古いシェーダとは異なり)急に停止することはありません。そのため、ここで設定されている値は、光の強度がゼロになる位置ではなく、元の強度の 10 % に減衰する距離を示しています。
front_sss_radius_mod
散乱半径を変更するためのカラー パラメータです。 このパラメータは、サーフェス上の散乱半径を変更するためのテクスチャ マップを容易に適用できるようにするために用意されています。このテクスチャは通常の白~黒の範囲内で変化させることができ、front_sss_radius パラメータで設定された値がそれに乗算されます。
back_sss_radius
後面散乱の赤、緑、青のコンポーネントに対応する 3 つの異なる半径を持つベクトルです。 値は front_sss_radius と同様に作用します。
back_sss_radius_mod
半径を変更するための入力で、front_sss_radius_mod と同様に作用します。
sampling_radius_mult
front_sss_radius または back_sss_radius のいずれかで設定された最大半径の乗数で、サンプルを実際に取得する範囲を定めるために使用されます。 そのため、これらの半径のうち最大のものがたとえば 10 単位である場合、このパラメータを 2.0 に設定すると、サンプルは実際には 20 単位の距離の範囲内から取得され、この半径の外側にある光は完全に無視されます。 この値が小さすぎる場合、目に見える激しい遮断が散乱に生じることがあります。 この値が大きすぎる場合、成分が極めて小さい遠く離れたサンプルが取得されるため、非常に多くのサンプルが無駄になります。減衰は指数関数的で、散乱半径パラメータは「成分が 10 % になるまでの距離」として定義されるため、最も遠くのサンプルには、10 % をこのパラメータの値で累乗したウェイトがかけられます(このパラメータの値が 2 の場合は 1 %、3 の場合は 0.1 %、4 の場合は 0.01 % など)。
misss_fast_shader2_x
struct {
    color "result",           # composited color

    color "diffuse_result",   # diffuse layer
    color "diffuse_raw",
    color "diffuse_level",

    color "specular_result",  # specular is not altered by the shader, but
                              # passed through from "specular_illum" sub-shader

    color "front_result",     # the "front" SSS layer
    color "front_raw",
    color "front_level",

    color "back_result",      # the "back" SSS layer
    color "back_raw",
    color "back_level"
}
"misss_fast_shader_x" (
        color texture "lightmap",
        color texture "depthmap",
        shader        "bump",
        shader        "diffuse_illum",
        color         "diffuse_color"    default 1 1 1,
        shader        "specular_illum",
        scalar        "diffuse_weight"       default 0.5,
        
        color         "front_sss_color"      default 0.8 0.8 0.8,
        scalar        "front_sss_weight"     default 0.5,
        vector        "front_sss_radius"     default 20 10 5,
        color         "front_sss_radius_mod" default 1 1 1,

        color         "back_sss_color"       default 0.8 0.8 0.8,
        scalar        "back_sss_weight"      default 0.5,
        vector        "back_sss_radius"      default 20 10 5,
        color         "back_sss_radius_mod"  default 1 1 1,

        scalar        "back_sss_depth",      # unassigned (zero) means "same as radius"
        scalar        "sampling_radius_mult" default 3.0,
        
        scalar        "scale_conversion"     default 1.0,
        boolean       "screen_composit"      default off,
        boolean       "output_sss_only",        
        integer       "samples"           default 64,
        shader        "fallback_shader"
    )
このシェーダは misss_fast_shader2 と同様に動作しますが、misss_fast_shader_x で説明した複数出力を返します。

シェーダの用途

misss_fast_shader(..) ファミリのシェーダは、理論的にはいくつかの光の成分をすべて重ね合わせることによって動作します。 実際の合成は、単純な追加またはよりソフトな外観のスクリーン合成を使用して行われます。


misss_fast_shader の理論上のレイヤ

プラグイン シェーダはさまざまなレイヤに対して実際の成分を提供します。 bumpdiffuse_illumspecular_illum は、シェーディング モデルを提供する主なプラグイン シェーダです。

  bump シェーダはサーフェス法線に作用し、「... _illum」シェーダのシェーディングに作用するので、このシェーダよりも前に呼び出されます。ただし、サーフェスので実行されるため、散乱された光に対してバンプ マッピングは行われません。バンプ マップ シェーダをライトマッピングの段階で追加すれば、光が散乱されるにバンプ マッピングのエフェクトを光に追加することは可能です。

サブサーフェス スキャタリング自体を作成するには、特別に準備したライトマップからの光を収集し、距離によってウェイトを付け、色を付けます。スタック全体は最終的に次のように(上から下に)レイヤ化されます。

2 つの注意点があります。1 つ目は、レイヤ 2、レイヤ 3、レイヤ 4 からの成分にはすべて全体的な色付けおよび拡散成分の減衰カラーとして「 diffuse_color」パラメータが掛けられることです。2 つ目は、プラグイン シェーダは単純に呼び出されてレイヤ化されるので、複数のシェーダを重ねて次のように複数のレイヤが作成されるという点です。


misss_fast_shader の重ね合わせ

この図は、misss_fast_shader の 2 回目の反復が 1 回目の diffuse_illum パラメータとして使用されている様子を示したものです。これが動作するのは、散乱機能がライトマップから拡散イルミネーションを受け取り、 diffuse_illum が実際に何を戻すのかは考慮しないからです。単にレイヤに追加するだけです。

スキン フェノメナの実装もこのような仕組みになっています。2 つ目のシェーダが 1 つ目のシェーダに重ねられ、追加のレイヤを作成します。原則としては、シェーダのスタッキングは何個でもできることになっています。

ライトマップ作成

ライトマップ シェーダです。このシェーダは、高速サブサーフェス スキャタリングを動作させる[1]ためには欠かすことができません。ライトマップを作成し、前面および後面、これらの深度、発行するライトの強度を 1 つまたは複数の特別にフォーマットされたライトマップに格納します。動作には 2 つのモードがあります。

misss_lightmap_write
struct {
    vector "point",
    vector "normal"
}
"misss_lightmap_write" (
    color texture   "lightmap",
    color texture   "depthmap",
    string          "lightmap_group",
    scalar          "lightmap_size",
    integer         "write_lightmap",
    scalar          "scatter_bias",
    shader          "input")
lightmap
書き込み可能なカラー テクスチャを指して depthmap を割り当てずにおくか、両方をフェノメナ インタフェース パラメータのペアに割り当てます(自動でライトマップを生成する参照)。
lightmap_group
自動ライトマップ生成を使用した、散乱グループ名の文字列です。同じ散乱グループを使用するすべてのオブジェクトおよびマテリアルは、相互にライトを散乱します。
lightmap_size
自動的に生成されるライトマップのサイズをレンダー サイズのパーセンテージで指定します。
write_lightmap
将来の使用に備えて予約されています。
scatter_bias
ライトマップの光を調節して、負の値を使用した場合には後面散乱(カメラの背後からの光がカメラの方向に戻るように散乱する)を多く、正の値を使用した場合には前面散乱を多くします。理論上は -1 から 1 までが使用できますが、わずかな値(-0.2 から 0.2 まで)でも見た目で違いが分かります。
input
ライトマップ用にモデル内のライティングを実際にサンプリングするシェーダです。通常は misss_lambert_gamma が使用されますが、mib_illum_lambert などの任意のイルミネーション シェーダを使用することもできます。また、mib_illum_phong とスペキュラ反射の散乱を試してみることも可能です。

Lambert イルミネーション

付属のライトマップ サンプリング シェーダです。すべてのイルミネーション シェーダは mib_illum_lambert のように使用できますが、このシェーダは特にこの用途に合わせて調整されており、ライトマップ ガンマ補正、法線反転、間接ライトの追加などのオプションも追加されています。

misss_lambert_gamma
color "misss_lambert_gamma" (
    color           "ambient",
    color           "ambience",
    color           "diffuse",
    boolean         "indirect",
    scalar          "diffuse_curve",
    integer         "flip",
    integer         "mode",
    array light     "lights")
diffuse
拡散カラーです。
ambient
ambience
この 2 つを相互に掛け合わせて、最終的なアンビエントライトの成分を得ます。
indirect
オンの場合は、間接イルミネーション(ファイナル ギャザリングとフォトンなど)がライトマップに含まれますが、レンダリング時間はその分だけ長くなります。
diffuse_curve
拡散ライトのガンマ曲線です。Lambert の余弦はこの値の累乗に上げられ(pow(dot_nl, diffuse_curve)など)て、カーブのフラット化(1.0 よりも小さい値)または縮小(1.0 よりも大きい値)によってコントロール性を高めています。
flip
0 (法線を反転しない)、1 (法線を反転)、2 (法線の反転されていない側と反転した側をいずれもライトマップ)のいずれかです。葉などの薄いオブジェクトの半透明性に使用すると便利です。
mode
ライト リストで使用するモード セレクタです。
lights
シェーダに直接リンクされるライトのリストです。

スペキュラ スキン

スキンの独特のスペキュラ特性を再作成するために適合された機能です。2 つのスペキュラ ハイライトと、エッジの強調を使用した光沢のある反射が含まれています。

シェーダはスペキュラ ハイライトが必要な任意の場所で使用できます。拡散コンポーネントがないため、拡散シェーディングを行う別のシェーダとともにレイヤ化する必要があります。

misss_skin_specular
color "misss_skin_specular" (
    scalar          "overall_weight",
    scalar          "edge_factor",

    color           "primary_spec_color",
    scalar          "primary_weight",
    scalar          "primary_edge_weight",
    scalar          "primary_shinyness",

    color           "secondary_spec_color",
    scalar          "secondary_weight",
    scalar          "secondary_edge_weight",
    scalar          "secondary_shinyness",

    scalar          "reflect_weight",
    scalar          "reflect_edge_weight",
    scalar          "reflect_shinyness",
    boolean         "reflect_environment_only",

    integer         "mode",     
    array light     "lights")
overall_weight
鏡面反射性および反射の全体的なレベルです。一般に、あらゆる鏡面反射性マップはここで追加され、その後関連するすべての鏡面反射性オプションのレベルに影響します。
edge_factor
エッジ反射エフェクトの「エッジの幅」を設定します。スキンの反射はほぼ垂直に近い角度から見たときに最大になります(「フレネル効果」と呼ばれます)が、このパラメータはこのエッジの最も細い幅を設定します。値を大きくするほどエッジが狭くなっていきます。このエッジ幅は以下にリストされるすべてのエッジのウェイトに適用されます。
primary_spec_color
primary_spec_weight
鏡面反射性のある最初のレイヤで使用するカラーとベース ウェイトです。スキンの鏡面反射性機能は 2 層構造で、スキンの幅広いソフトな鏡面反射性と、最上位のレイヤの油分および水分による反射に近い鏡面反射性の両方をシミュレートできます。
primary_edge_weight
エッジにおける最終的な鏡面反射性が weight edge weight の合計になるような、エッジ用の追加の乗数を設定します。
primary_shinyness
スペキュラ指数です。値が大きいほど(エッジをソフトにした phong モデルの変形である)小さく鋭いスペキュラ ハイライトが作成されます。
secondary_spec_color
secondary_spec_weight
secondary_edge_weight
secondary_shinyness
primary_ で始まるパラメータとまったく同じように動作する、鏡面反射性のある 2 つ目のレイヤー用のパラメータです。
reflect_weight
reflect_edge_weight
反射のウェイトとエッジ ウェイトです。この値がゼロ以外である場合は、実際の(光沢のある)反射が追加されます。
reflect_shinyness
光沢のある反射の光沢の値です。0.0 の場合は、標準のレイトレースされたミラー反射が使用されますが、ゼロ以外の値の場合は光沢のある反射が生成され、レンダリング時間が増加します。
reflect_environment_only
true の場合は現在の環境マップが反射用にサンプリングされ、実際のレイはトレーシングされません。
mode
ライト リストで使用するモード セレクタです。
lights
シェーダに直接リンクされるライトの配列です。

呼び出しシェーダ

フェノメナの構築用の「通過」ユーティリティ シェーダです。環境、フォトン、ディスプレイスメントなどに適したマテリアル フェノメナに、パラメータとしてシェーダを渡すことができます。

misss_call_shader
color "misss_call_shader" (
    shader  "shader",
    shader  "default_shader",
    integer "mode")
shader
呼び出されるシェーダです。
default_shader
shader が指定されていない場合に呼び出されるシェーダです。
mode
シェーダの呼び出しモードで、0 の場合は「自動」です。その他の数字はシェーダ呼び出しモード miShader_type にマッピングされます。詳細は、shader.h インクルード ファイルを参照してください。

フェノメナでこのシェーダを使用する場合の擬似コードの例を示します。

declare phenomenon 
    material "my_phenomenon" (
        color       "my_special_color",
        scalar      "my_size",
        shader      "optional_environment",
        ...
    )
    shader "default_environment" "...." (
        .... some environment shader ...
    )
    shader "env" "misss_call_shader" (
        # call the passed shader
        "shader"    = interface "optional_environment",
        # if none was passed, call our default
        "default_shader" "default_environment"
    )
    environment = "env" 
end declare

[1]サンプル シェーダ misss_lambert_gamma はオプションです。任意のイルミネーション シェーダを使用できます。

Copyright © 1986, 2012 NVIDIA Corporation