目录
一,背景介绍
二,相关概念介绍
语境 Context
语句 Statements
内置函数 Built-in Functions
用户自定义函数 User-defined Functions
主(语境)函数 Main (context) function
一,背景介绍
VEX全称Vector Expression,是性能接近C/C++的高性能表达式脚本语言,也是一种更小、更高效的用于Shader和自定义节点的通用语言;VEX基于C语言,也采纳了C++的思想类似Renderman shading language;在Houdini中VEX主要用于Rendering、Compositing、Particles、Modeling、CHOPS、Fur等;
VEX特点
虽然VEX基于C/C++,但其功能的核心是不同的;其需在指定的语境Context内编程,依赖于语境可选择特定的函数和语句;类似于C/C++有常用的语句如do、for、foreach、if等,指定语境的语句如getglobalraylevel(返回计算全局光照的光线深度);总的来说,Houdini VEX拥有巨大的内置函数库;另外,用户还可创建无限的自定义函数(默认使用VCC编译器,不可使用递归),建议不要访问全局变量;
此外,在VEX语法,对于属性需使用符号“@”;属性存储在vertex、point、primitive、detail上,本质是几何体各个级别的数据块;简单的说,point是在3D空间具有X/Y/Z坐标的点,primitive类似面(当将点连接起来的时候可以得到),vertex则是可以把primitive赋予到point上,detail则可以理解为表示整个几何体的属性;
参考于Houdini VEX 基本语法与常用命令速查 #Houdini单词本 - 哔哩哔哩 (bilibili.com)
二,相关概念介绍
语境 Context
VEX为特定的语境编写,如在Surface Context下编写对象表面颜色的Shader,在Light Context下编写灯光的照明Shader,在Chop Context下创建或过滤通道数据;Context影响哪些函数、语句、全局变量的可用性;
语句 Statements
VEX支持常见C中的语句,也支持着色指定的语句如illuminance和gather;
内置函数 Built-in Functions
VEX包含一个大型的内置函数库,一些函数仅能在特定的语境下有效;
用户自定义函数 User-defined Functions
类似于C函数的定义,指定返回类型、函数名、参数列表;
type funname(arg; ...) {...;}
//参数,相同类型可逗号隔开,不同类型封号隔开
int test(int a,b; string c){
if(a>b) return a;
else return b;
printf(c);
}
//可重载函数,用不同的参数或返回类型
//可添加可选的关键字function,以明确函数
function int test(int a,b){
if(a>b) return a;
else return b;
}
void test(int a,b){
printf("c");
}
//参数总是被引用传递
void test(export int a){
a += 1;
printf("%d",a);
}
int a=0;
printf("%d",a);
test(a);
printf("%d",a);
//返回011
//函数内部定义函数
void test(){
void test1(){printf("test1");}
test1();
}
主(语境)函数 Main (context) function
surface
noise_surf(vector clr = {1,1,1}; float frequency = 1;
export vector nml = {0,0,0})
{
Cf = clr * (float(noise(frequency * P)) + 0.5) * diffuse(normalize(N));
nml = normalize(N)*0.5 + 0.5;
}