実際に散乱を行うメイン シェーダです。高度なモジュール方式で、複数のプラグイン シェーダで動作し、自身の内部に自身を重ねることによって(misss_fast_skin_phen と同じように)マルチレイヤ散乱を行うことも可能です。ライトマップからの散乱ライトを使用してプラグイン シェーダからの結果をレイヤ化し(いくつかの合成アプリケーションで「スクリーン」転送モードと呼ばれる方法を使用して、オプションでノンリニアに処理することもできます)、結果を最終的な合成カラーとして出力します。
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
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 は理論上、複数の光の成分をレイヤ化し、すべてを順に積み上げます。実際の合成は、単純な追加またはよりソフトな外観のスクリーン合成を使用して行われます。
プラグイン シェーダはさまざまなレイヤに対して実際の成分を提供します。bump、diffuse_illum、specular_illum は、シェーディング モデルを提供する主なプラグイン シェーダです。
bump シェーダはサーフェス法線に作用し、「... _illum」シェーダのシェーディングに作用するので、このシェーダよりも前に呼び出されます。ただし、サーフェスの下で実行されるため、散乱された光に対してバンプ マッピングは行われません。バンプ マップ シェーダをライトマッピングの段階で追加すれば、光が散乱される前にバンプ マッピングのエフェクトを光に追加することは可能です。
サブサーフェス スキャタリング自体を作成するには、特別に準備したライトマップからの光を収集し、距離によってウェイトを付け、色を付けます。スタック全体は最終的に次のように(上から下に)レイヤ化されます。
2 つの注意点があります。1 つ目は、レイヤ 2、レイヤ 3、レイヤ 4 からの成分にはすべて全体的な色づけおよび拡散成分の減衰カラーとして「diffuse_color」パラメータが掛けられることです。2 つ目は、プラグイン シェーダは単純に呼び出されてレイヤ化されるので、複数のシェーダを重ねて次のように複数のレイヤが作成されるという点です。
この図は、misss_fast_shader の 2 回目の反復が 1 回目の diffuse_illum パラメータとして使用されている様子を示したものです。これが動作するのは、散乱機能がライトマップから拡散イルミネーションを受け取り、diffuse_illum が実際に何を戻すのかは考慮しないからです。単にレイヤに追加するだけです。
スキン フェノメナの実装もこのような仕組みになっています。2 つ目のシェーダが 1 つ目のシェーダに重ねられ、追加のレイヤを作成します。原則としては、シェーダのスタッキングは何個でもできることになっています。
ライトマップ シェーダです。このシェーダは、高速サブサーフェス スキャタリングを動作させる[1]ためには欠かすことができません。ライトマップを作成し、前面および後面、これらの深度、発行するライトの強度を 1 つまたは複数の特別にフォーマットされたライトマップに格納します。動作には 2 つのモードがあります。
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
付属のライトマップ サンプリング シェーダです。すべてのイルミネーション シェーダは mib_illum_lambert のように使用できますが、このシェーダは特にこの用途に合わせて調整されており、ライトマップ ガンマ補正、法線フリップ、間接ライトの追加などのオプションも追加されています。
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
スキンの独特のスペキュラ特性を再作成するために適合された機能です。2 つのスペキュラ ハイライトと、エッジの強調を使用した光沢のある反射が含まれています。
シェーダはスペキュラ ハイライトが必要な任意の場所で使用できます。拡散コンポーネントがないため、拡散シェーディングを行う別のシェーダとともにレイヤ化する必要があります。
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
フェノメナの構築用の「パススルー」ユーティリティ シェーダです。環境、フォトン、ディスプレイスメントなどに適したマテリアル フェノメナに、パラメータとしてシェーダを渡すことができます。
color "misss_call_shader" (
shader "shader",
shader "default_shader",
integer "mode"
)
version 2
apply material, texture, environment, photon, shadow, displace
フェノメナでこのシェーダを使用する場合の擬似コードの例を示します。
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