关于 arnold shader的参数

本文详细解析了Arnold渲染器中enumparameter与node_parameters的一一对应关系及其重要性。若二者不匹配,则会导致渲染错误,如参数类型不匹配、无法读取数据等问题。文章还介绍了如何通过正确的参数定义和调用来避免此类问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

注意

  • 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不匹配 也不会影响编译和执行,但是为了避免麻烦, 最好三者都能匹配

转载于:https://my.oschina.net/zsjasper/blog/380776

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值