自定义体积着色器

 
 
 

使用自定义体积着色器时,应使着色器与 Maya 体积引擎兼容。这是使体积着色器与渲染过程、Maya 灯光着色器和其他 Maya 功能一起正确运行的最佳方法。

要执行此操作,请为着色器结果使用以下数据结构,而不是简单的 miColor

typedef struct VolumeShader_R {
miColor color;
miColor glowColor;
miColor matteOpacity;
miColor transparency;
} VolumeShader_R; 

体积是不透明的,除非结构的透明度场设置为非零值。体积引擎注意集成和合成体积采样,因此体积着色器仅需要注意计算当前采样的原始颜色值和透明度。

要检索当前体积光线分段的起点和端点,则使用以下代码:

miVector orgObj, pointObj;
mi_point_to_object(state, &orgObj, &state->org);
mi_point_to_object(state, &pointObj, &state->point);

然后,要获得贯穿长度,则在对象空间中,请执行以下操作:

miScalar length = mi_vector_dist(&orgObj, &pointObj);

旧版体积着色器

与 Maya 体积引擎不兼容的旧版体积着色器仍可在 Maya 2013 中使用。但是,必须使用以下 MEL 代码禁用体积引擎:

miCreateDefaultNodes();
select mentalrayGlobals;
addAttr -ln useVolumeEngine -at bool;
setAttr mentalrayGlobals.useVolumeEngine false; 
注意

如果体积引擎已关闭,则本地 Maya 体积着色器(雾、流体,粒子等)不工作。因此,首选和正确的永久解决方案是使用上面提到的指南转化着色器,以与 Maya 体积引擎兼容。