光线类型切换着色器

光线类型切换着色器

通用切换器

mip_rayswitchmip_rayswitch_advanced 工具着色器允许不同类型的光线返回不同的结果。在很多情况下,此功能非常有用,其中包括但不限于:

mip_rayswitch 着色器是一个简易的着色器,它可接受一组其他颜色(通常设置为其他子着色器)以应用于特定类别的光线。

declare shader "mip_rayswitch" (
        color  "eye",
        color  "transparent",
        color  "reflection",
        color  "refraction",
        color  "finalgather",
        color  "environment",
        color  "shadow",
        color  "photon",
        color  "default"
    )
    version 1
    apply material, texture, environment
end declare

对于主光线,eye 设置了眼光线的结果。

对于次光线,transparent 是透明光线的结果,reflection 是反射光线的结果,而 environment 是环境光线的结果。

finalgather 是最终聚集光线以及最终聚集光线的子光线的结果。

同样,shadow 是阴影光线的结果,而 photon 捕捉所有光子光线。

最后,default 是任何其他光线类型的结果。但是,它不是全局默认值,无论是否连接到着色器,上述每个参数都返回其各自的结果(即,通常为 0 0 0 0 黑色)。

如果想要使用全局默认值,则必须使用高级版本的着色器:

declare shader "mip_rayswitch_advanced" (
        shader "eye",
        shader "transparent",
        shader "reflection",
        shader "refraction",
        shader "finalgather",
        shader "environment",
        shader "any_secondary",
        shader "shadow",
        shader "photon",
        shader "default"
    )
    version 1
    apply material, texture, environment
end declare

此着色器的工作方式与 mip_rayswitch 非常类似;但是它接受“shader”类型的输入,而不接受“color”类型的输入。

它不再允许直接指定固定的颜色,而是允许指定全局默认值

每个参数的工作方式都是类似的:eye 是眼光线的着色器,transparent 是透明光线的着色器,reflection 是反射光线的着色器,而 refraction 是折射光线的着色器,等等。

区别在于,如果其中的一个着色器未指定,则适合全局情况的其中一个着色器将接管。如果特定次光线类型的任一着色器未指定,并且该类型的光线到达,则 any_secondary 充当任何未显式设置的次光线类型的通用着色器。

同样,default 参数用作其上方每个未指定着色器的通用着色器。

环境切换器

使用 mental ray 时遇到的经典问题是,“环境”只有一个概念,但在实际使用中通常需要将背景的概念与环境的概念分隔开。

此着色器完全实现了以下功能:

declare shader "mip_rayswitch_environment" (
        color   "background"  default 0 0 0 0,
        color   "environment" default 0 0 0 0,
    )
    apply texture, environment
    version 1
end declare

对于所有眼光线、透明光线(作为眼光线的子项)或任何已折射的光线(其传播方向与透明光线的传播方向相同,这是 miRAY_REFRACT 类型的光线,但已通过 IOR 1.0 折射且作为眼光线的直接子项),此着色器会返回 background

对于任何其他类型的光线(反射、折射和最终聚集等),此着色器返回 environment 颜色。

此着色器专门用作摄影机环境,但在许多需要区分“主”光线和“次”光线的情况下,它将在着色图表的任何位置作为光线切换节点运行。

例如,理想的着色器可以在主光线和次光线之间切换,以便支持 mip_matteshadow 的“两个世界同时获取最佳效果”用法(如两个世界同时获取最佳效果页面所述)。

渲染阶段切换器

有时,用户希望使用不同的颜色或子着色器,具体取决于 mental ray 在渲染管道中的位置。例如,用户可能希望使特定材质对最终聚集光线完全不透明,或在发射光子或类似对象时灯光具有不同的颜色。

declare shader "mip_rayswitch_stage" (
        color "unknown",
        color "main_render",
        color "finalgather_precomp",
        color "ao_precomp",
        color "caustic_photons",
        color "globillum_photons",
        color "importon_emit",
        color "lightmapping"
    )
    version 1
    apply material, texture, environment
end declare

对于其他所有切换器着色器,参数的工作方式都是类似的。

unknown 用于任何“未知”阶段。通常决不应调用此参数,但它作为安全预防措施而存在,以防将来的 mental ray 版本中引入此时未知的任何新渲染阶段。

在法线平铺渲染过程中,此着色器会返回 main_render 输入的值。

在最终聚集预计算阶段,此着色器会返回 finalgather_precomp 的值。

在环境光遮挡预计算阶段,此着色器会返回 ao_precomp 的值。请注意,在此阶段 mental ray 3.7 不会调用着色器,因此决不会调用此参数 - 但将来的 mental ray 版本可能会有所不同。

在焦散光子和全局照明光子跟踪期间,将分别使用 caustic_photonsglobillum_photons 输入的值。

在重要性粒子发射阶段,将使用 importon_emit 中的值。

最后,在灯光映射预处理阶段(例如,由次表面散射着色器使用),将使用 lightmapping 中的值。