注意
enum parameter 和 node_parameters 必须,必须,必须,必须 一 一对应,否则编译不会出错,但是执行渲染会出错,
不匹配的结果 , 一般表现为 parameter 读取错误,比如类型无法匹配,无法读取数据, 内存溢出等
匹配的意思是 个数和顺序都要匹配
以下是 ai_params.h 对 AiParameter*** 的定义
....
#define AiParameterBYTE(n,c) AiNodeParamByte (params,-1,n,c);
....
AI_API void AiNodeParamByte (AtList* params, int varoffset, const char* pname, AtByte pdefault);
...
params 就是在enum中声明的parameter, varoffset就是parameter的位置/顺序
所以可以想象如果两者不匹配就会出错
简言之:
enum parameter的枚举定义了参数
在shader_evaluate()函数中,通过AiShaderEvalParame***(pid) 在调用上述enum的参数
而参数的具体定义则在node_parameters 中定义,比如类型,最大值等
node_parameter 和 enum parameter之间的匹配,依靠enum的个数和顺序这种松散而致命的方法来匹配
(很纳闷,arnold 为什么把读取参数搞得这么绕)
api帮助里面的例子
enum LambertParams {
p_Kd,
p_Kd_color
};
node_parameters
{
AiParameterFlt("Kd", 0.7f);
AiParameterRgb("Kd_color", 1, 1, 1);
// note that parameter ordering must match the enum above
}
shader_evaluate
{
float kd = AiShaderEvalParamFlt(p_Kd);
...
}
注:
在shader_evaluate 中的AiShaderEvalParam***()和enum parameter node_parameters不匹配 也不会影响编译和执行,但是为了避免麻烦, 最好三者都能匹配