VEX —— 简介

目录

一,背景介绍

二,相关概念介绍

语境 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特点

  • 高性能,直接与Houdini内部数据交互,执行效率高,非常适合大规模数据和计算密集的任务;
  • 类C语法,语法类似于C语言,对会编程用户友好;
  • Shader编写,可编写自定义Shader,实现特定渲染效果;
  • 几何体处理,可处理几何体如点线面等三维数据,实现复杂的几何操作和变换;
  • 集成于节点,可通过节点如wrangle、vop等节点嵌入到节点工作流中;

        虽然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; ...) {...;}
  • 自定义函数必需在使用前声明;
  • 函数自动会被编译器内联,因此递归不起作用;使用shader call去编写递归算法;
  • 类似enderMan Shading Language,参数总是被引用传递;函数中修改会影响调用的变量,可使用const强制只读;为确保函数写出一个输出参数,在其前添加关键字export;
  • 自定义函数的数量没有限制;
  • 可直接访问全局变量(不像RenderMan Shading Language,需要用extern声明),建议不要访问全局变量(会限制函数的使用(只有全局变量存在的地方));
  • 可在函数内部定义函数;
//参数,相同类型可逗号隔开,不同类型封号隔开
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

  • 一个VEX程序必需包含一个函数,其返回类型是语境的名字;这是程序的主函数,被mantra调用的主函数;编译器要求每一个文件都有一个语境函数;
  • 该函数应该完成计算任何所需的信息和修改全局变量的工作(通过调用内置和/或用户定义的函数);不应在语境函数使用return返回值;
  • 语境函数的参数,会成为程序的用户界面,如shading节点的参数;
  • 如几何体属性和语境函数有相同的名字,属性会覆盖参数的值,即可通过几何体属性控制vex代码;
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;
}

你可能感兴趣的:(#,VEX,Houdini,VEX)