コンポーネント シェーダ

高速散乱

実際に散乱を行うメイン シェーダです。高度なモジュール方式で、複数のプラグイン シェーダで動作し、自身の内部に自身を重ねることによって(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",
    )
    apply material
    version 4
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 で十分です。
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"
    )
    apply material
    version 4

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

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"
    )
    version 4
    apply lightmap
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"
    )
    version 4
    apply texture
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"
    )
    version 4
    apply material
overall_weight
鏡面反射性および反射の全体的なレベルです。一般に、あらゆる鏡面反射性マップはここで追加され、その後関連するすべての鏡面反射性オプションのレベルに影響します。
edge_factor
エッジ反射エフェクトの「エッジの幅」を設定します。スキンの反射はほぼ垂直に近い角度から見たときに最大になります(「フレネル効果」と呼ばれます)が、このパラメータはこのエッジの最も細い幅を設定します。値を大きくするほどエッジが狭くなっていきます。このエッジ幅は以下にリストされるすべてのエッジのウェイトに適用されます。
primary_spec_color
primary_spec_weight
鏡面反射性のある最初のレイヤで使用するカラーとベース ウェイトです。スキンの鏡面反射性機能は 2 層構造で、スキンの幅広いソフトな鏡面反射性と、最上位のレイヤの油分および水分による反射に近い鏡面反射性の両方をシミュレートできます。
primary_edge_weight
エッジにおける最終的な鏡面反射性が weightedge 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"
    )
    version 2
    apply material, texture, environment, photon, shadow, displace
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-2009 by mental images GmbH