実際に散乱を行うメイン シェーダです。高度なモジュール方式で、複数のプラグイン シェーダで動作し、自身の内部に自身を重ねることによって(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"
shader "fallback_shader")
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 と同じ動作をしますが、シェーディング結果の個々のコンポーネントを最終的なカラー値に合成する前に出力値として提供します。 このシェーダは合成を外部パッケージで実行する、マルチチャネル レンダリング手法をサポートしています。
高速散乱シェーダの更新バージョンで、高速散乱シェーダよりもやや物理的なシェーダです。 主な違いは散乱半径がカラーごとに定義されることです(赤、緑、青の各コンポーネントについて散乱半径が個別に定義されます)。 また、減衰を変更するための明示的なパラメータが用意されていた古い 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 と同じです。ただし、次に示す例外と注意事項があります。
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 で説明した複数出力を返します。

サブサーフェス スキャタリング自体を作成するには、特別に準備したライトマップからの光を収集し、距離によってウェイトを付け、色を付けます。スタック全体は最終的に次のように(上から下に)レイヤ化されます。
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")
付属のライトマップ サンプリング シェーダです。すべてのイルミネーション シェーダは 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")
スキンの独特のスペキュラ特性を再作成するために適合された機能です。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")
フェノメナの構築用の「通過」ユーティリティ シェーダです。環境、フォトン、ディスプレイスメントなどに適したマテリアル フェノメナに、パラメータとしてシェーダを渡すことができます。
color "misss_call_shader" (
shader "shader",
shader "default_shader",
integer "mode")
フェノメナでこのシェーダを使用する場合の擬似コードの例を示します。
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, 2015 NVIDIA ARC GmbH. All rights reserved.