光线跟踪
反射
投射具有给定颜色的反射光线,并将结果与输入颜色合并。使用该着色器可将反射效果添加到提供照明的基础着色器中,可以与其他基础着色器添加的折射或透明效果相结合。如果不能投射反射光线(因为已超出跟踪深度或反射光线导致着色器调用失败,或已设定 notrace 参数),则对环境(如果有)进行采样。
mib_reflect
color "mib_reflect" (
color "input",
color "reflect",
boolean "notrace")
- input
- 合成反射所用的颜色。
- reflect
- 将反射混合到输入的 RGBA 颜色。透明黑色返回输入颜色而不投射反射光线;不透明白色返回反射颜色而不估算输入颜色。
- notrace
- 如果设定为 true,避免着色器投射反射光线,而是对环境进行采样。
折射
以某一折射率投射具有给定颜色的折射光线,然后将结果与输入颜色合并。可以使用另一个基础着色器(例如 mib_refraction_index)计算折射率,该值还会存储回相应的状态变量。使用该着色器可将折射效果添加到提供照明的基础着色器中。
mib_refract
color "mib_refract" (
color "input",
color "refract",
scalar "ior")
- input
- 合成折射所用的颜色。
- refract
- 将折射混合到输入的 RGBA 颜色。透明黑色返回输入颜色而不投射折射光线;不透明白色返回折射颜色而不估算输入颜色。
- ior
- 折射率的比率;进入对象的折射率除以离开对象的折射率。控制出射光线的方向。如果为 0,则使用 1,从而将折射率降低到透明度。
透明度
投射具有给定颜色的透明光线,并将结果与输入颜色合并。此函数与假定折射率为 1 的上一函数类似。
mib_transparency
color "mib_transparency" (
color "input",
color "transp")
- input
- 合成折射所用的颜色。
- transp
- 将透射混合到输入的 RGBA 颜色。透明黑色返回输入颜色而不投射透明光线;不透明白色返回透明颜色而不估算输入颜色。
继续
继续具有给定颜色的光线,并将结果与输入颜色合并。用途是继续光线,好像当前相交点不存在。体积计算的跟踪深度、光线类型和距离不会修改。典型用途是展示厅的墙,在这种情况下,摄影机位于外部,以便该房间的墙必须被忽略。
mib_continue
color "mib_continue" (
color "input",
color "transp")
- input
- 合成继续光线所用的颜色。
- transp
- 将透射混合到输入的 RGBA 颜色。透明黑色返回输入颜色而不投射光线;不透明白色返回透明颜色而不估算输入颜色。
不透明度
投射具有给定强度的透明光线,并将结果与输入颜色合并。该函数与上一个函数类似,只是给定不透明度而不是透明度。不透明度被定义为“1.0 - 透明度”。
mib_opacity
color "mib_opacity" (
color "input",
color "opacity")
- input
- 合成折射所用的颜色。
- opacity
- 将透射混合到输入的 RGBA 颜色。不透明白色返回输入颜色而不投射透明光线;透明黑色返回透明颜色而不估算输入颜色。
电介质
折射的另一种变体,增加了高光反射度(Snell 定律)。该着色器只执行绝缘体材质的折射部分;高光保留给其他照明节点。
mib_dielectric
color "mib_dielectric" (
color "input",
color "absorb",
scalar "refract",
scalar "ior")
- input
- 合成折射所用的颜色。
- absorb
- 指定曲面的外侧吸收系数。
- refract
- 将折射混合到输入。值为 0.0 将返回输入颜色不投射折射光线;值为 1.0 将返回折射颜色而不估算输入颜色。
- ior
- 折射率的比率;进入对象的折射率除以离开对象的折射率。控制出射光线的方向。如果为 0.0,则使用 1.0,从而将折射率降低到透明度。
体积雾
这是一个简单的雾着色器。该着色器作用于以前运行的着色器提供的结果颜色(通常来自光线远端的材质着色器),然后基于光线长度将结果颜色褪色为雾颜色。在最大距离内执行褪色,否则雾颜色将被视为纯色。雾颜色允许具有 Alpha 值,用于限制雾的最大不透明度。例如,如果将雾颜色附加到纹理着色器,则允许透明体积效果,例如烟或火(将 max 设定为 0 可避免褪色)。
mib_volume
color "mib_volume" (
color "color",
scalar "max",
boolean "lightrays")
- color
- 雾颜色。着色器的结果颜色基于穿行的光线长度褪色为此颜色。
- max
- 应执行褪色的最大内部空间距离。超过该距离的雾将被视为纯色。
- lightrays
- 如果为 true,该着色器还适用于光线,否则它对光线不起作用。应启用此选项以获得正确结果,但如果光线数量非常多,则付出的代价会很高。
光线行进器
Ray Marcher 从给定光线上的点投射光线,近似于透过该体积发射光线的光源的体积贡献。该着色器不使用诸如 mi_sample_light 等着色器界面函数,而是调用作为类型 shader 的输入参数提供的着色器。光线行进包括为光线起点与终点之间的常规点调用着色器,如果两个相邻着色器调用返回的颜色值小于给定的对比度阈值,则以自适应方式细分每个间隔,直到达到指定的细分限制为止。返回加权总和。
mib_ray_marcher
color "mib_ray_marcher" (
shader "shader",
scalar "distance",
integer "num",
integer "subdiv",
color "contrast")
- shader
- 在每个采样点调用的着色器。除非着色器失败(返回 false),否则其返回的颜色与返回的总计相加。
- distance
- 两个初始采样点之间的最大内部空间距离。如果该距离为 0,则不会强制最大距离。
- num
- 给定距离内的初始采样数。如果此数量为 0,则不给定初始采样数,光线行进器将依赖最小距离。如果两者都为 0,则默认数量为 4。如果数量不为 0,则必须至少是 2(每个光线端点一个)。
- subdiv
- 指定初始采样密度的递归细分数。值为 0(默认值)表示不细分,因此光线行进器将限制到初始采样点。值为 1 或更大值表示进行自适应采样;细分的每个级别将距离除以二。最大值为 16。
- contrast
- 如果两个相邻采样的绝对差值超过该值,则会在中间进行另一个采样。然后,针对这两个子分段以递归方式重复该过程,直到对比度非常低或达到细分限制。
双面
选择一种或另一种输入颜色,具体取决于投射到几何体哪一侧。该着色器通常用作多路复用材质着色器,将其他两个材质着色器指定给前向和后向参数。
mib_twosided
color "mib_twosided" (
color "front",
color "back")
- front
- 如果投射到前侧,则返回。
- back
- 如果投射到后侧,则返回。
折射率
基于父光线的扫描(不基于法线向量;如果场景包含可疑几何体(例如,仅在尖端具有一个与轴对齐的法线的圆锥体),这可能不可靠)确定光线是进入还是离开它投射到的对象。将返回折射率比(出射除以入射)。产生的副作用是,折射的入射率和出射率都存储在 state(分别为 ior_in 和 ior)中;如果光线进入,则当前的体积着色器成为折射体积。
mib_refraction_index
struct {
scalar "ior",
boolean "enter"
} "mib_refraction_index" (
scalar "mtl_ior")
- ior
- 返回的折射率比,可用于折射或电介质基础着色器。
- enter
- 如果光线进入对象,则为 true。大多数着色器无需知道这一点,但它可使此基础着色器的功能更全面。
- mtl_ior
- 光线投射到的材质的折射率。它描述光线是进入还是离开对象的光学特性,并作为新的折射率返回(如果光线是进入对象)。
光泽度
本部分中介绍的着色器是用于生成光泽(模糊)反射和折射的方法。以下内容阐述了这些着色器与物理 DGS 着色器之间的性能和可用性差异:
- 多采样光泽度(与单采样)
- 有界限的距离反射/折射
- 环境的欠采样
- 不需要显式 UV 向量的各向异性(与需要的导数向量)
- 法线向量扰动(与方向向量扰动)。
- 菲涅尔效应
- 色度色差
多采样光泽度
DGS 着色器投射一条光泽光线以进行反射和折射,这依赖于整个图像的过采样(具有关联的性能损失),以平均突出模糊的采样。每条光线都是一个新的独立采样。
相反,mib_glossy_* 着色器将进行多个光泽光线采样,从而导致仅在光泽表面(而不是整个图像)上进行过采样。采样使用 mental ray 严格确定的采样引擎创建,因此可以创建更吸引人的采样图案,从而以相同数量的采样可产生“外观更棒”的模糊。
DGS(左)与 mib_glossy_reflection(右)
上面的图像使用 samples 0 1 渲染,用户可以在左侧清楚地看到粗糙的结果。若要获得平滑结果,用户需要增加整个图像的采样。相反,mib_glossy_* 处理自己的过采样(在该示例中为8 个采样)并仅在光泽表面本身上应用。
有界限的距离反射/折射
虽然在反射情况下是严格非物理的,但是 mib_glossy_* 着色器允许限制反射光线和折射光线的范围。这样有助于消除因远距离的反射/折射对象导致的图像噪波,并可以极大地改善性能。
无限反射(左)与有限距离(右)
环境的欠采样
mib_glossy_* 着色器的一个目标是,通过过滤出远处的对象并替换为一种材质(对于折射)或环境(对于反射)来避免远距离图像噪波。但是,若要避免采样(比如环境)中噪波过量,反射着色器会特意对环境进行单采样(甚至还可以为其传递一个显式预模糊环境)以移除噪波。
不需要显式 UV 向量的各向异性
这些着色器将使用显式传递的 UV 向量进行各向异性光泽反射/折射,但如果显式向量丢失(设定为 0,0,0),将尝试计算其本身。
法线向量扰动
DGS 着色器计算镜面反射或折射的方向,然后在
shiny 函数确定的范围内扰动此方向。相反, mib_glossy_*
着色器模拟光泽度,仿佛反射或折射之前微面位于曲面中。这意味着,反射和折射方向的计算方法为:实际扰动法线向量(模拟微小级别的粗糙曲面),然后基于更改的法线计算新的反射或折射方向。
很显然,这样会产生不同的结果,并使光泽度与视图方向有关。例如,地板上反射的光泽度图案将被垂直拉伸。看水上的日落时会看到同样的效果,这时太阳的反射似乎被垂直拉伸为长条纹的日光。
DGS 着色器(左)与 mib_glossy_reflection(右)
菲涅尔效应
大多数反射材质在掠射角会反射更多光线,而透明材质在正面角度会透射更多光线。反射和透射之间的这种重新平衡称为“菲涅尔效应”。这些着色器允许为“边”(掠射角)和“基础”(正面角度)设定不同的权重以模拟这种效果。在 mib_glossy_*
着色器中,每采样计算此效果(而不是作为整个反射的全局权重计算),以获得更真实的效果。
无菲涅尔效应(左)与夸张的菲涅尔效应(右)
请注意,右侧图像的边(呈掠射角的曲面)比左侧图像的边反射的多。
色度色差
将显示 mib_glossy_* 着色器具有 dispersion
参数,用于设定“人造色度色差”的量。该效果未物理校正,只是真实现象的模拟。
光泽反射
这是用于光泽反射的着色器。它将光泽反射添加到与着色器连接的基础材质。
mib_glossy_reflection
color "mib_glossy_reflection" (
shader "base_material",
color "reflection_color",
scalar "max_distance",
scalar "falloff" default 2.0,
color "environment_color",
scalar "reflection_base_weight" default 0.2,
scalar "reflection_edge_weight" default 1.0,
scalar "edge_factor" default 5.0,
shader "environment",
boolean "single_env_sample" default true,
integer "samples" default 16,
scalar "u_spread" default 0.5,
scalar "v_spread" default 0.5,
vector "u_axis",
vector "v_axis",
scalar "dispersion" default 0.0,
array color "spectrum"
)
apply material, texture
version 3
- base_material
- 对其添加反射的基础曲面。例如,可以在此处应用 mib_illum_phong 或任何其他曲面着色器。
- reflection_color
- 定义反射强度(和颜色)。计算的反射只与该值相乘。
- max_distance
- 如果设定为 0,则反射光线的范围是无限的。如果值大于零,则将反射光线的范围限制到此距离(具有良好性能),且随着光线的长度接近此距离,反射的颜色褪色为环境颜色。使用此参数可以提高性能,并避免远距离的光高对比度对象产生的过多噪波。
- fallof
- 设定褪色为环境颜色的速率,这是一个幂函数。默认值 2.0 表示按距离的平方衰减;3.0 表示按距离的立方衰减,依此类推。如果
max_distance 为零,则此参数无效。
- environment_color
- 当光线未投射到任何对象而投射到环境时的倍增。为获得物理精确度,该值应该与 reflection_color完全相同,但是单独提供可更好地控制对象反射和环境反射之间亮度的平衡。
- reflection_base_weight
- 是面对摄影机曲面上反射的标量倍增, reflection_edge_weight 是与摄影机垂直的曲面(即边)上反射的标量倍增,
edge_factor 是此“边”的狭窄程度。通常,边(掠射角)比正面曲面的反射多,这称为“菲涅尔效应”。
- environment
- 参数允许传递仅适用于此着色器的显式环境着色器。如果未传递,则使用材质的环境着色器,使用全局摄影机环境作为备用。这允许为环境反射使用专门准备的预模糊环境贴图。
-
如果环境贴图已充分模糊,这可能会很浪费(性能效率),也可能在对环境时多次采样时会生成不必要的采样噪波。当 single_env_sample
处于禁用状态时,对于没有投射到对象或因使用
max_distance而需要与环境混合的每条反射光线,进行环境采样。启用时,仅针对这些反射光线对环境采样一次。
- samples
- 设定所用的采样数,从理论上说是 2 的幂。如果为零,着色器仅还原到单采样镜面反射。
- u_spread
v_spread - 在 U 和 V 方向上执行的法线向量扰动量。如果这些值相同,则生成等向光泽反射。如果两个值之间有任何差异,则启用各向异性模式。
- u_axis
v_axis
- 用于指定各向异性方向的可选参数。仅适用于各向异性模式。如果 u_axis 为 (0,0,0),着色器尝试基于曲面的第一个导数向量生成默认向量,如果缺少该向量,则基于对象空间 X 轴。如果为 u_axis 指定了值,该值用作各向异性的 U 方向。如果也为 v_axis 指定了值,则该值用作 V 方向,但如果未指定,V 方向会作为原始曲面法线与 U 方向的叉积进行计算。
- dispersion
- 范围从 0.0(无色度色差)到 1.0(全光谱色度色差)。
- spectrum
- 定义“彩虹”的颜色阵列,当 dispersion 参数为非零值时,颜色被分成“彩虹”。默认设置为默认的红-黄-白-青-蓝-靛,但可以是任何颜色。
光泽折射
此着色器与 mib_glossy_reflection 非常类似,但存在一些差别。由于它处理折射,因此有一个“深材质”而不是环境。
褪色为浅灰色的“深材质”
mib_glossy_refraction
color "mib_glossy_refraction" (
shader "top_material",
shader "deep_material",
shader "back_material",
boolean "render_reverse_of_back_material",
color "refraction_color",
scalar "max_distance",
scalar "falloff" default 2.0,
scalar "refraction_base_weight" default 1.0,
scalar "refraction_edge_weight" default 0.2,
scalar "edge_factor" default 5.0,
scalar "ior" default 1.0,
integer "samples" default 16,
scalar "u_spread" default 0.5,
scalar "v_spread" default 0.5,
vector "u_axis",
vector "v_axis",
scalar "dispersion" default 0.0,
array color "spectrum"
)
apply material, texture
version 2
- top_material
- 最顶层的表面特性。与此着色器反射版本中的 base_material 相似,只是与结果相加。例如,仅具有镜面反射度和很少漫反射分量(或无漫反射分量)的 mib_illum_phong。
- deep_material
- 仅当 max_distance 为非零值时才使用。它是对象“内部”的表面特性,折射达到
max_distance时褪色为此颜色。虽然仍在表面计算颜色,但它将“显示”在内部对象任何折射的后面。要实现有趣的伪体积模拟,可以建议在此处使用 misss_fast_* 次表面散射着色器。
- back_material
- 用于从内投射到对象内部的光线(即,根据几何体法线的定义,从后面投射到对象的任何光线)的材质。它定义对象“内部”的外观,如同之前的参数一样,应将其指定给表面着色器,例如 mib_illum_phong 或类似着色器。默认情况下,mental ray 法线翻转到入射光线的一侧,从而将渲染对象表面的内部。但有时需要通过让投射到对象外部的光定义其着色,来模拟半透明效果。完成此过程需要启用
render_reverse_of_back_material, 它可使着色器在对 back_material求值时使用曲面法线的原始方向。
通过特意翻转背面材质的法线向量模拟半透明。
- refraction_color
- 只是折射光线的倍增。
- max_distance
- 限制折射光线的范围,并随着其长度接近 deep_material 而褪色为
max_distance。这会生成用户到目前为止仅可以了解的半透明材质外观。
- falloff
- 设定褪色为 deep_material的速率,这是一个幂函数。默认值 2.0 表示按距离的平方衰减;3.0 表示按距离的立方衰减,依此类推。如果 max_distance 为零,则此参数无效。
- refraction_base_weight
- 是面对摄影机表面上折射的标量倍增, refraction_edge_weight是在与摄影机垂直的表面(即边)上折射的标量倍增。
edge_factor 是此“边”的狭窄程度。通常,边(掠射角)的折射比正面表面的折射少。这称为“菲涅尔效应”。
- ior
- 折射率。因为折射的扰动计算基于扰动的法线向量,因此此值定义显式折射率非常重要,否则折射率 1.0 不会改变光线的方向,从而不会生成任何模糊度!一个特例是,用于可以将 ior 设定为 0.0,以便切换到“方向扰动模式”而不是“法线扰动模式”。
- samples
- 设定所用的采样数,从理论上说是 2 的幂。如果为零,着色器仅还原到单采样折射。
- u_spread
v_spread - 在 U 和 V 方向上执行的法线向量扰动量。如果这些值相同,则生成等向光泽折射。如果两个值之间有任何差异,则启用各向异性模式。
- u_axis
v_axis - 用于指定各向异性方向的可选参数。仅适用于各向异性模式。如果 u_axis 为 (0,0,0),着色器尝试基于曲面的第一个导数向量生成默认向量,如果缺少该向量,则基于对象空间 X 轴。如果为 u_axis 指定了值,该值用作各向异性的 U 方向。如果也为 v_axis 指定了值,则该值用作 V 方向,但如果未指定,V 方向会作为原始曲面法线与 U 方向的叉积进行计算。
- dispersion
- 参数范围从 0.0(无色度色差)到 1.0(全光谱色度色差)。
- spectrum
- 定义“彩虹”的颜色阵列,当 dispersion 参数为非零值时,颜色被分成“彩虹”。默认设置为默认的红-黄-白-青-蓝-靛,但可以是任何颜色。
Copyright © 1986, 2015 NVIDIA ARC GmbH. All rights reserved.