工具着色器

工具着色器

Gamma/增益节点

declare shader "mip_gamma_gain" (
        color   "input",
        scalar  "gamma"        default 1.0,
        scalar  "gain"         default 1.0,
        boolean "reverse"      default off,
    )
    apply texture, environment, lens
    version 1
end declare

这是一个简易的着色器,可应用颜色的 Gamma 和增益(乘法)。许多类似的着色器存在于 mental ray 的各种 OEM 集成中,因此该着色器主要用于独立的 mental ray 和跨平台现象开发。

如果禁用了 reverse,该着色器将采用 input,并将其与 gain 相乘,然后将 gamma 的 Gamma 校正应用于颜色。

如果启用了 reverse,该着色器将采用 input,并将 gamma 的反转 Gamma 校正应用于颜色,然后将其与 gain 相除;即正好是禁用 reverse 时的反向操作。

该着色器还可用作简单的 Gamma 镜头着色器,在这种情况下,不使用 input,而改用眼光线颜色。

场景的渲染子集

此着色器允许重新渲染场景中的对象(由材质定义)、几何对象或实例标签的子集。如果场景中的一切都近乎完美,只有这一个小对象或一种材质需要进行微调1,则可作为理想的“快速修复”解决方案。

它用作镜头着色器,会首先测试眼光线射中哪些对象,{仅当该对象是所需子集的一部分时,实际上才会对其进行着色}。

默认情况下,背景像素和其他对象返回透明黑色 (0 0 0 0),使最终渲染图像适合于直接在原始渲染上合成。

因此,例如,如果场景中的某种材质令人不满意,则只需:

在一种材质上使用 <i>mip_render_subset</i> 的示例
在一种材质上使用 mip_render_subset 的示例

通常,只有能“直接”看到材质的像素会重新渲染,而其他对象中显示材质的反射不会重新渲染。

该着色器依赖于光线跟踪所采用的调用顺序,它在使用光栅化器时不能正常工作(并对渲染时间无益),因为光栅化器在对曲面着色之后才调用镜头着色器。

declare shader "mip_render_subset" (
        boolean "enabled"        default on,
        array geometry "objects",
        array integer  "instance_label",
        material       "material",
        boolean "mask_only"      default off,
        color   "mask_color"     default 1 1 1 1,
        color   "background"     default 0 0 0 0,
        color   "other_objects"  default 0 0 0 0,
        boolean "full_screen_fg" default on
    )
    apply lens
    version 5
end declare

enabled 启用或禁用着色器。禁用着色器时,不会执行任何操作,也不会以任何方式影响渲染。

objectsinstance_labelmaterial 为约束,可以应用它们来查找要着色的对象子集。如果存在多个约束,则必须满足所有约束,即如果选择了一种材质和三个对象,则只有实际具有该材质的对象才会被着色。

如果不希望对子集进行着色,但只能找到它在屏幕上的位置,则可以启用 mask_only。不会对子集中的对象着色,而是返回 mask_color,似乎没有执行任何着色,因为它的速度非常快

未射中任何对象的光线将返回 background 颜色,射中子集之外任何对象的光线将返回 other_objects 颜色。

最后,full_screen_fg 决定 FG 预处理应该应用于所有对象,还是仅应用于子集中的对象。由于 FG 与邻近的 FG 采样相混合,因此给定的对象可能会使用 FG 点中的信息,这些点来自附近的对象,而不是来自子集。尤其在对象处于共面时会发生这种情况。因此建议让 FG 预过程“看到”整个场景。

通常,禁用此选项并仅为对象的子集创建 FG 点比较快速,但存在一定的边界瑕疵风险(特别是在动画中)。如果场景使用保存过的 FG 贴图,则可以禁用此选项。

二进制代理

此着色器可以采用非常快速的方式来实现按需加载几何体。它的主要目标是性能,由于它通过直接写入二进制文件格式来跳过任何形式的转换或解析,因此在渲染时可直接吸入到 RAM。在 mental ray 中执行按需加载还有许多其他方法(部件、文件对象、几何体着色器等)。但这可能需要主机应用程序中具有特定的支持,通常涉及解析或转换步骤,可能会影响性能。

为了使用它,将应用该着色器作为场景中的几何体着色器。请参见 mental ray 手册中有关几何体着色器的部分。

declare shader
    geometry "mip_binaryproxy" (
        string "object_filename",
        boolean "write_geometry",
        geometry "geometry",        
        scalar   "meter_scale", 
        integer  "flags"
    )
    version 4
    apply geometry
end declare

object_filename 是要读取(或写入)的文件名。按照惯例,文件扩展名为“.mib”,表示“mental images 二进制文件”。

该着色器具有“读取”模式和“写入”模式:

meter_scale 允许以独立于单位的方式解释对象。如果值为 0.0,则不使用该功能。使用该功能时,值应为代表一米的场景单位数;即,如果场景单位为毫米,值应为 1000.0,依此类推。

在写入(启用了 write_geometry)时,该值在 .mib 文件中仅存储为元数据。在读取(禁用了 write_geometry)时,对象将按存储在该文件中的值与“读取时”传递的值之比进行缩放,以解决单位上的差异(如果有)。

flags 参数用于算法控制,并且在大多数情况下应保留为 0。它是一个位标志,其中每个位具有特定的含义。

当前使用的值包括:

其他所有位应始终为零,因为它们在将来版本中可能会有相应的含义。

FG shooter

此着色器用于将最终聚集 (FG) 光线以确定的方式“投射”到场景中,并强制在特定位置放置 FG 点,而不考虑 mental ray。

通常,如果不使用此着色器,在 mental ray 的最终聚集预计算阶段,眼光线将通过摄影机投射到场景中,并且将根据渲染摄影机的当前视图在场景中放置 FG 点。一个优势是,FG 点的密度是相对于图像空间的,因此将自动自适应所需的可见区域。

但是,在摄影机动画中,FG 点的位置实际上将沿摄影机移动。在某些情况下 - 特别是在摄影机移动缓慢,或仅有小幅移动时(例如,小幅平移、推拉、倾斜、卡车或起重机移动),可能会导致出现瑕疵。

“FG Shooter”着色器可以避免此类偶发事件;它允许使用一个或多个固定的变换矩阵作为根位置,以从中“发射”仅在最终聚集预计算阶段中使用的眼光线。这将确保即使实际渲染摄影机移动,FG 点也将保持在其原有位置(由给定的矩阵确定)。

declare shader "mip_fgshooter" (
        integer "mode",
        array transform "trans"
    )
    version 1
    apply lens
end declare

trans 参数包含一组变换矩阵,其中定义了在最终聚集预过程期间如何发射眼光线。不使用摄影机来计算“眼”光线,而是从 0,0,0 点发射这些光线,将屏幕平面映射到 0,0,-1 点周围的单位方形,然后由传递的一个或多个矩阵变换到世界空间中。

mode 参数定义了在最终聚集预过程期间如何显示所传递的一个或多个矩阵。由于它的显示方式会影响自适应能力,因此会对功能产生一些影响。


脚注
1
客户端正在逐渐完善。
2
请注意,在烘焙置换时,无法使用依赖于视图的近似。这是因为在此着色器执行的同时没有设置视图,因此产生的细分将很差。