卡/不透明度着色器

介绍

若所做的渲染无需任何形式的后期制作,则无需特别考虑透明度。只需添加某种透明度着色器,mental ray 将正确对其渲染,如此即可。

但是,只要开始对图像执行后期制作,并渲染到多个帧缓冲区,那么即使只使用 mental ray 的内置帧缓冲区(如“Z”(深度)或“M”(运动向量)),也必须特别考虑如何处理透明度。

通常,mental ray 从眼光线(即摄影机投射的射中第一个对象的光线)收集其帧缓冲区数据。因此,Z 向深度、运动向量等将来自此第一个对象。

如果射中的第一个对象是完全透明的,将会如何?或者部分透明,例如竖立在房屋前面、映射到平面并使用不透明遮罩切断的树的图像,将会如何1

当使用与透明度相关的其他大多数着色器时,即使在最终渲染中树是正确可见的,并且您可以在树枝之间看见房屋,“Z”(深度)(和其他帧缓冲区)很可能包含平面的深度!对于大多数后期处理工作,不希望出现这种情况。

为了解决此问题,mental ray API 包含了一个名为 mi_trace_continue 的函数,可延续光线,就好像从未相交。着色器 mip_card_opacity 在内部使用此函数,并在“标准”透明度和使用 mi_trace_continue 之间切换,以便依给定阈值创建“完全”透明的对象。

mip_card_opacity

declare shader "mip_card_opacity" (
        color   "input",
        boolean "opacity_in_alpha",
        scalar  "opacity",
        boolean "opacity_is_premultiplied",
        scalar  "opacity_threshold"
    )
    version 1
    apply material
end declare

input 参数是对象的颜色。

如果启用了 opacity_in_alphainput 颜色的 Alpha 组件将用作不透明度。

如果禁用了 opacity_in_alphaopacity 参数将用作不透明度。

如果启用了 opacity_is_premultiplied,则假定 input 颜色已预乘不透明度值。如果禁用了它,input 颜色将衰减(乘以)不透明度值,然后再使用。

最后,opacity_threshold 设置不透明度级别,使着色器在使用标准透明度和变为“完全透明”之间切换。通常该值应保留为 0.0,即实际上只有完全透明的像素才确实视为“根本不在那里”,但如果逐渐提高此值,帧缓冲区的“不透明”像素将被视为“不在那里”。请注意,实际的可见渲染结果是相同的,只有除主颜色帧缓冲区以外的其他帧缓冲区的内容受此影响。


脚注
1
使用平面图像来表示复杂对象在渲染行业中称为将事物放置在“卡”上,着色器由此得名