分层着色器

分层着色器

此图显示了我们可以/应该如何轻松连接分层着色器。基本分层网络布局。

这些着色器具有优异的布局灵活性,并使用 NVIDIA ARCS 的 MDL 作为其组件的灵感。在此图中,您可以看到:

下图显示了如何将另一个着色器插入网络。两级分层网络布局。

可通过使用灯光路径表达式 (LPE)术语指定额外的输出过程。这些 LPE 的子集由分层着色器提供支持,并可以自动写入用户帧缓冲区(只需在摄影机中指定其名称即可完成此过程)。也可以使用全局字符串选项指定可将哪个 LPE 转到任意命名的用户帧缓冲区。大多数典型的着色子集输出(例如“漫反射”)可显示出来,并且应以线性方式将所有分离输出添加到美景“结果”输出。因此,这些相加过程支持合成。可在以下位置获得关于当前支持的过程的详细信息:多个 LPE 过程

全局设置

着色器接受多个全局设置作为字符串选项,一些用于测试,一些用于调整功能。

用于分层着色器的全局字符串选项
“light relative scale” 着色器通过侦听“light relative scale”匹配 BSDF 的着色,即它基于“灯光相对规模”调整灯光演示。要匹配 mia_material 着色,“light relative scale”必须为 1/PI。
“mila ray cutoff” 这强调中止的重要性,此时光线开始被忽略。它类似于 mia_material 中的refr_cutoff,但在此处它是全局设置。默认值为 0.01(即贡献低于 1% 的光线开始被拒绝)。 “mila clamp output” 启用/禁用。在 mila_material 中启用/禁用输出值钳制。默认设置为“禁用”。 “mila clamp level” 如果已启用上面的钳制输出,则使用此级别值大致钳制为亮度。默认值为 1.0。如果允许输出值超过 1,但是需要缩小动态范围以进行优化,请尝试使用介于 1 和 5 的值;这些值依赖于场景和流水线要求。 “mila quality” 用于分层库中位于其后的所有其他质量设置的质量倍增值。默认值为 1.0。 “mila glossy quality” 控制用于光泽反射或光泽透射的采样数目。默认值为 1.0。将使用公称采样数,还由跟踪深度、重要性以及光泽着色器中的粗糙度控制。 “mila scatter quality” 控制触点周围的散射采样的采样数目。默认值为 1.0。如果所有其他关于重要性、跟踪深度等的系数较高,则标称值为 64 个采样。 “mila diffuse quality” 控制在使用间接漫反射细节时用于间接漫反射的采样数目。默认值为 1.0。 “mila diffuse detail” 启用/禁用。启用间接漫反射局部模式,类似于 ao 颜色溢出/FG 力,仅针对 mila_diffuse_reflection 着色。 “mila diffuse detail distance” 用于详图的距离。超出该距离时使用常规间接漫反射控制 (GI/FG)。 “LPE: xxx” 现已弃用。现在使用帧缓冲区 LPE 属性。定义灯光路径表达式 XXX 将要写入的用户帧缓冲区。要获取当前支持的过程的详细信息,请单击此处。字符串选项必须以“LPE: ”(即冒号后面有空格)开头,然后再指定 LPE。基于典型过程名称的字符串选项示例包括:
  • "LPE: L<RD>E" "diffuse"
  • "LPE: L.+&ltRD>E" "indirect"
默认用户帧缓冲区名称是描述性名称,位于以上链接中详细介绍的表中。
“mila share lights” 可用于调试和性能比较。当禁用时,则灯光共享功能将被禁用,并且每个层(组件)着色器将运行自己的灯光循环。默认设置为启用。
“mila propagate importance” 可用于调试和性能比较。当禁用时,则到子着色器和子光线的重要性传播将被禁用,以便可以判断此优化所产生的影响。默认设置为启用。
“mila separate interactions” 用于调试和性能比较。确定是否在第一次投射后,根据组件的概率(即,计算出的最终权重)跟踪次级光线。默认设置为启用。



根分层着色器 mila_material

该着色器必须是着色树的根着色器(否则,透明度和阴影着色器将不起作用)。它还可以随意写入帧缓冲区。

 declare shader "mila_material" (
         # Shader to call
         shader "shader",
         #
         boolean "thin_walled",
         shader  "backface_shader",
         #
         scalar "visibility" default 1.0,
         #
         # Debug/test tool: Show a given fb as beauty
         #   1 = ALL, 2 = transparency, 3 = absorb, 4 = LrDE, 5 = LrGE etc.
         integer "show_framebuffer" default 0,
         #
         # overall bump vector for whole material
         vector  "bump",
         #
         # Name of framebuffers to output to
         # If empty, nothing is written

         array struct "extra_color" {
             color   "color",
             string  "color_fb",
             boolean "color_comp"
         },
         array struct "extra_vector" {
             vector  "vector",
             string  "vector_fb",
             boolean "vector_comp"
         },
         array struct "extra_scalar" {
             scalar  "scalar",
             string  "scalar_fb",
             boolean "scalar_comp"
         } 
      )
      apply material, shadow, photon
      version 4
 end declare

mila_material 根着色器需要单个 mila_layermila_mix 作为“着色器”窗口的输入,并且着色树将从此处开始成长。

它还具有以下附加输入:

thin_walled
定义几何体应解释为实体对象的入口和出口曲面,还是解释为无限薄的材质壳。这主要影响着色器如何使用和解释折射指数。例如,要产生玻璃球体,应当禁用 thin_walled,但是,要使用相同的几何体产生肥皂泡,应当启用 thin_waled。当启用时,在任何连接到此着色器网络的 mila_layer 的菲涅尔计算中,所有面将视为外侧面。
backface_shader
(可选)mila_material 还可以将单个 mila_layermila_mix 作为“backface_shader”窗口的输入内容。对于内部光线交点,如果着色器已插入此处,则将使用它;否则,将使用“着色器”窗口中的曲面着色器。这便于在薄壁材质的任一侧使用不同的着色分层,例如一侧具有贴花,而另一侧没有贴花。
write_framebuffers
启用后,可使着色器写入给定帧缓冲区。
show_framebuffer
调试工具。用于测试。设置为 0 时,不会执行任何操作。设置为 1 时,复制第一帧缓冲区(间接)到美景输出,以便将其直接显示在渲染中。设置为 2 时,漫反射帧缓冲区,等等。
bump
是一个向量。如果为非零值,则该向量将用作整个材质的总体凹凸的法线,即,由所有基本组件使用。它可以用于法线贴图以及凹凸贴图,具体取决于凹凸着色器的功能。
extra_color
要输出的其他颜色的数组。每个数组项目都有要写入的颜色的输入颜色color_fb 是要将其写入到的帧缓冲区名称,color_comp 用于定义透明度是否合成到其后的值中。“extra_color”输入可用于指定将使用此材质的对象的蒙版。
extra_vector
工作方式与 extra_color 相同,但用于向量值。这就允许向帧缓冲区中写入任何其他值,以进行自定义。
extra_scalar
工作方式与 extra_color 相同,但用于标量值。这就允许向帧缓冲区中写入任何其他值,以进行自定义。

合并着色器 mila_layer 和 mila_mix

mila_layermila_mix 着色器执行针对分层和混合的所有“硬提升”。应仅使用它们

着色器在分层着色器系统之外将无法正常工作,如果您尝试在其他位置使用,它们甚至可能会崩溃。

这些着色器返回单个颜色输出,以将合并着色器组件输入表示为图层。mila_layer 着色器界面是一个初始参数,后跟一个结构数组(如下所示),每个图层对应一个结构。请注意,在某些 DCC 应用程序中使用时,用户界面中不支持类型为“结构数组”的参数。要解决此问题,将提供用于显示固定图层集的现象。

declare shader 
        color "mila_layer" (

        array struct "layers" {
            shader  "shader",
            boolean "on"                     default on,
            scalar  "weight"                 default 1.0,     #: min 0 softmax 1
            color   "weight_tint"            default 1 1 1 1,
            boolean "use_directional_weight" default off,
            integer "directional_weight_mode" default 0,       #: enum "fresnel:custom"
            scalar  "ior"                    default 1.2,
            scalar  "normal_reflectivity"    default 0.05,
            scalar  "grazing_reflectivity"   default 1.0,
            scalar  "exponent"               default 5.0,
            vector  "bump"
        }
     )
     version 5
end declare

mila_layer 着色器在合成系统中使用类似于“over”操作的权重,其中权重表示顶层下面的内容相对于顶层的百分比。也就是说,第一层(顶层)组件按指定的确切权重使用,下面的层以 (1 - 权重) 来加权。这将向下递归地应用于各个图层(按其指定顺序)。此行为类似于 mia_material 的内置能量守恒。输入参数如下所示:

包含以下内容的结构数组。数组项目在分层中从上到下进行逻辑排序。结构成员包括:
shader
参数为该层的着色器。它必须mila_* 着色器之一,或另一个 mila_layer。尝试使用任何其他着色器很可能会崩溃!
on
一种简单的布尔启用/禁用开关,类似于将层权重设置为零,但是在测试 UI 时更易于使用。
weight_tint
作为颜色的层权重。它将与以下权重结合使用。
weight
层的标量权重。上述 weight_tint color 按该值加权。请注意,对于 mila_layer,这可能不是最终权重,因为它可能取决于方向依赖参数(如下所示)。
use_directional_weight
当启用时,将权重乘以依赖于方向的权重因子,由以下模式控制
directional_weight_mode
定义如何计算方向权重依赖。
0
表示“菲涅尔”。通过使用下面提供的 ior 将权重乘以依赖于方向的“菲涅尔”方程式。
1
表示“自定义曲线”,此时参数 normal_reflectivity(0 度)、grazing_reflectivity(90 度)和 exponent(曲线形状)定义依赖于方向的权重行为,就像 mia_material 的反射率。
bump
一个向量,如果不为零,将是用于对该层进行着色的法线。
declare shader 
     color "mila_mix" (
        boolean "clamp"                     default off,

        array struct "components" {
            shader  "shader",
            boolean "on"                    default on,
            scalar  "weight"                default 1.0,     #: min 0 softmax 1
            color   "weight_tint"           default 1 1 1 1,
            vector  "bump"
        }
     )
     apply material, texture, shadow, photon
     version 2
end declare

mila_mix 着色器混合其各个组件,就如同两个绘制被混合在一个渲染块中。对于 mila_mix,组件输入大致相似,但没有方向权重依赖。权重不会像图层那样解释为百分比。因此,出于能量守恒,使用另一个参数来混合指定的权重,如下所示:

clamp
定义着色器的混合行为,并解释权重。如果:
off
表示“规格化混合”。每层按权重参数中指定的准确权重使用。仅当所有权重的总和超过 1.0 时,才按比例减少所有权重以确保总和恰好为 1.0。
on
表示“钳制混合”。如上所述,每个层都按指定的准确权重使用,从第一层开始,然后是第二层,依此类推。如果下一层的权重会使总和超过 1.0,则只减少该层的权重,以保持总和为 1.0,之后所有层的权重将被强制为零。