注意
- 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不匹配 也不会影响编译和执行,但是为了避免麻烦, 最好三者都能匹配
时间: 2024-10-31 03:13:53