遮挡

环境光遮挡

遮挡是一种快速且简单的用于模拟全局照明效果的方法。遮挡是由其他几何体覆盖的点上方的区域的范围。此操作可以通过跟踪点上方的半球形区域中的探查光线和测试此区域被阻止的范围来实现。

此着色器的典型用途是环境光遮挡,其中着色器用于缩放环境光贡献(反过来,该环境光贡献可能来自漫反射环境的贴图着色器)。对于此用途,就像 mib_illum_phong 一样应将该着色器指定给材质的 ambient 参数。

遮挡的另一个用途是反射遮挡,其中着色器用于缩放来自反射贴图的贡献。对于此用途,着色器通常是插入到环境中或材质的反射着色器窗口,而实际的环境贴图图像是插入到 bright 参数。另一种是可允许遮挡着色器返回值以调整反射贴图着色器的强度属性。

第三个用途是创建外部合成的文件,其中将遮挡着色器指定为场景中每个对象的主材质着色器。该输出可用于调整其他渲染过程,从而在后期制作中实现适当的合成。

该着色器还可用作灯光着色器。光源必须是用户类型的区域光。这将生成具有内置遮挡的“环境”光源。

该着色器仅取决于由 mental ray 提供的基础光线跟踪特征,并不使用、也不受益于类似于最终聚集或全局照明的高级计算。

mib_amb_occlusion
color "mib_amb_occlusion" (
    integer         "samples"            default 16,
    color           "bright"             default 1 1 1 1,
    color           "dark"               default 0 0 0 0,
    scalar          "spread"             default 0.8,
    scalar          "max_distance"       default 0,
    boolean         "reflective"         default off,
    integer         "output_mode"        default 0,
    boolean         "occlusion_in_alpha" default off
    # Version 2 parameters
    scalar          "falloff"            default 1.0,
    integer         "id_inclexcl"        default 0,
    integer         "id_nonself"         default 0)
samples
是指将要发送的探查光线数。更多光线将产生更平滑的图像。遮挡贴图永远没有调整好的最终聚集或光子平滑,但计算方便。
bright
是指未找到遮挡对象时使用的颜色。
dark
是指出现完全遮挡时使用的颜色。在大多数实际案例中设置为黑色。对于部分遮挡,将返回 brightdark颜色之间的逐渐混合。
spread
定义点上方的要进行采样的半球区域大小。该值定义围绕采样方向的圆锥体,值越小越窄,值越大越宽。其范围从 0.0(单一方向的圆锥体)到 1.0(覆盖整个半球的圆锥体)。
max_distance
是指要探查几何体所在的范围。如果此值为零,将对整个场景进行采样。如果为非零值,则仅考虑此距离内的对象(这使得采样速度加快),此范围之外的对象一点根本不会遮挡,随着距离逐渐接近零,越近的对象遮挡得越厉害。
reflective
如果禁用,则在基于曲面法线的圆锥体区域中执行采样。如果 reflective 处于启用状态,采样将改为围绕反射方向而分布。这将生成反射遮挡,可极大地增强反射贴图的真实感。
output_mode
定义返回的颜色:0 启用标准遮挡行为;1 启用环境采样。此操作会略微更改着色器的行为。当探查遮挡的方向时,也会根据特定方向的遮挡方式对当前的环境进行采样和加权。在模式 1 中,函数的输出是收集的与 bright 颜色相乘的加权环境颜色,并适当地添加了 dark 颜色。
如果将 output_mode 设置为 2,则启用弯曲法线。会计算并返回以颜色编码(其中红色为 x,绿色为 y,蓝色为 z)的平均无遮挡的世界空间法线方向。将 output_mode 设置为 3 与设置为 2 相同,但法线将改为在摄影机坐标空间进行编码。
occlusion_in_alpha
如果启用,则无论 output_mode 设置为何值,标量遮挡值会置入返回的颜色 Alpha 分量中。其他颜色分量将保持原样。
falloff
仅当 max_distance 为非零时起作用,并定义按距离衰减遮挡的速度。从技术上讲,它是应用于从 0 到 max_distance的规格化距离的幂函数。默认值 1.0 表示线性衰减。值小于 1.0 会加快衰减速度。实际上,这表示值越小,距离越短(在小角度和裂缝中),遮挡效果越明显,距离越远,遮挡效果越弱。
id_inclexcl
定义着色器进行遮挡时要包含(或排除)的对象实例标签编号。设置为 0 时,参数不会产生任何效果。正整数表示仅带有与此数字匹配的标签的对象实例才会发生遮挡。负值时情况相反,即包括除带有匹配标签的那些对象实例之外的所有对象实例。
id_nonself
类似于 id_inclexcl ,其中对象实例标签确定哪些对象不进行自遮挡。设置为 0 时,不会产生任何效果。设置为正整数将防止任何带有该标签的对象遮挡带有相同标签的其他对象。由于背景照片中已存在这些对象之间的所有相互遮挡,这对在照片背景中表示现有几何体的“蒙版”或“替代”对象十分有用。仅排除 id_inclexcl 无法用于这种情况,因为遮挡是由“替代”背景几何体投射到前景几何体,反之亦然,这两种情况都是所需的,只需禁用背景到背景的遮挡。

快速遮挡

此着色器是 mib_amb_occlusion 的替代版,与其相比,具有相似的功能,但完全利用了在 mental ray 中内置的环境光遮挡功能。如果启用,可提供最佳渲染性能,并可能会从环境光遮挡缓存中受益。

请注意,该着色器不可用作灯光着色器。

mib_fast_occlusion
color "mib_fast_occlusion" (
    integer "samples"            default 0,
    color   "bright"             default 1 1 1 1,
    color   "dark"               default 0 0 0 0,
    scalar  "spread"             default 0,
    scalar  "spread_exp"         default 1,
    scalar  "max_distance"       default 0,
    boolean "reflective"         default off,
    integer "output_mode"        default 0,
    boolean "occlusion_in_alpha" default off,
    integer "cache_points"       default 0)
samples
是指将要发送的探查光线数。更多光线将产生更平滑的图像。如果启用环境光遮挡缓存,会忽略该属性:用于缓存插值的点数是由 cache_points 属性控制,请参见下文。
bright
是指未找到遮挡对象时使用的颜色,dark 是指出现完全遮挡时使用的颜色。在大多数实际案例中设置为黑色。对于部分遮挡,将返回这两种颜色之间的逐渐混合。
spread
定义点上方的要进行采样的半球区域大小。与 mib_amb_occlusion 着色器不同,此值是法线与最大方向之间的角度的余弦。其值范围从 0.0(覆盖整个半球的圆锥体)到 1.0(单一方向的圆锥体)。
spread_exp
是指扩散角度的指数。它控制从采样点发出的光线围绕法线进行集中的方式。较大的值意味着围绕法线的密度越大。
当前不受 mental ray 的支持,仅仅为将来进行扩展时使用。
max_distance
是指要探查几何体所在的范围。如果此值为零,将对整个场景进行采样。如果为非零值,则仅考虑此距离内的对象(这使得采样速度加快),此范围之外的对象一点根本不会遮挡,随着距离逐渐接近零,越近的对象遮挡得越厉害。
reflective
如果禁用,则在基于曲面法线的圆锥体区域中执行采样。如果 reflective 处于启用状态,采样将改为围绕反射方向而分布。这将生成反射遮挡,可极大地增强反射贴图的真实感。
output_mode
定义返回的颜色:0 启用标准遮挡行为;1 启用环境采样。此操作会略微更改着色器的行为。当探查遮挡的方向时,也会根据特定方向的遮挡方式对当前的环境进行采样和加权。在模式 1 中,函数的输出是收集的与 bright 颜色相乘的加权环境颜色,并适当地添加了 dark 颜色。
如果将 output_mode 设置为 2,则会启用弯曲法线。会计算并返回以颜色编码(其中红色为 x,绿色为 y,蓝色为 z)的平均无遮挡的世界空间法线方向。将 output_mode 设置为 3 与设置为 2 相同,但法线将改为在摄影机坐标空间进行编码。
occlusion_in_alpha
如果启用,则无论 output_mode 设置为何值,标量遮挡值会置入返回的颜色 Alpha 分量中。其他颜色分量将保持原样。
cache_points
用于控制环境光遮挡点的数量,以便在环境光遮挡缓存查找插值。如果后者未启用,则该属性将会被忽略。值为 0 时意味着环境光遮挡点的数量将取决于 mental ray 设置,任何大于 0 的值都会覆盖当前对象的设置。值小于 64,结果更为精确,但会出现瑕疵。较高的值会产生模糊的图像。

使用最终聚集的环境光遮挡

mental ray 中的最终聚集算法始终会计算标量遮挡值。此工具的着色器仅将该值作为灰度结果返回。

mib_fg_occlusion
color "mib_fg_occlusion" (
color "result_when_fg_is_off" default 1 1 1 1
)
version 1
result_when_fg_is_off
在最终聚集处于禁用状态时会成为返回值。最终聚集处于启用状态时,则遮挡值将作为灰度值返回,并且永远不会运算或使用此参数。
因此,如果将 mib_amb_occlusion 连接到 result_when_fg_is_off 参数,则当最终聚集处于启用状态时,结果是由最终聚集计算的遮挡,而当最终聚集处于禁用状态时,结果是由 mib_amb_occlusion 计算的遮挡。

弯曲法线

“弯曲法线”是一种用于表面点的平均无遮挡方向向量的术语。对于完全无遮挡表面来说,与法线向量相同,但对于被其他几何体遮挡的表面来说,它指向找到最少数量的遮挡几何体的方向。弯曲法线用作环境光遮挡加速技术,允许类似于全局照明的快速渲染和由环境在一小段渲染时间照明的最终聚集。

环境光遮挡与 mib_amb_occlusion 着色器一样,应用一种光线跟踪技术,即尽可能投射大量探查光线以确定要被遮挡的表面点的范围。此操作的速度取决于光线数 (samples)、光线范围 (max_distance) 和场景的复杂程度。

渲染动画(或同一场景中的多个视图)时,未移动的任意对象、未改变形状的任意对象或附近没有移动的遮挡对象的任意对象每一帧都会产生相同的结果。因此,可以在第一个渲染过程中“烘焙”(渲染到文件)一次环境光遮挡解决方案,然后对任何数量的帧,在后续的渲染过程中重用此结果,可能会得到很高的性能。如果还将平均无遮挡方向(弯曲法线)“烘焙”到纹理,则会将基于环境给对象照明的整个过程移至第二个渲染过程,而不用跟踪单个光线。

通过将 output_mode 参数设置为 2、3 或 4(在环境光遮挡着色器 mib_amb_occlusion 中),将返回向量被编码为颜色(其中 x 为红色,y 为绿色,z 为蓝色)的弯曲法线。如果 occlusion_in_alpha 处于启用状态,该标量遮挡值会在 Alpha 通道中返回。此颜色可以烘焙到纹理,例如,使用 mib_lightmap_writemib_amb_occlusion 连接到 input 参数和渲染。

一旦生成纹理文件,就可将 mib_bent_normal_env 指定给表面着色器(例如, 指定给 mib_illum_phong 的 ambient 参数以查找环境光,从而基于烘焙弯曲法线纹理给对象照明,该法线纹理 置于 mib_bent_normal_env 的 bent_normals 参数中。

这样可以针对刚体对象执行类似全局照明效果的超低开销模拟,并且特别适用于动画。此技术不适用于可变形对象,因为可变形对象的遮挡、形状和法线从帧到帧会进行变化。对于可变形对象,最好直接应用遮挡着色器,而不烘焙其输出。

mib_bent_normal_env
color "mib_bent_normal_env" (
    color           "bent_normals"        default 0 0 0 1,
    boolean         "occlusion_in_alpha"  default on,
    color           "occlusion"           default 1 1 1,
    scalar          "strength"            default 0.2,
    shader          "environment",
    integer         "coordinate_space"    default 2,
    integer         "env_samples"         default 1,
    scalar          "samples_spread"      default 0.0,
    transform       "matrix"              default 1 0 0 0
                                                  0 1 0 0
                                                  0 0 1 0
                                                  0 0 0 1
)
bent_normals
是指由遮挡着色器输出的弯曲法线数据。需要烘焙到对象。通常附加到执行纹理查找(如 mib_texture_lookup)的节点上。用于生成纹理的纹理贴图必须与用于查找的纹理贴图匹配。
occlusion_in_alpha
指定标量遮挡值是否已烘焙到“弯曲法线”过程的 Alpha 通道。此选项使用更少的内存,但 mental ray 的 OEM 集成的许多“烘焙到纹理”功能不会烘焙 Alpha 通道。
occlusion
是指单独的遮挡通道,在尚未将其烘焙到 Alpha 通道的情况下,可以使用该通道。
strength
是指针对效果所做的简单标量倍增。
environment
是指要查找的环境着色器。如果未提供,可使用材质中的环境。为避免图像噪波,通常需要使用单独的、不使用高分辨率细节的高模糊环境贴图。
coordinate_space
定义弯曲法线的坐标系空间:
坐标空间编号与环境光遮挡着色器的 output_mode 参数值匹配,其中 2 是世界空间,3 是摄影机空间,4 是对象空间。
env_samples
是指要从环境贴图中采样的采样数。通常,使用高度模糊环境贴图时,仅使用单个采样即可,但通过设置非零值,可以对环境贴图进行多重采样。
sample_spread
是指每个单个环境采样的扩散因子。范围从 0.0(无限的细光线 - 单个采样)到 1.0(对整个半球进行采样)。
matrix
是指 coordinate_space 为 1时,应用于法线数据的显式变换矩阵。该选项可实现任意变换。

Copyright © 1986, 2015 NVIDIA ARC GmbH. All rights reserved.