[TOC]
5.Vector and Matrix Components
一个向量既可以通过“.”操作符也可以通过“[ ]”下标来访问它的分量。
- 当使用“.”操作符时,通过{x, y, z, w}、{r, g, b, a} 或者 {s, t, p, q}来依次访问它的分量。这三种方式仅仅是为了方便,并无其它特殊之处,但要注意三种方式不能混用。
vec3 myVec3 = vec3 (0.0, 1.0, 2.0); // myVec3 = {0.0, 1.0, 2.0}
vec3 temp;
temp = myVec3.xyz; // temp = {0.0, 1.0, 2.0}
temp = myVec3.xxx; // temp = {0.0, 0.0, 0.0}
temp = myVec3.zyx; // temp = {2.0, 1.0, 0.0}
- 当使用“[ ]” 时,从下标0开始计数。
一个矩阵可以看作由几个向量组成的,对于矩阵来说,使用“[ ]”可以获得它的一个列向量,然后可以根据向量规则来获取每一个分量。
mat4 myMat4 = mat4(1.0);
vec4 colo = myMat4[0];
float m1_1 = myMat4[1][1];
float m2_2 = myMat4[2].z;
6.Constants
任何基础类型都可以声明为常量。常量值不能改变,并且必须在声明时就初始化。
const float zero = 0.0;
const float pi = 3.1415926;
const vec4 red = vec4(1.0, 0.0, 0.0, 1.0);
const mat4 identity = mat4(1.0);
7.Structures
除了使用基础类型以外,可以使用结构体:
struct fogStruct
{
vec4 color;
float start;
float end;
} fogVar;
结构体使用构造器进行初始化,在一个新的结构体类型被定义后,相应的构造器也会自动生成。在使用构造器进行初始化时,每一个变量类型必须一一对应:
struct fogStruct
{
vec4 color;
float start;
float end;
} fogVar;
fogVar = fogStruct (vec4(0.0, 1.0, 0.0, 0.0), // color
0.5, // start
2.0); // end
访问结构体的元素的方法和C语言中的结构体类似:
vec4 color = fogVar.color;
float start = fogVar.start;
float end = fogVar.end;
8.Arrays
Shader语言也支持数组。数组的语法和C语言中的数组语法类似:
float floatArray[4];
vec4 vecArray[2];
数组可以用构造器进行初始化:
float a[4] = float[ ] (1.0, 2.0, 3.0, 4.0);
float b[4] = float[4] (1.0, 2.0, 3.0, 4.0);
vec2 c[2] = vec2[2] (vec2(1.0), vec2(1.0));
为数组构造器提供大小是可选的。数组构造器中的参数的数量必须和数组大小相等。
9.Operators
Shader语言中的运算符大部分和C语言中的一样。因为shader语言有着严格的类型规则,运算符只能用在相同类型之间。
除了 == 和 !=之外,比较运算符(<, <=, >, >=)只能用于标量。Shader语言有一些内建方法来进行向量的比较。