关于 arnold shader的参数

注意

  • 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

关于 arnold shader的参数的相关文章

arnold shader parameter

node_parameters {} 里面应当把所有的 参数都用AiParameterFLT/RGB等参数调用方法 放进去 如     // DIFFUSE     AiParameterRGB ( "color", 1.0, 1.0, 1.0);     AiParameterFLT ( "Kd", 0.8f);     AiMetaDataSetFlt(mds, "Kd", "min", 0.0f);     AiMeta

arnold shader custom aov

add aov parameter in [enum zsjStandardParams]  enum zsjStandardParams { ...  p_aov_spec_fresnel,  p_aov_refl_fresnel,  ... }; node parameter node_parameters  { ...    AiParameterStr("aov_spec_fresnel", "spec_fresnel");    AiParameterSt

Unity Shader : Ghost(残影) v1

前阵子组长给我提了个需求,要实现角色人物的残影.我百度google了一下,发现可以用两种方式实现这个效果:1.记录前几帧的人物位置,将其传入shader中,对每个位置进行一个pass渲染.2. 通过相机的targetRender,记录前几帧的人物的影像,然后通过后处理混合上去. 这里先介绍方法1,先看效果: 残影用了alpha混合的方法,将它们变得透明. 先列出shader代码: Shader "Custom/Ghost" { Properties { _MainTex ("

【浅墨Unity3D Shader编程】之五 圣诞夜篇: Unity中Shader的三种形态对比&混合操作合辑

本系列文章由@浅墨_毛星云 出品,转载请注明出处.  文章链接:http://hpw123.net/a/C__/kongzhitaichengxu/2014/1222/164.html 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 邮箱: [email protected] QQ交流群:330595914 更多文章尽在:http://www.hpw123.net 本文算是固定功能Shader的最后一篇,下一次更新应该就会开始讲解表面Shader,而

OpenGL中shader使用

引自:http://blog.csdn.net/wl_soft50/article/details/7916720 http://blog.sina.com.cn/s/blog_923fdd9b0102vbe0.html 与OpenGL ES1.x渲染管线相比,OpenGL ES 2.0渲染管线中“顶点着色器”取代了OpenGL ES 1.x渲染管线中的“变换和光照”:“片元着色器”取代了OpenGL ES 1.x渲染管线中的“纹理环境和颜色求和”.“雾”以及“Alpha测试”. 这使得开发人员

cocos2d Shader系列1:cocos2d-js Shader和OpenGL ES2.0

cocos2d的Shader也就是差不多直接跟GPU打交道了,跟Flash的Stage3D(AGAL)类似,不过没有AGAL这么恶心,不需要直接编写汇编语言.而Fragment Shader又跟Flash的pixelbender类似. 本文以cocos2d-js为例,但cocos2dx其他版本也是同理的,只是函数名略有不同而已. 当然还是得先复习或者学习一下GPU的原理,至少得知道vertex shader和fragment shader的作用和区别. 详细可以看看大神的说明: http://w

[Shader]对NGUI的UISprite和UITexture进行裁剪

由于最近比较忙,所以很多我在其它地方发布的博文都没有同步到这里.我会在后面慢慢重新补回来.对各位关注我博客的读者也表示抱歉! 版权所有,转载须注明出处!喜欢火影.喜欢Java.喜欢unity3D.喜欢游戏开发的都可以加入木叶村Q群:379076227 0.随便聊 本人真正学习Shader的时间莫过于今年春节在家的两天时间,虽然短短两天.但是已经深深喜欢上Shader.深受其魅力吸引.但是平常主要做的还是服务端和客户端的开发,偏逻辑向.所以好久也没碰Shader了.但是昨天在一个群里有人讨论NGU

Qt QML 2D shader

--------------------------------------------------- Qt quick 2d shader effect --------------------------------------------------- 概念 着色器和普通的图像处理程序不同,它只针对一个点做运算,它包括: vertext shader: 顶点着色器,主要用于处理位置,要求输出当前点的新位置. fragment shader(pixel shader):片段着色器(像素着色器

Vulkan Tutorial 11 Shader modules

操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Visual Studio 2017 与之前的图像API不同,Vulkan中的着色器代码必须以二进制字节码的格式使用,而不是像GLSL和HLSL这样具有比较好的可读性的语法.此字节格式成为SPIR-V,它可以与Vulkan和OpenCL一同使用.这是一种可以编写图形和计算着色器的格式,但我们重点介绍本教程中Vulkan图形流水线使用的着色器. 使用二进制字节码格式的优点之一是 使得GPU厂商编写将着色器代码转换为本地代