当前位置: > 3dmax模型制作 > Maya教程 >

Arnold渲染器添加参数
栏目分类:Maya教程   发布日期:2019年05月14日 09:53:17   浏览次数:


在这里,我们将为着色器添加更多不同的参数,并将它们集成到Maya界面中。这将允许我们在Maya中轻松修改着色器。


3.1创建着色器

我们可以将新的着色器添加到我们在上一节中创建的上一个着色器加载器中:

首先,创建着色器:

parametersShader.cpp

#include <ai.h>
 
AI_SHADER_NODE_EXPORT_METHODS(ParametersShaderMtd);
 
namespace
{
 
enum ParametersShaderParams {   p_int, p_uint, p_bool, p_float,
                                p_RGB, p_vector, p_point, p_point2,
                                p_string, p_matrix, p_enum };
 
const char* enum_list[] =
{
    "First value",
    "Second value",
    "Third value",
    NULL
};
 
};
 
node_parameters
{
    AtMatrix id;
    AiM4Identity(id);
    
    AiParameterInt("IntParam", 0);
    AiParameterUInt("UIntParam", 0);
    AiParameterBool("BoolParam", 0);
    AiParameterFlt("FltParam", 0.0f);
    AiParameterRGB("RGBParam", 1.0f, 0.0f, 0.0f);
    AiParameterVec("VecParam", 1.0f, 1.0f, 1.0f);
    AiParameterPnt("PntParam", 0.5f, 0.5f, 0.5f);
    AiParameterPnt2("Pnt2Param", 0.7f, 0.7f);
    
    AiParameterStr("StrParam""");
    AiParameterMtx("MtxParam", id);
    AiParameterEnum("EnumParam", 0, enum_list);
    AiParameterArray("ArrayParam", AiArray(0, 0, AI_TYPE_RGB));
}
 
node_initialize
{
}
 
node_update
{
}
 
node_finish
{
}
 
 
shader_evaluate
{
    AtColor color = AiShaderEvalParamRGB(p_RGB);
    sg->out.RGB = color;
}

枚举值

枚举值的字符串不应以数字开头。所以这个:“第一个值”不是有效的枚举值。

 

您可以看到不同类型的节点参数已定义,但仅使用RGBParam。
现在,要将着色器添加到加载器,您只需要将此代码添加到上一节的前一个Loader.cpp文件中:

loader.cpp

extern AtNodeMethods* ParametersShaderMtd;
 
enum{
    MY_SHADER_1 = 0,
    MY_SHADER_2,
    PARAMETERS_SHADER
};
...
 
case PARAMETERS_SHADER:
    node->methods        = ParametersShaderMtd;
    node->output_type    = AI_TYPE_RGB;
    node->name           = "parametersShader";
    node->node_type  = AI_NODE_SHADER;

 

    break;

您将能够再次编译加载程序,如上一节所述,检查Arnold是否可以正确加载着色器,并将已编译的着色器复制到正确的文件夹,以便Maya可以使用它。如果你这样做,你会发现它可以使用但没有很好地集成到Maya中。

 

3.2在Maya中集成着色器

要集成这个新着色器,我们可以像在第一部分中那样向元数据文件添加信息并为此着色器创建模板脚本。

3.2.1添加元数据信息

要添加元数据信息,您只需将其添加到您放在此文件夹中的上一节中创建的loader.mtd文件中:%MTOA_PATH% shaders

loader.mtd

[node parametersShader]
    desc                    STRING  "Arnold shader to test parameters."
    maya.name               STRING  "aiParametersShader"
    maya.id                 INT     0x00070003
    maya.classification     STRING  "shader/surface"
    maya.output_name        STRING  "outColor"
    maya.output_shortname   STRING  "out"
 
    [attr IntParam]
        desc                STRING  "Integer parameter."
        min                 INT     -100
        max                 INT     100
        softmin             INT     -10
        softmax             INT     10
        default             INT     -10
        maya.shortname      STRING  "int"
        maya.name           STRING  "integer"
    [attr UIntParam]
        desc                STRING  "UInteger parameter."
        min                 INT     0
        max                 INT     100
        softmin             INT     0
        softmax             INT     10
        default             INT     0
        maya.shortname      STRING  "uint"
        maya.name           STRING  "uinteger"
    [attr BoolParam]
        desc                STRING  "Bool parameter."
        default             BOOL    True
        maya.shortname      STRING  "bl"
        maya.name           STRING  "bool"
    [attr FltParam]
        desc                STRING  "Float parameter."
        min                 FLOAT   0
        max                 FLOAT   10
        softmin             FLOAT   0
        softmax             FLOAT   1
        default             FLOAT   0.5
        maya.shortname      STRING  "flt"
        maya.name           STRING  "float"
    [attr RGBParam]
        desc                STRING  "RGB parameter."
        maya.name           STRING  "color"
        maya.shortname      STRING  "cl"
    [attr VecParam]
        desc                STRING  "Vector parameter."
        maya.name           STRING  "vector"
        maya.shortname      STRING  "vec"
    [attr PntParam]
        desc                STRING  "Point parameter."
        maya.name           STRING  "point"
        maya.shortname      STRING  "pnt"
    [attr Pnt2Param]
        desc                STRING  "2D Point parameter."
        maya.name           STRING  "point2"
        maya.shortname      STRING  "pnt2"
    [attr StrParam]
        desc                STRING  "String parameter."
        maya.name           STRING  "string"
        maya.shortname      STRING  "str"
        default             STRING  "empty"
    [attr MtxParam]
        desc                STRING  "Matrix parameter."
        maya.name           STRING  "matrix"
        maya.shortname      STRING  "mtx"
    [attr EnumParam]
        desc                STRING  "Enumeration parameter."
        default             INT 1
        maya.name           STRING  "enumeration"
        maya.shortname      STRING  "enum"
    [attr ArrayParam]
        desc                STRING  "Color Array parameter."
        maya.name           STRING  "colorarray"

 

        maya.shortname      STRING  "carray"

这描述了将用于名称,短名称,滑块限制,描述和默认值等参数的Maya表示的 属性。

3.2.2添加Maya模板

最后一项任务是为此着色器创建Maya模板。这与第一部分中创建的类似:self.addControl(parameterName,label =“Parameter Label”)。但添加其余控件。将自动创建对每个属性的正确控制。
在%MTOA_PATH% scripts mtoa ui ae 或%MTOA_TEMPLATES_PATH%中定义的任何文件夹中创建aiParametersShaderTemplate.py文件

aiParametersShaderTemplate.py

import pymel.core as pm
from mtoa.ui.ae.shaderTemplate import ShaderAETemplate
 
class AEaiParametersShaderTemplate(ShaderAETemplate):
    def setup(self):
        self.addSwatch()
        self.beginScrollLayout()
        self.addCustom('message''AEshaderTypeNew',
        'AEshaderTypeReplace')
 
        self.beginLayout("Parameters list", collapse=False)
        self.addControl("integer", label="Integer Param")
        self.addControl("uinteger", label="Unsigned Int Param")
        self.addControl("bool", label="Bool param")
        self.addControl("float", label="Float param")
        self.addControl("color", label="Color param")
        self.addControl("vector", label="Vector param")
        self.addControl("point", label="Point param")
        self.addControl("point2", label="2D Point param")
        self.addControl("string", label="String param")
        self.addControl("matrix", label="Matrix param")
        self.addControl("enumeration", label="Enumeration param")
        self.addControl("colorarray", label="Color Array param")
        self.endLayout()
 
        pm.mel.AEdependNodeTemplate(self.nodeName)
 
        self.addExtraControls()

 

        self.endScrollLayout()

在Maya中使用ParametersShader时,您将能够看到它的“ 属性编辑器”。

图4:ParametersShader模板

现在,您将能够从Maya中配置着色器的输入参数。 

3.2.3避免模板中的空间优化

Maya会自动尝试优化布局空间,例如,如果在之前的代码中您更改了此设置:

aiParametersShaderTemplate.py

...
self.addControl("uinteger", label="Unsigned Int Param")
self.addControl("bool", label="Bool param")
self.addControl("float", label="Float param")

 

...

对此:

aiParametersShaderTemplate.py

...
self.addControl("uinteger", label="Unsigned Int Param")
self.addControl("bool", label="Bool param 1")
self.addControl("bool", label="Bool param 2")
self.addControl("float", label="Float param")
...

你会看到这个结果:

图5:优化模板

为避免这种情况,我们可以使用此代码:

aiParametersShaderTemplate.py

...
self.addControl("uinteger", label="Unsigned Int Param")
self.beginNoOptimize()
self.addControl("bool", label="Bool param 1")
self.addControl("bool", label="Bool param 2")
self.endNoOptimize()
self.addControl("float", label="Float param")

 

...

你会得到这个结果:

图6:优化模板

3.2.4属性更改时调用的方法

有时我们可能需要在每次更改属性时执行某个操作。例如,要评估引入的值是否正确。让我们假设我们要求uinteger属性的值总是大于或等于整数属性。我们可以尝试使用以下代码实现此目的。

aiParametersShaderTemplate.py

import pymel.core as pm
import maya.cmds as cmds
from mtoa.ui.ae.shaderTemplate import ShaderAETemplate
 
class AEaiParametersShaderTemplate(ShaderAETemplate):
    def checkInteger(self, nodeName):
        intAttr = self.nodeAttr('integer')
        uintAttr = self.nodeAttr('uinteger')
        intValue = cmds.getAttr(intAttr)
        uintValue = cmds.getAttr(uintAttr)
        if intValue > uintValue:
            cmds.setAttr(uintAttr,intValue)
    def setup(self):
        self.addSwatch()
        self.beginScrollLayout()
        self.addCustom('message''AEshaderTypeNew',
                        'AEshaderTypeReplace')
        self.beginLayout("Parameters list", collapse=False)
        self.addControl("integer", label="Integer Param",
            changeCommand=self.checkInteger)
        self.addControl("uinteger", label="Unsigned Int Param")

 

        ...

现在,每次更新整数属性时,如果它的值大于uinteger值,则会增加该值等于该值。但是,当然,如果减少uinteger参数,则可能低于整数1。为了处理这种情况,我们可以轻松编写此代码:

aiParametersShaderTemplate.py

import pymel.core as pm
import maya.cmds as cmds
from mtoa.ui.ae.shaderTemplate import ShaderAETemplate
class AEaiParametersShaderTemplate(ShaderAETemplate):
    def checkInteger(self, nodeName):
        intAttr = self.nodeAttr('integer')
        uintAttr = self.nodeAttr('uinteger')
        intValue = cmds.getAttr(intAttr)
        uintValue = cmds.getAttr(uintAttr)
        if intValue > uintValue:
            cmds.setAttr(uintAttr,intValue)
    def checkUinteger(self, nodeName):
        intAttr = self.nodeAttr('integer')
        uintAttr = self.nodeAttr('uinteger')
        intValue = cmds.getAttr