-x : 返回x向量的负值,表示与原向量方向相反的向量。
x+y: 计算向量x和向量y的和,x和y向量必须是同维度的。
x-y: 计算两个向量的差值,两个向量也必须是同维度的。
x*y: 如果x和y都是向量,那么该运算符进行的是逐分量的相乘计算;如果是矩阵相乘,那么该运算符会返回一个线性相乘(线性代数中正常的矩阵乘法)的矩阵,而不是一个逐分量的相乘结果(如果想得到的是逐分量的相乘结果,那就需要使用matrixCompMult函数)。
x/y: 除法运算符与乘法运算符比较相似。
dot(x,y): 返回两个向量的点乘积(标量),这两个向量必须是同维度的。
cross(vec3 x,vec3 y): 返回两个向量的叉乘结果(向量),x和y必须都是vec3类型的向量。
matrixCompMult(mat x,mat y): 返回两个矩阵的逐分量的相乘结果,x和y必须是同维度的(mat2,mat3或mat4)。
mat matrixCompMult (mat x, mat y)矩阵x乘以y,result[i][j]是 x[i][j] 和 y[i][j] 的 标量积。注意,要获取线性代数矩阵的乘法,使用乘法操作符*。
normalize(x): 返回向量x的单位矩阵。
reflect(t,n): n是法向量,t是入射向量,返回t轴对称于法向量的反射向量。
clamp(a,b,c): 用于返回a、b、c中的中间值
补充说明:
GLSL 与C/C++类似但是有一些细微的差别。
另外GLSL 具有以下的特点/约束:
GLSL是100%类型安全的。你不能将一个整型不加转换直接传给一个浮点型:
float my_float = 1; // Won’t Work! “1” Is An Integer!
float my_new_float = 1.0; // Will Work!
Casts have to be done using constructors. For example this won’t work:
类型转换必须使用构造器。比如下面的代码:
vec2 my_vec;
ivec2 my_int_vec;
my_vec2 = (vec2)my_int_vec; // Won’t Work Because No Constructor Is Used!
my_vec2 = vec2(my_int_vec); // Will Work!
向量和矩阵只能使用构造器赋值:
vec3 my_vec = vec3(1.0, 1.0, 1.0);
mat3 my_mat = mat3(1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0);
向量相乘是按分量逐个作出的乘积:
vec3 my_vec1 = vec3(5.0, 1.0, 0.0);
vec3 my_vec2 = vec3(1.0, 3.0, 4.0);
vec3 product = my_vec1 * my_vec2; // Will Return This Vector: (5.0, 3.0, 0.0)
也可以对向量和矩阵进行相乘。
矩阵* 向量将把向量当做列向量(OpenGL标准)。
向量* 矩阵将把向量当做行向量 (DirectX 标准)。
比如一个顶点以这种方式进行法线变换:
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex
这将简单地将顶点的位置通过模型视图投影矩阵变换。也可以使用其他内置的运算子:
dot :点乘
cross :叉乘
texture2D :用于对纹理采样
normalize :对一个向量规格化
clamp :将一个向量固定在一个最小值和最大值之间
表2-3 GLSL的内置函数(部分)
函 数 | 说 明 |
pow() | 幂函数(对矢量和标量 同样有效,下同) |
exp(), log() | 指数函数,对数函数 |
abs() | 绝对值 |
sqrt() | 平方根 |
max(), min() | 最值 |
ceil(), floor() | 取大于实参的最小整数,取小 于实参的最大整数 |
sin(), cos(), tan() | 三角函数 |
asin(), acos(), atan() | 反三角函数 |
sinh(), cosh(),<a>tanh () | 双曲正弦,双曲余弦,双曲正切 (以及相应的反函数) |
length() | 向量长度 |
distance() | 两个向量的距离 |
dot(), cross() | 数乘,叉乘 |
matrixCompMult() | 矩阵对应元素分别相乘 |
transpose(), determinant(), inverse() | 矩阵的转置,行列式,逆 |
lessThan(), greaterThan(), equal() | 小于,大于,等于(对实参向量对应位 置的每个分量做大小比较,生成布尔向量) |
Reference:
http://book.51cto.com/art/201205/338109.htm
http://www.opengl.org/sdk/docs/manglsl/xhtml/matrixCompMult.xml
http://blog.csdn.net/hgl868/article/details/7876257#t3
http://www.opengl.org/sdk/docs/manglsl/