组件着色器

快速散射

这是执行实际散射的主着色器。它高度模块化,并使用多个插件着色器,甚至可以自身进行层叠以形成多层散射(如在 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 以显式参数修改衰减。

此新着色器的主要优势在于其效果更加真实,因为在现实世界中散射就以指数衰减并与波长相关。这同时降低了获得真实的效果所需的散射层数量,在过去,需要至少两个层来模拟蒙皮才能进一步散射红色。使用新的着色器则不再需要使用多个层(但是仍然可以使用多个层,这样可以更好地进行艺术控制)。


比较旧(左)着色器和新(右)着色器

左侧的是旧的着色器。溢出到阴影中的灯光是均匀颜色(在此图中为灰色),而穿透对象溢出的灯光仅为红色,因为实际上默认 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
不是标量而是向量,具有三个不同的半径,分别对应于红色、绿色和蓝色灯光。通常,红色散射半径最大,绿色次之,蓝色最小。请注意,衰减是指数级的,且不会硬停止(不同于旧着色器),因此在此设置的值是灯光减弱到原始强度的 10% 的距离,而不是强度变为零的距离。
front_sss_radius_mod
是颜色参数,允许修改散射半径。此参数便于应用纹理贴图,以便在整个表面上更改散射半径;纹理可在普通的黑到白的范围内变化,乘以在 front_sss_radius 参数中设置的值。
back_sss_radius
是向量,具有三个向后散射半径,分别对应于红色、绿色和蓝色组件。此值的作用与 front_sss_radius 相同。
back_sss_radius_mod
是半径修改输入,作用与 front_sss_radius_mod 相同。
sampling_radius_mult
是在 front_sss_radiusback_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、3 和 4 的贡献均与“ diffuse_color”参数相乘,作为漫反射贡献的总体染色和衰减颜色。其次,因为插件着色器是简单调用且进行分层,所以可以将多个着色器层叠到一起以创建多个层,如下所示:


misss_fast_shader 的层叠

该图显示了如何将 misss_fast_shader 的第二次迭代用作第一次迭代的 diffuse_illum 参数。此操作起作用的原因是,散射函数从光照贴图接收其漫反射照明,而不关心 diffuse_illum 实际返回的内容。它只是将其分层到混合层。

这是蒙皮现象实现的准确方式。另一个着色器被层叠到第一个着色器,以提供额外的层。原则上,不会阻止任意数量的着色器的堆叠。

光照贴图创建

这是光照贴图着色器。要求快速次表面散射工作 [1]。它创建光照贴图,并将前表面和后表面及其深度以及发光强度存储在一个或多个特殊格式的光照贴图中。支持两种行为模式:

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 等任何照明着色器,但此着色器经过特殊调整以用于该作业,并具有适用于光照贴图 Gamma 校正、法线翻转和间接灯光包含的其他选项。

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
彼此相乘以生成环境光的最终贡献。
indirect
如果启用,将导致间接照明(例如最终聚集和光子)包括在光照贴图中,但会增加渲染时间。
diffuse_curve
漫反射灯光的 Gamma 曲线。朗伯 (Lambertian) 余弦上升为此值的幂次方(即 pow (dot_nl,diffuse_curve))以展平(如果值小于 1.0)或变窄(如果值大于 1.0)曲线以增强控制。
flip
可以是下列值之一:0,法线不翻转;1,法线翻转;2,对未翻转法线和已翻转法线的面均进行光照贴图。这对于较薄对象(如叶子)的半透明非常有用。
mode
灯光列表的模式选择器。
lights
列出直接与着色器链接的灯光。

镜面反射蒙皮

此函数适用于重新创建蒙皮的特殊镜面反射特性。它包含两个边增强的镜面反射高光和光泽反射。

可以在需要镜面反射高光的任意位置使用着色器。它没有漫反射组件,因此需要与提供漫反射着色的另一个着色器层叠到一起。

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
第一层的镜面反射度的颜色和基础权重。蒙皮镜面反射度函数分为两层,允许模拟蒙皮的广泛柔和镜面反射度和顶层油度和湿度的任何近反射镜面反射度。
primary_edge_weight
设定边的其他倍增,其中,边的最终镜面反射度是 weightedge weight的总和。
primary_shinyness
镜面反射指数(值越高,产生的镜面反射高光越更小、越尖锐,这是一个软化边的经过修改的 Phong)。
secondary_spec_color
secondary_spec_weight
secondary_edge_weight
secondary_shinyness
工作方式与以 primary_ 开头的参数完全相同,适用于镜面反射度的第二层。
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, 2015 NVIDIA ARC GmbH. All rights reserved.