这是执行实际散射的主着色器。它高度模块化,并使用多个插件着色器,甚至可以自身进行层叠以形成多层散射(如在 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 以显式参数修改衰减。
此新着色器的主要优势在于其效果更加真实,因为在现实世界中散射就以指数衰减并与波长相关。这同时降低了获得真实的效果所需的散射层数量,在过去,需要至少两个层来模拟蒙皮才能进一步散射红色。使用新的着色器则不再需要使用多个层(但是仍然可以使用多个层,这样可以更好地进行艺术控制)。

左侧的是旧的着色器。溢出到阴影中的灯光是均匀颜色(在此图中为灰色),而穿透对象溢出的灯光仅为红色,因为实际上默认 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、3 和 4 的贡献均与“ diffuse_color”参数相乘,作为漫反射贡献的总体染色和衰减颜色。其次,因为插件着色器是简单调用且进行分层,所以可以将多个着色器层叠到一起以创建多个层,如下所示:

该图显示了如何将 misss_fast_shader 的第二次迭代用作第一次迭代的 diffuse_illum 参数。此操作起作用的原因是,散射函数从光照贴图接收其漫反射照明,而不关心 diffuse_illum 实际返回的内容。它只是将其分层到混合层。
这是蒙皮现象实现的准确方式。另一个着色器被层叠到第一个着色器,以提供额外的层。原则上,不会阻止任意数量的着色器的堆叠。
这是光照贴图着色器。要求快速次表面散射工作 [1]。它创建光照贴图,并将前表面和后表面及其深度以及发光强度存储在一个或多个特殊格式的光照贴图中。支持两种行为模式:
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 等任何照明着色器,但此着色器经过特殊调整以用于该作业,并具有适用于光照贴图 Gamma 校正、法线翻转和间接灯光包含的其他选项。
color "misss_lambert_gamma" (
color "ambient",
color "ambience",
color "diffuse",
boolean "indirect",
scalar "diffuse_curve",
integer "flip",
integer "mode",
array light "lights")
此函数适用于重新创建蒙皮的特殊镜面反射特性。它包含两个边增强的镜面反射高光和光泽反射。
可以在需要镜面反射高光的任意位置使用着色器。它没有漫反射组件,因此需要与提供漫反射着色的另一个着色器层叠到一起。
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.