
可以使用 mental ray for Maya 渲染器来渲染硬件着色器。mental ray for Maya 识别硬件着色器,并将其作为 Lambert 着色器。
使用此功能,您无需为了烘焙光照贴图而复制材质和创建硬件着色器的软件版本;若场景中有大量的着色器,这将会免除许多开销。
支持 kPluginHardwareShader 类型的所有着色器。mental ray for Maya 首先检查预期在 “Lambert”着色器上的硬件着色器参数,如“颜色”(Color)、“透明度”(Transparency)、“漫反射”(Diffuse)等。如果预期参数不存在,则使用默认的“Lambert”值。
此外,您也可以使用简单的 MEL 脚本,将标准的“Lambert”参数重新映射到自定义硬件着色器参数。这样,自定义着色器上的漫反射和法线贴图也会受支持。
自定义 MEL 程序的示例如下。在此示例中,使用 MayaUberShader.fx,将标准的“Lambert”参数映射到 dx11Shader 中的等效参数。
global proc string[] dx11Shader_lambertParameters( string $node, string $params[] )
//
// Description:
// Custom MEL procedure invoked during a mentalray render to allow plug-in
// hardware shaders to participate as lambert shaders.
//
// This procedure allows the plug-in hardware shader an opportunity to map
// lambert attribute parameters to the equivalent hardware shader attribute(s).
//
// The function must exhibit the following characteristics:
//
// 1. Size of the returned string[] array must equal the size of the input $params[] array.
// 2. A string entry of "" will use the default lambert attribute name.
//
{
string $newParams[];
int $nParams = size($params);
int $i;
for( $i = 0; $i < $nParams; $i++ )
{
string $param = $params[$i];
// Default to the lambert attribute name. Also ensures we allocate an entry per lambert parameter.
$newParams[$i] = $param;
if( $param == "color" )
{
// Remaps the color attribute to the diffuse map on the dx11Shader (MayaUberShader.fx)
$newParams[$i] = "DiffuseTexture";
}
else if( $param == "transparency" )
{
// Remaps the transparency attribute to the diffuse map on the dx11Shader (MayaUberShader.fx)
$newParams[$i] = "Diffuse_Map_Transparency";
}
else if( $param == "normalCamera" )
{
// Remaps the normal attribute to the normal map on the dx11Shader (MayaUberShader.fx)
$newParams[$i] = "NormalTexture";
}
}
return $newParams;
}
自定义 MEL 程序使用以下命名法:
$shaderType + "_lambertParameters"
例如:dx11Shader_lambertParameters
调用此回调函数,每次一个着色器节点实例。
重新映射后,mental ray for Maya 将“硬件着色器”属性解释为等效的“Lambert”属性。