基本组件着色器

以下是分层包中当前应用的各个表面组件着色器:

漫反射组件

漫反射组件与 mia_material 漫反射着色以及在 MDL 中定义的漫反射基本组件非常相似。它具有用于更均匀扩散灯光的 Oren-Nayer 粗糙度参数。下面是相关参数:

mila_diffuse_reflection
   "mila_diffuse_reflection" (
        color    "tint"        default 1 1 1,
        scalar   "roughness"   default 0,
        scalar   "quality"     default 1.0,          #: min 0 softmax 2.0

        scalar   "direct"      default 1.0,
        scalar   "indirect"    default 1.0
    )


tint
是漫反射颜色。
roughness
将 (Oren-Nayar) 粗糙度范围设为 0 到 1,其中 0 是标准的 Lambertian 着色。粗糙度的值越大,在表面上产生的“粉末状”程度就越强。
direct
是直接照明的倍增(通常为 1.0)
indirect
是间接照明的倍增(通常为 1.0)
“Mila 漫反射细节”开/关(字符串选项,默认值为关)
启用间接细节,目前具有与常规 FG 混合的路径跟踪 FG。在 3.13 中,更倾向于使用新 GI 技巧而不是此功能。
quality/“Mila 漫反射质量”
用于确定间接细节的采样(FG 光线)投射数。更倾向于使用字符串选项而不是着色器局部质量。
“Mila 漫反射细节距离”(字符串选项,默认值为 10.0)
FG 光线投射的距离。距离越短,速度越快,但会产生更加局部化的间接细节效果。

光泽反射组件

光泽反射组件与 mia_material 反射着色以及在 NVIDIA 材质描述语言 (MDL) 中找到的光泽基本 BSDF 相似。实际上,此光泽反射组件采用粗糙度(由 MDL 使用),而不是光泽度(由 mia_material 使用)。尤其是,我们还在下方分别提供了简单的镜面反射组件,用于需要类似镜面反射的十分平滑曲面组件。下面是相关参数:

mila_glossy_reflection
   "mila_glossy_reflection" (
        color   "tint"                default 1 1 1,
        scalar  "roughness"           default 0.0, #: min 0.0 max 1.0
        scalar  "quality"             default 1.0, #: min 0.0 softmax 2.0
        
        scalar  "anisotropy"          default 1.0,
        scalar  "aniso_angle"         default 0,
        integer "aniso_channel"       default -1,

        boolean "use_max_dist"        default off,
        scalar  "max_dist"            default 0.0,
        boolean "use_max_dist_color"  default off,
        color   "max_dist_color"      default 0 0 0,

        scalar  "direct"              default 1.0,
        scalar  "indirect"            default 1.0
    )


tint
是反射颜色。
roughness
指产生反射的材质的粗糙度。其范围在 0.0(像镜面一样平坦)到 1.0(像漫反射)之间。可以将它视为用于控制 mia_material 中光泽度的反向。此着色器通常用于粗糙度大于 0 的情形。它写入到直接光泽反射过程,但是如果粗糙度设置为 0,它将写入到镜面反射过程。
quality/“Mila 光泽质量”
控制用于光泽反射的光线数量。光线计数将基于粗糙度和组件相对于所有组件的重要程度(并结合光线的重要程度)进行调整。此局部着色器值也将与全局“Mila 光泽质量”字符串选项相乘,因此场景中的所有光泽着色器可受单一控制影响。更倾向于使用全局字符串选项而不是此局部输入。
anisotropy
是表示等向反射的 1.0。实际值是 U 反射率与 V 反射率的比值,这意味着大于 1.0 和小于 1.0 的值均有效,也就是说该值是反射的“U 向量比例因子”。
aniso_angle
定义在 UV 空间内各向异性的旋转,aniso_channel 定义从其衍生 U 和 V 方向的纹理贴图通道。如果将该参数设为 -1,则计算基于对象空间的默认规范方向(与任何纹理坐标空间都无关)。
use_max_dist
启用对光线长度的限制。启用此参数并将 max_dist 设为非零的值之后,可以限制反射光线投射的实际距离(为了提升性能或获得效果)。这些光线将会褪色为环境颜色(当 use_max_dist_color 被禁用时)或提供的 max_dist_color(如果该参数已启用)。
“Mila 内使用最大距离”开/关(字符串选项)
仅在透射对象(如玻璃)内进行反射时使用以上选项。这对于校正有色玻璃内的颜色很有用。通常,此选项与透射组件内颜色的设置保持一致。
“Mila 单个环境采样”开/关(字符串选项)
该字符串选项通知光泽反射使用单个环境贴图采样(在镜面反射方向上采用),而非尝试对环境进行多次采样。此参数旨在与预过滤此类环境查找的着色器一起使用,如 mia_envblur。有关 mia_envblur 的信息,请参见建筑着色器库文档。
“Mila 使用可见区域高光”开/关(字符串选项)
允许针对不良 mans 实施多个重要性采样。平衡反射跟踪和灯光采样。
“Mila 可见区域高光”0.0-1.0(字符串选项)
定义可见区域灯光反射和灯光采样镜面反射度的分数拆分行为。
-1
(默认值,也是建议值)使用自动探试法来根据光泽度确定该值。
0.0
可见区域光不生成镜面反射高光,而是在反射中 100% 可见。此值非常适于高光泽度或高光表面以及大型区域光(区域光在任何时间所覆盖的对角都大于光泽圆锥体的角度)。
1.0
可见区域光生成传统的光泽/镜面反射高光,且对于反射光线来说可见。此值非常适于光泽度较低并且区域光较小的表面。
0.0 > X > 1.0
大于 0.0 且小于 1.0 的任何值都是两种反射的混合。这些值仍然保持平衡状态,因此总能量是准确的。
有关此参数的更多详细信息,可以参见技术信息页面
“Mila 粗糙度指数”,默认值为 3.0(字符串选项)
定义有关如何以直观方式映射粗糙度的曲线。默认值 3 可大致直观地线性更改粗糙度,但由于这可能非常主观,并具体取决于进一步颜色处理,因此它显示于此处

左图:高光(光泽度=1.0)。中图:光泽 右图:纹理贴图光泽度
左图:高光(光泽度=1.0)。
中图:光泽
右图:纹理贴图光泽度

镜面反射组件

镜面反射组件提供类似镜面的反射。它类似于光泽度设置为 1 时的 mia_material 反射着色。它也可以与 MDL 中使用的镜面反射基本 BSDF 关联。下面是相关参数:

mila_specular_reflection
    "mila_specular_reflection" (
        color   "tint"               default 1 1 1,

        boolean "use_max_dist"       default off,
        scalar  "max_dist"           default 0.0,
        boolean "use_max_dist_color" default off,
        color   "max_dist_color"     default 0 0 0,

        scalar  "direct"             default 1.0,
        scalar  "indirect"           default 1.0
    )


tint
是反射颜色。
use_max_dist
启用对光线长度的限制。启用此参数并将 max_dist 设为非零的值之后,可以限制反射光线投射的实际距离(为了提升性能或获得效果)。这些光线将会褪色为环境颜色(当 use_max_dist_color 被禁用时)或提供的 max_dist_color(如果该参数已启用)。
“Mila 内使用最大距离”开/关(字符串选项)
仅在透射对象(如玻璃)内进行反射时使用以上选项。这对于校正有色玻璃内的颜色很有用。通常,此选项与透射组件内颜色的设置保持一致。

光泽透射组件

实施方式与 mia_material 折射部分基本相同 - 像以前一样,建筑库文档中将包含此处未介绍的所有内容。

mila_glossy_transmission
    "mila_glossy_transmission" (
        color   "tint"                default 1 1 1,
        scalar  "roughness"           default 0.0, #: min 0.0 max 1.0
        scalar  "quality"             default 1.0, #: min 0.0 softmax 2.0
        scalar  "ior"                 default 1.2,
        
        scalar  "anisotropy"          default 1.0,
        scalar  "aniso_angle"         default 0,
        integer "aniso_channel"       default -1,

        boolean "use_max_dist"       default off,
        scalar  "max_dist"           default 0.0,
        boolean "use_max_dist_color" default off,
        color   "max_dist_color"     default 0 0 0,
        
        scalar  "direct"        default 1.0,
        scalar  "indirect"      default 1.0
    )


tint
指应用于曲透射/折射的颜色(这是一种简易的方法,用于为透明对象的着色进行建模。详细信息将在后面作具体介绍)
roughness
指造成透射的材质的粗糙度,范围值位于 0.0(类似镜面的平坦透射)到 1.0(漫反射)之间。
quality
控制用于光泽透射的光线数。光线计数将基于粗糙度和组件相对于所有组件的重要程度(并结合光线的重要程度)进行调整。此局部着色器值也将与全局“Mila 光泽质量”字符串选项相乘,因此场景中的所有光泽着色器可受单一控制影响。
ior
是表面折射的索引。如果光线从对象内部照射到外部(如法线向量定义的那样),并且设定包含 mila_materialthin_walled 参数,则使用此值的反向值。
anisotropy
是表示等向折射的 1.0。实际值是折射光锥的 U 扩散与 V 扩散的比值,这意味着大于 1.0 和小于 1.0 的值均有效,也就是说该值是折射的“U 向量比例因子”。
aniso_angle
定义在 UV 空间内各向异性的旋转,aniso_channel 定义从其衍生 U 和 V 方向的纹理贴图通道。如果将该参数设为 -1,则计算基于对象空间的默认规范方向(与任何纹理坐标空间都无关)。
use_max_dist
启用对光线长度的限制。启用此参数并将 max_dist 设定为非零的值之后,可以限制折射光线投射的实际距离(为了提升性能或获得效果),也可以为适当的体积衰减效果建模。禁用 use_max_dist_color 后,折射光线将褪色为黑色(然后完全停止以提高性能)。如果启用 use_max_dist_color,则光线将褪色为 max_dist_colormax_dist 的范围,进行正确的指数级衰减,以便在两倍于 max_dist 的距离处,光线也会发生两倍的衰减等等,就像穿过吸收介质一样。相对于改变表面的颜色来说,这种为彩色折射建模的方式更为逼真。这一点将在 mia_material 文档中详细介绍。
“mila 传播 alpha”开/关,对于 mila_transparency(字符串选项)默认值为开
启用该参数后,将会通过透明度传递背景的 Alpha 值。此参数在某些情况下可能会非常有用,但在多数合成使用案例中,您真正需要做的是将 mila_glossy_transmission 替换为 mila_transparency,这暗示着始终通过后者传递 Alpha 值(以及其他所有帧缓冲区)。

左图:高光(光泽度=1.0)。中图:光泽 右图:使用体积衰减
左图:高光(光泽度:=1.0)。
中图:光泽和全面着色
右图:使用体积衰减

镜面反射透射组件

实施方式与 mia_material 折射部分基本相同 - 像以前一样,建筑库文档中将包含此处未介绍的所有内容。

mila_specular_transmission
    "mila_specular_transmission" (
        color   "tint"               default 1 1 1,
        scalar  "ior"                default 1.2,
        
        boolean "use_max_dist"       default off,
        scalar  "max_dist"           default 0.0,
        boolean "use_max_dist_color" default off,
        color   "max_dist_color"     default 0 0 0,
        
        scalar  "direct"             default 1.0,
        scalar  "indirect"           default 1.0
    )


tint
指应用于曲透射/折射的颜色(这是一种简易的方法,用于为透明对象的着色进行建模。详细信息将在后面作具体介绍)
ior
是表面折射的索引。如果光线从对象内部照射到外部(如法线向量定义的那样),并且设定包含 mila_materialthin_walled 参数,则使用此值的反向值。
use_max_dist
启用对光线长度的限制。启用此参数并将 max_dist 设定为非零的值之后,可以限制折射光线投射的实际距离(为了提升性能或获得效果),也可以为适当的体积衰减效果建模。禁用 use_max_dist_color 后,折射光线将褪色为黑色(然后完全停止以提高性能)。如果启用 use_max_dist_color,则光线将褪色为 max_dist_colormax_dist 的范围,进行正确的指数级衰减,以便在两倍于 max_dist 的距离处,光线也会发生两倍的衰减等等,就像穿过吸收介质一样。相对于改变表面的颜色来说,这种为彩色折射建模的方式更为逼真。这一点将在 mia_material 文档中详细介绍。


透明度组件

透明度(不发生折射,而是“直接穿过”透明度)

mila_transparency
   "mila_transparency" (
       color  "transparency" default 1 1 1
   )
透明度
曲面透明度,通常当其顶部的反射层使用菲涅尔定向依赖权重时,使用薄壁。这将为曲面的薄玻璃类型建模。当与菲涅尔外层混合时,非薄壁对象具有透明度(即直接穿过光线)不会有实际意义,因为在这种情况下,材质折射率不一致。另一方面,对于薄壁而言,材质内部的 ior 被视为 1.0,因此透明度将是对镜面反射透射的有效替换。

透明度与透射/折射

请务必要了解分层着色器中透明度折射在概念上的区别

此外,在技术上还有一个非常重要的区别,那就是透射由实际的 mila_glossy_transmission 着色器实现,而透明度由分层根节点实现(如帧缓冲区页面所述),并且作为元信息围绕着色树进行真正传播。

但这一点对最终用户而言不太重要。从最终用户的角度而言,重要的区别在于不管您何时希望光线直接穿过,透明度都适用,透明度可用于:

例如,创建实心玻璃球体表示应用折射镜面反射透射组件顶层上分层的菲涅尔权重镜面反射组件。创建“空心”玻璃球体(考虑直升机的座舱罩或肥皂泡),则是在透明度组件上应用一个类似的菲涅尔权重的反射组件。这两者之间的区别类似于在 mia_material 中使用 thin_walled 参数

左图:完全透明(看不到)。中图:纹理贴图透明度 右图:使用透明度获得薄壁效果
左图:完全透明(看不到)。
中图:用作裁切的纹理贴图透明度
右图:使用透明度获得薄壁效果


漫反射透射(半透明)组件

实施方式与 mia_material 半透明基本相同

mila_diffuse_transmission
   "mila_diffuse_transmission" (
        color   "tint"         default 1 1 1,
        scalar  "roughness"    default 0,
        scalar  "quality"      default 1.0,          #: min 0 softmax 2.0

        scalar  "direct"       default 1.0,
        scalar  "indirect"     default 1.0
    )

这是一个非常简单的着色器,仅会在面上进行漫反射透射,因此仅在“薄”几何体中真正有用,从而使得后面的灯光可以射穿。

tint
是从表面后方进入前方的漫反射灯光的量
indirect
是间接照明的百分比(通常为 1.0)
半透明对象(仅四元对象):简单的漫反射透射
半透明对象(仅四元对象):简单的漫反射透射

发射组件

允许将其他颜色添加到着色,如同表面呈放射性一样

mila_emission
   "mila_emission" (
       color    "tint"         default 1 1 1,
       scalar   "intensity"    default 10
   )

这是一个非常简单的着色器,仅会添加一个常量值,不过是以一种可组合的方式来添加。超出该值不会执行任何复杂的操作,并且如果启用了 FG,将仅会拾取所有“发射的”灯光。

color
是发射(添加)的灯光的颜色。
intensity
是强度。
发射 - 简单的附加颜色
发射示例。
左图:仅发射
中图:在顶部发射,以栅格形式进行发射
右图:在最低级别发射,通过裂缝渗入。看上去就像一个爆炸的星球一样。

次表面散射组件

这是一种全新的次表面散射实施方法,渲染外观与 misss_fast_shader2 类似,但不使用光照贴图。

在旧的 SSS 着色器中使用光照贴图会引发问题,原因有如下几个:

次表面散射 (SSS) 着色器将使用“延迟评估”技术,其中灯光暂时存储(缓存)在可二次填充的缓冲区中,该缓冲区可在渲染时被所有核心访问。因此,即使在同一灯光需要计算两次(由于缓冲区大小溢出)的情形下,也可以在多个核心上并行完成操作。所以说,虽然使用预计算的光照贴图的旧 SSS 着色器在计算了光照贴图速度可能会更快一些,但这些新 SSS 着色器(实时计算相同的信息)往往在整体上更胜一筹,因为所有核心均可以正确使用。

因此,所有参数都位于单个着色器上,而不是像使用旧的 misss_fast* 着色器时那样被拆分成光照贴图和着色阶段。

在大多数情况下,这种着色器是现在进行 SSS 的首选方法,而且如果您希望进行高效分层,尤其是进行蒙皮渲染,通常就应该摈弃那些旧的 misss_fast* 着色器。有关这一点的详细信息,请查看教程页面

mila_scatter
    "mila_scatter" (
        color   "front_tint"       default 1.0 1.0 1.0,
        scalar  "front_weight"     default 1.0,
        vector  "front_radius"     default 20 10 5,
        color   "front_radius_mod" default 1 1 1,
        
        color   "back_tint"        default 1.0 1.0 1.0,
        scalar  "back_weight"      default 1.0,
        vector  "back_radius"      default 20 10 5,
        color   "back_radius_mod"  default 1 1 1,
        scalar  "back_depth",      # unassigned (zero) means "same as radius"
        
        scalar  "sampling_radius_mult"  default 2.0,
        
        scalar  "light_storage_gamma"   default 0.75,
        scalar  "scale_conversion"      default 1.0,
        
        integer "resolution"            default 2,
        scalar  "quality"               default 1.0,

        scalar  "direct"                default 1.0,
        scalar  "indirect"              default 1.0
    )

此新的着色器仍使用与旧的 misss_fast* 着色器相同的分段方法,即分为“前向”和“后向”(有关“前向”和“后向”的详细信息,请参见该手册中的“次表面”库)。但是,在大多数的日常案例中,您会将这些参数设置为相同的值,因为散射的着色现在通过按颜色的散射半径来完成,这样红色(举例)就可以自动进行进一步的散射。这意味着,通过自动方式对红色进行“后向”散射,而非手动执行该操作。<&p>

同时,这也意味着该着色器本身仍在基于屏幕的坐标空间内工作。虽然新参数更接近“物理”散射的工作方式,但该着色器仍有点小“技巧”,并不是绝对准确 - 而是极其注重视觉效果

下面是相关参数:

front_tint
front_weight
是“前向”散射的颜色和权重(数量)。权重值通常停留在 1.0,因为需要经常控制包含 mila_layer 的数量
front_radius
是一个具有三个不同半径的向量,这三个半径分别对应于红色、绿色和蓝色灯光。通常,红色散射半径最大,绿色次之,蓝色最小。请注意,衰减是指数级的,且不会硬性停止(这一点不同于旧的 misss_fast_shader 着色器),所以此处设置的值处于灯光减弱到其原始强度的 10% 的距离处,而不是强度为零的距离。
front_radius_mod
是颜色参数,允许修改散射半径。此参数便于应用纹理贴图,以便在整个表面上更改散射半径;纹理可在普通的黑到白的范围内变化,乘以在 front_radius 参数中设置的值。
back_tint
back_weight
back_radius
back_radius_mod
back_depth
与其对应的 front_* 对象的工作方式相同。唯一的区别是,有一个用于定义散射“深度”的 back_depth 参数。默认情况下,该值为 0.0,这意味着散射是一致的(在深度和宽度上距离相同)
sampling_radius_mult
是在 front_radius 或 back_radius 中设置的最大半径的倍增,所有采样实际上都来自该半径内。因此,如果这些半径的最大值为 10 个单位,那么将此参数设置为 2.0 时,实际上会在 20 个单元的距离内进行采样,完全忽略该半径之外的所有灯光。如果此值过小,可能会产生可见的散射硬中止。如果此值过大,则大量采样会浪费在贡献非常小的远端采样上,由于衰减是指数级的,且散射半径参数定义为“产生 10% 贡献的距离”,因此最远的采样的贡献是 10% 的幂次方,此参数作为指数(2 = 1%、3 = 0.1%、4 = 0.01% 等)。
light_storage_gamma
在着色器存储灯光之前应用于漫反射角度分布(通常是 Lambertian 余弦)。通常情况下,此值略小于 1,这是余弦函数提升到的幂。提升到小于 1 的幂的余弦会将其“展平”,并使凸起“更宽”以扩散出更多灯光,并帮助对散射进行外观模拟。默认值是 0.75。当使用旧的 misss_fast... 着色器时,这相当于在 misss_lambert_gamma 着色器中使用的 gamma 值。
scale_conversion
是应用于给定半径测量的除法器,以将给定的值映射至实际场景单位。举例来说,将 front_radius 设置为 10、5、2 并将 scale_conversion 设置为 10 后,应用的有效半径为 1、0.5、0.2
indirect
是应用于任何投射到着色器的间接照明的倍增
resolution
定义灯光存储的实际分辨率。存储在屏幕空间内大致完成,1 表示“与渲染采用同一分辨率”,2 表示“采用渲染二分之一的分辨率”,3 表示“采用渲染三分之一的分辨率”,以此类推,0 适用于特殊情况,即“采用渲染两倍的分辨率”。默认值为 2(二分之一的分辨率),此值通常就足够了。特殊值 -1 是 3.13 中的新增功能,它意味着强力计算,每个交点不会根据以前存储的值进行插值。它对特别静距离的特写镜头非常有用。
quality/“mila 散射质量”(字符串选项)
将控制存储的灯光值的映射过程中采用的采样数。与局部质量相比,更倾向于使用全局字符串选项。还可能会受跟踪深度和其他注意事项的影响,以便更好地进行优化。还请注意,sampling_radius_mult 参数的影响巨大,多数情况下应避免出现…默认值 2 将以最大半径距离(前面或后面)的两倍进行采样,主要依据过滤器权重为 1% 而定。

左图:仅 SSS 层。中图:SSS + 漫反射(为了看到凹凸效果)右图:SSS + 漫反射 + 反射
左图:仅 SSS。
中图:SSS + 漫反射(为了看到凹凸效果)
右图:SSS + 漫反射 + 反射