VEX —— 数据类型及操作符

这篇具有很好参考价值的文章主要介绍了VEX —— 数据类型及操作符。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一,数据类型

类型种类

struct

类型转换

二,操作符

点操作符 Dot operator

比较操作符 Comparisons

类型交互

操作符优先级

三,注释

四,保留的关键字


一,数据类型

        VEX即可在32模式下运行,也可在64位模式下运行;在32位下,所有float/vector/integer都是32位;在64位下,它们就是64位;无double和long类型;默认VEX使用32位integers,如使用AttribCast节点转换为64位,VEX会丢弃多余的位;

类型种类

可使用下划线来断开长数字;

  • int,整型,如1,-1,0x31,0b1,0212,1_000;
  • float,浮点型,如3.14,0.000_1;
  • vector2,二维向量,可表示纹理坐标,如{1,1};
  • vector,三维向量,可表示位置/方向/法线/颜色等,如{0,0,0};
  • vector4,四维向量,可表示位置(xyzw)或颜色(rgba),常用于四元数quaternion,如{0,0,0,1};
  • matrix2,二维矩阵,表示2D旋转矩阵,如{{1,0},{0,1}};
  • matrix3,三维矩阵,表示3D旋转矩阵或2D变换矩阵,如{{1,0,0},{0,1,0},{0,0,1}};
  • matrix,四维矩阵,表示3D变换矩阵,如{{1,0,0,0},{0,1,0,0},{0,0,1,0},{0,0,0,1}};
  • string,字符串,如“hello world”;
  • array,数组,如{0,1,2,3,4,5};
  • struct,结构体;
  • dict,字典;
  • bsdf,双向散射分布函数;

struct

        从H12起即可使用关键字struct定义新的结构化类型;类似C++11成员初始化,可在struct内给成员默认值;struct有两个隐式的构造函数,带参数(使用参数初始化成员)和不带参数(使用默认值);使用前必须定义;

        可在struct内定义函数,来组织代码并允许有限形式的面向对象编程;

  • 在struct函数内,可使用this来引用结构体实例;
  • 在struct函数内,可通过名字引用结构体字段,好像变量一样;
  • 可使用运算符->来调用结构体函数,如sampler->sample(),在结构体内部使用this->method();
struct randsampler {
    //Fields
    int  seed;

    //Methods
    float sample()
    {
        //Struct functions can refer to fields by name
        return random(seed++);
    }
} 

cvex shader()
{
    randsampler sampler = randsampler(11);
    for (int i = 0; i < 10; i++)
    {
        //Use -> to call methods on struct instances
        printf("%f\n", sampler->sample());
    }
}

Mantra特定类型

        Mantra有一些预定义的struct类型,用于特定的着色函数,如light,material,lpeaccumulator;

类型转换

        变量转换,类似C++/Java,将一种类型值转换为另一种类型,如int转换为float;

int a, b;
float c;
c = a / b; //编译器会进行整形除法
c = (float)a / (float)b; //编译器才会进行浮点除法

        函数转换,VEX调用函数不仅像C++/Java一样基于参数类型,还会基于返回值类型;为避免参数类型相同返回值类型不同而带来的歧义,可强制转换函数typename( ... )

float n;
n = noise(noise(P)); //即可调用float noise(vector),也可调用vector noise(vector)
n = noise(vector(noise(P)));
vector n = vector( noise(P) ); //无需转换,因为包含隐式转换
vector n = noise(P);

        由于函数转换不会产生任何类型转换(只是选择要调用的函数),因此使用它不会降低性能。 好的经验是尽可能使用函数转换,仅在需要显式类型转换时才使用变量转换;

二,操作符

        VEX具有标准的C语言操作,但也有些不同,如:

  • 两个vector或point相乘,表示各个元素间的相乘,而不是dot或cross;
  • 许多运算符是为非标量数据类型定义的,如vector*matrix会通过matrix变换vector;
  • 在不明确情况下,用一操作符将两不同类型组合后,其结果类型为右侧类型;
int + vector = vector

点操作符 Dot operator

  • 可使用点操作符,去访问vector、matrix、struct其中的各个组件;

Vector2,.x/.u访问第一个元素,.y/.v访问第二个元素;

Vector,.x/.r访问第一个元素,.y/.g访问第二个元素,.z/.b访问第三个元素;

Vector4,.x/.r访问第一个元素,.y/.g访问第二个元素,.z/.b访问第三个元素,.w/.a访问第四个元素;

Matrix,.xx访问[0][0],.zz访问[2][2],.ax访问[3][0]等;

v.xyz = set(v.x,v.y,v.z);

v1 = v.xyz; 

v4.rgba = set(v4.r,v4.g,v4.b,v4.a);

比较操作符 Comparisons

  • 关系操作符:==, !=, <, <=, >, >=
    • 左右类型应相同,仅限类型string、float、integer,返回整型;
  • 匹配操作符:~=
    • 字符串匹配操作符,相当于match函数;
  • 逻辑操作符:||, &&, !
  • 位操作符:&, |, ^,  ~

类型交互

  • float和int操作时,结果类型为左侧类型,如int*float=int;?
  • 如vector和scalar(int或float)加减乘除时,相当于与每个组件加减乘除;
{1.0, 2.0, 3.0} * 2.0 == {2.0, 4.0, 6.0}
  • 如不同尺寸的vectors加减乘除时,相当于小尺寸vector缺失一个组件1,然后在每个组件加减乘除;可能会产生意想不到的结果,建议单独手动操作组件;
{1.0, 2.0, 3.0} * {2.0, 3.0, 4.0, 5.0} == {2.0, 6.0, 12.0, 5.0}
//相当于
{1.0, 2.0, 3.0, 1.0} * {2.0, 3.0, 4.0, 5.0} == {2.0, 6.0, 12.0, 5.0}

操作符优先级

Order Operator Associativity Description
15 () LtR Function call, expression grouping, structure member
13 ! LtR Logical negation
13 ~ LtR One’s complement
13 + LtR Unary plus (for example, +5)
13 - LtR Unary minus (for example, -5)
13 ++ LtR Increment (for exmaple, x++)
13 -- LtR Decrememt (for example, x--)
13 (type) LtR Type cast (for example, (int)x)
12 * LtR Multiplication
12 / LtR Division
12 % LtR Modulus
11 + LtR Addition
11 - LtR Subtraction
10 < LtR Less-than
10 > LtR Greater than
10 <= LtR Less-than or equal
10 >= LtR Greater than or equal
9 == LtR Equal
9 != LtR NOT Equal
9 ~= LtR String matches
8 & LtR Bitwise AND
7 ^ LtR Bitwise XOR
6 | LtR Bitwise OR
5 && LtR Logical AND
4 || LtR Logical OR
3 ?: LtR Ternary conditional (for example, x ? "true" : "false")
2 = += -= *= /= %= &= |= ^= RtL Variable assignment
1 , LtR Argument separator

三,注释

VEX 使用 C++ 风格的注释:文章来源地址https://www.toymoban.com/news/detail-496203.html

  • 单行注释前面加//;
  • 自由格式注释以 /* 开头并以 */ 结尾;

四,保留的关键字

  • char,int,float,vector2/,vector/vector4,matrix2/matrix3/matrix,string,void
  • struct,dict,union
  • if,else
  • do,for,while,foreach
  • break,continue,return
  • true,false
  • const
  • typedef
  • export
  • bsdf
  • color
  • normal
  • hpoint
  • import
  • integer
  • point
  • forpoints
  • illuminance
  • gather

到了这里,关于VEX —— 数据类型及操作符的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C语言】表达式求值相关问题汇总—>隐式类型转换(整型提升)、算数转换与操作符优先级汇总(收藏查阅)

     👀 樊梓慕: 个人主页   🎥 个人专栏: 《C语言》《数据结构》《蓝桥杯试题》 🌝 每一个不曾起舞的日子,都是对生命的辜负。 目录 前言: 一、隐式类型转换 (一)整型提升的意义 (二)如何进行整型提升呢? 二、算数转换 三、操作符的属性 (一)操作符优先级汇

    2024年02月16日
    浏览(44)
  • [SQL开发笔记]BETWEEN操作符:选取介于两个值之间的数据范围内的值

    一、功能描述: BETWEEN操作符:选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。 二、 BETWEEN 操作符语法详解: BETWEEN操作符语法: 参数说明: 1.column1, column2, ...:要选择的字段名称,可以为多个字段。如果不指定字段名称,则会选择所有字段。

    2024年02月08日
    浏览(51)
  • 【C语言初阶】带你轻松玩转所有常用操作符(1) ——算数操作符,移位操作符,位操作符

    君兮_的个人主页 勤时当勉励 岁月不待人 C/C++ 游戏开发 Hello,这里是君兮_,最近要准备期末复习了,可能更新的就不会那么频繁了,下个星期恢复正常更新。 今天给大家带来的是操作符详解,由于这部分的内容比较多,可能会分成几部分讲,今天带来的是第一部分的内容,废

    2024年02月11日
    浏览(45)
  • 【PostgreSQL】函数与操作符-比较函数和操作符

    PostgreSQL中的比较函数和操作符用于比较两个表达式的值。它们的作用是确定表达式的值是否满足某种条件,例如等于、大于、小于等。 比较函数是一个接受两个参数的函数,返回一个布尔值,表示两个参数是否满足某种条件。例如,equal()函数用于判断两个参数是否相等,

    2024年01月17日
    浏览(52)
  • 初始C语言——详细讲解操作符以及操作符的易错点

     第一章 “C“浒传——初识C语言(更适合初学者体质哦!)  第二章 详细认识分支语句和循环语句以及他们的易错点   第三章 初阶C语言——特别详细地介绍函数  第四章 初始C语言——详细地讲解数组的内容以及易错点  第五章  初始C语言——详细讲解操作符以及操

    2024年02月13日
    浏览(56)
  • Js中.?和??语法(可选链操作符和双问号操作符)

    Tips:为啥起这么一个标题呢,因为我自己当时看代码,看到这个语法的时候就感觉有些遗忘,但是又不知道他叫做什么名字,所以只能直接搜索.?和??这样搜索,哈哈哈相信不少人可能跟我一样,不知道他叫做什么名字嘿嘿。 可选链 操作符( ?. )允许读取位于连接对象链深

    2024年01月21日
    浏览(46)
  • 【c语言操作符系列1】^(异或操作符)讲解和多种例题详解

    目录 一、^ 是什么(^称为异或) 二、^的规律(特点) 三、可利用^秒杀的常见例题(重点) 1、消失的数字  2、不一样的人生密码 3、交换两个数(不能创建中间变量) 4、找出只出现一个的两个数字 是一种操作符, 针对二进制异或而言的 ,两个数对应的二进制位相同,异或

    2024年02月16日
    浏览(68)
  • 【C语言】中的位操作符和移位操作符,原码反码补码以及进制之间的转换

    欢迎大家来到c语言知识小课堂,今天的知识点是操作符和进制 同样都是数字1111,不同进制下数字的大小不同,第二行代表的是其各位数字十进制下的大小,将各位数字的十进制大小相加即1111在这个进制下转化为十进制的大小,从图中我们可以看出来 进制的定义:从右往左

    2024年02月22日
    浏览(52)
  • 前端JS实用操作符,一些骚操作✨

             目录 0、!!  双重逻辑非操作符  📚 1、?? 操作符 空值合并/空判断  ✅ 2、?. 可选链运算符🔍 3、??= 操作符 逻辑空值赋值运算符 💚 4、三元运算符 📗 5、~~ 操作符 双位运算符 🔨 6、与 ||或 短路运算符 🚂 7、| 0 取整 🚁 8、 1 判断奇偶数 🎨 9、_ 数值分割

    2024年02月14日
    浏览(47)
  • ES6...扩展操作符骚操作

    复制和合并数组变得更为简洁。不需要使用 concat() 方法或 slice() 方法,一个 … 操作符已经足够: 将数组作为一个需要单独一个个传入参数的函数的参数 对象属性展开复制 如果存在相同的值 后者覆盖前者 合并对象 类似于object.assign 不过,扩展属性并不总能生成与 Object.as

    2024年02月14日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包