OpenGL ES 3. 着色器语言:shader language 一

大家好,接下来将为大家介绍OpenGL ES 3.x 着色器语言:shader language。

1、指定版本

OpenGL ES的顶点着色器和片段着色器的第一行声明GLSL的版本:(如果没有指定,则默认为 1.0版本)。

#version 300 es // 使用3.0版本

2、变量类型

类型 说明
void 空类型,即不返回任何值
bool 布尔类型 true,false
int 带符号的整数 signed integer
float 带符号的浮点数 floating scalar
vec2, vec3, vec4 n维浮点数向量 n-component floating point vector
bvec2, bvec3, bvec4 n维布尔向量 Boolean vector
ivec2, ivec3, ivec4 n维整数向量 signed integer vector
mat2, mat3, mat4 2x2, 3x3, 4x4 浮点数矩阵 float matrix
sampler2D 2D纹理 a 2D texture
samplerCube 盒纹理 cube mapped texture

3、变量声明、赋值

OpenGL ES 不支持指针类型。

在 OpenGL ES 中,对于类型转换有很严格的限制,即变量只允许使用相同类型的其它变量进行赋值或其它操作。

标量类型示例:

float mFloat = 1.0;
float mFloat2 = 1;     // error: invalid type conversion
bool mBool = true;
int mInt = 0;
int mInt2 = 0.0;       // error: invalid type conversion
mFloat = float(mBool); // 正确,bool -> float
mFloat = float(mInt);  // 正确,int -> float
mBool = bool(mInt);    // 正确,int -> bool

向量类型示例:

vec4 mVec4 = vec4(1.0);             // mVec4 = {1.0, 1.0, 1.0, 1.0}
vec3 mVec3 = vec3(1.0, 0.0, 0.5);   // mVec3 = {1.0, 0.0, 0.5}
vec3 temp = vec3(mVec3);            // temp = mVec3
vec2 mVec2 = vec2(mVec3);           // mVec2 = {mVec3.x, mVec3.y}
mVec4 = vec4(mVec2, temp);          // mVec4 = {mVec2.x, mVec2.y, temp.x, temp.y}

矩阵类型示例:

矩阵类型的构造函数则更加灵活,规则如下:
1) 如果只提供了一个标量(基本数据类型),则会用这个值填充矩阵的对角线,比如 mat4(1.0) 将会构造一个 4x4 的单位矩阵
2) 可以使用多个向量构造,比如 mat2 可以使用两个 vec2 构造
3) 可以使用多个标量构造

需要注意的是,和平时的写法不同,OpenGL 中的矩阵以列优先的形式排序:

mat3 myMat3 = mat3(1.0, 0.0, 0.0,  // 第一列
                   0.0, 1.0, 0.0,  // 第二列
                   0.0, 1.0, 1.0); // 第三列

4、向量和矩阵分量示例

根据组成 vector 的成员数量,可以通过 {x, y, z, w},{r, g, b, a}, 或 {s, t, p, q} 来访问它的成员,x、r、s 永远指向第一个成员,使用不同的名字仅仅只是为了方便,但不能混合使用,即不能用 ".xgr" 这样的形式。使用示例:

vec3 mVec3 = vec3(0.0, 1.0, 2.0); // mVec3 = {0.0, 1.0, 2.0}
vec3 temp;
temp = mVec3.xyz; // temp = {0.0, 1.0, 2.0}
temp = mVec3.xxx; // temp = {0.0, 0.0, 0.0}
temp = mVec3.zyx; // temp = {2.0, 1.0, 0.0}

也可以使用 "[]" 操作符,需要注意的是,矩阵是以列排序的:

mat4 mMat4 = mat4(1.0);      // 初始化对角线的值为 1.0 (单位矩阵)
vec4 col0 = mMat4[0];        // 从矩阵中获取第 0 列向量
float m1_1 = mMat4[1][1];    // 从矩阵中获取元素 [1][1]
float m2_2 = mMat4[2].z;     // 从矩阵中获取元素 [2][2]

5、常量示例

常量必须在声明的时候初始化:

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);
const bool mBool = true;


6、结构体示例

  struct mixStruct {
      vec4 color;
      float start;
      float end;
      int fault;
  } mMix;  //定义了一个mixStruct的结构体类型和mMix的结构体变量
mMix = mixStruct(vec4(0.0, 1.0, 0.0, 1.0), // color
                               0.5,        // start
                               2.0,        // end
                               1.0);       // fault

7、数组示例

数组声明及初始化:

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));

未完续下一节。

最后,欢迎大家一起交流学习:微信:liaosy666 ; QQ:2209115372 。

发布了15 篇原创文章 · 获赞 25 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/u010281924/article/details/105272252