OpenGL ES 3.0编程指南:第五章. OpenGL ES Shading Language --- (二)

[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语言有一些内建方法来进行向量的比较。

你可能感兴趣的:(OpenGL ES 3.0编程指南:第五章. OpenGL ES Shading Language --- (二))