卡/不透明度着色器
介绍
若所做的渲染无需任何形式的后期制作,则无需特别考虑透明度。只需添加某种透明度着色器,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_alpha,input 颜色的 Alpha 组件将用作不透明度。
如果禁用了 opacity_in_alpha,opacity 参数将用作不透明度。
如果启用了 opacity_is_premultiplied,则假定 input 颜色已预乘不透明度值。如果禁用了它,input 颜色将衰减(乘以)不透明度值,然后再使用。
最后,opacity_threshold 设置不透明度级别,使着色器在使用标准透明度和变为“完全透明”之间切换。通常该值应保留为 0.0,即实际上只有完全透明的像素才确实视为“根本不在那里”,但如果逐渐提高此值,帧缓冲区的“不透明”像素将被视为“不在那里”。请注意,实际的可见渲染结果是相同的,只有除主颜色帧缓冲区以外的其他帧缓冲区的内容受此影响。
脚注- 1
-
使用平面图像来表示复杂对象在渲染行业中称为将事物放置在“卡”上,着色器由此得名