基础类型间的运算:
glsl中,没有隐式类型转换,原则上glsl要求任何表达式左右两侧(l-value),(r-value)的类型必须一致 也就
是说以下表达式都是错误的:
下面来分别说说可能遇到的情况:
1. float 与 int :
float与float , int与int之间是可以直接运算的,但float与int不行.它们需要进行一次显示转换.即要么把
float转成int: int(1.0)
,要么把int转成float: float(1) ,以下表达式都是正确的:
2. float 与 vec(向量) mat(矩阵) :
vec,mat这些类型其实是由float复合而成的,当它们与float运算时,其实就是在每一个分量上分别与
float进行运算,这就是所谓的 逐分量 运算.glsl里
大部分涉及vec,mat的运算都是 逐分量 运算,但也并不全是. 下文中就会讲到特例.
逐分量 运算是线性的,这就是说 vec 与 float 的运算结果是还是 vec.
int 与 vec,mat之间是不可运算的, 因为vec和mat中的每一个分量都是 float 类型的. 无法与int进行逐
分量计算.
下面枚举了几种 float 与 vec,mat 运算的情况
左值:表示一个储存位置,可以是变量,也可以是表达式,但表达式最后的结果必须是一个储存位置.
右值:表示一个值, 可以是一个变量或者表达式再或者纯粹的值.
操作符的优先级:决定含有多个操作符的表达式的求值顺序,每个操作的优先级不同.
操作符的结合性:决定相同优先级的操作符是从左到右计算,还是从右到左计算。
int a =2.0; //错误,r-value为float 而 lvalue 为int.
int a =1.0+2;
float a =2;
float a =2.0+1;
bool a = 0;
vec3 a = vec3(1.0, 2.0, 3.0) * 2;