Open GL ES 编程基础(一)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011374318/article/details/80474583

Open GL ES 着色语言基础

Open GL ES 着色语言版本

要想进行 Open GL ES 编程,首先应该熟悉 Open GL ES 着色语言,着色语言有 1.00 版本,用于 Open GL ES 2.0 版本接口,
而后来为了同接口版本相统一,便直接在着色语言的下一个版本直接使用了 3.00 版本,所以在编写着色器时,首先要使用下面的语句声明要使用的语言版本。

#version 300 es

如果不进行声明,则默认使用着色语言 1.00 版本,其对应 Open GL ES 2.0 接口版本。

变量和变量类型

在 Open GL ES 着色语言中,变量类型可分为:标量、向量和矩阵。而这些分类的变量又可以分别基于整数、浮点数、无符号整数和布尔类型。

变量分类 类型 说明
标量 float,int,uint,bool 不同类型的标量
浮点向量 float,vec2,vec3,vec4 基于浮点的向量类型,分量可以有1到4个
整数向量 int,ivec2,ivec3,ivec4 基于整数的向量类型,分量可以有1到4个
无符号整数向量 uint,uvec2,uvec3,uvec4 基于无符号整数的向量类型,分量可以有1到4个
布尔向量 bool,bvec2,bvec3,bvec4 基于布尔的向量类型,分量可以有1到4个
矩阵 mat2(mat2x2),mat2x3,mat2x4,
mat3x2,mat3(mat3x3),mat3x4,
mat4x2,mat4x3,mat4(mat4x4)
不同阶的矩阵,这些矩阵都是基于浮点的

vec 是 vector 的缩写,mat 是 matrix 的缩写。

变量的声明

在着色语言中使用变量,必须先进行声明,在声明时,可以进行初始化,也可以将初始化放在后面。

另外,对于不同的数据类型进行转换时,必须要使用变量构造器显示转换,不可以进行隐式转换。

  1. 标量的初始化

    float myFloat1 = 1.0;
    float myFloat2 = 1;//错误的初始化方法
    int myInt = 3;
    bool myBool = true;
    myFloat1 = float(myInt);
    myFloat2 = float(myBool);
    myBool = bool(myInt);
  2. 向量的初始化

    对于向量的初始化,可以使用标量或向量,如果只提供一个标量,那么该标量则用于初始化向量的所有分量,如果提供多个标量或者向量,
    那么向量的初始化将从提供的值中从左至右依次进行赋值。

    vec4 myVec4 = vec4(2.0);//myVec4 = {1.0,1.0,1.0,1.0}
    vec3 myVec3 = vec3(1.0,2.0,3.0);//myVec3 = {1.0,2.0,3.0}
    vec3 temp = vec3(myVec3);//temp = myVec3
    vec2 myVec2 = vec2(myVec3);//myVec2 = {myVec3.x,myVec3.y}
    
    myVec4 = vec4(myVec2,temp);//myVec3 = {myVec2.x,myVec2.y,temp.x,temp.y}
  3. 矩阵的初始化

    对于矩阵,只要提供足够的分量,那么就可以初始化矩阵,并且提供的初始化值是以列优先来映射矩阵的,另外,如果只提供一个标量值,那么该值会用于初始化矩阵的对角线。

    mat4 myMat4 = mat4(1.0);//声明并初始化了一个一个4阶单位矩阵
    mat3 myMat3 = mat3(11,21,31,//矩阵第一列
                          12,22,32,//矩阵第二列
                          13,23,33);//矩阵第三列

向量与矩阵分量

对于向量,可以使用点运算符或数组下标访问具体的分量,根据向量表达的不同含义(坐标、颜色、纹理)可以分别使用{x, y, z, w}、
{r, g, b, a}、{s, t, p, q} 三种运算符组合,但是这三种组合不能混合使用。

vec3 myVec3 = vec3(1.0, 2.0, 3.0);
vec3 temp;

temp = myVec3.xyz;//temp = {1.0, 2.0, 3.0}
temp = myVec3.xxx;//temp = {1.0, 1.0, 1.0}
temp = myVec3.zyx;//temp = {3.0, 2.0, 1.0}

float myFloat = temp[2];//myFloat = 1.0

使用数组下标还可以访问指定的矩阵列,进而可以访问指定列的指定分量。

mat4 myMat4 = mat4(1.0);

vec4 col_0 = myMat4[0];
float m1_1 = myMat4[1][1];//矩阵第二列第二个分量
float m2_2 = myMat4[2].z;//矩阵第三列第三个分量

常量

使用 const 关键字可以将任何类型的变量声明为常量,常量是着色器中不变的量,需要在声明时进行初始化。

const float pi = 3.1415926;
const vec4 red = vec4(1.0, 0.0, 0.0, 1.0);
const mat4 identify = mat4(1.0);

结构体

同 C 语言一样,可以将不同的变量聚合在一起,定义结构体类型。定义结构体后,使用同结构体同名的构造器对变量进行初始化,
构造器的参数类型同结构体中成员一致,而其成员的访问同样使用点运算符。

struct myStruct {vec4 color; float start; float end;} myStructVar; 

myStructVar = myStruct(vec4(1.0), 1.0, 2.0);

vec4 color = myStructVar.color;
float start = myStructVar.start;
float end = myStructVar.end;

数组

OpenGL ES 着色语言同样支持数组,同 C 语言语法类似,其索引从 0 开始。

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

运算符

同 C 语言类型,OpenGL ES 着色语言中提供类似的运算符,诸如 + 、- 、* 、/ 、% 、++ 、– 、= 、+= 、-= 、*= 、/= 、== 、!= 、< 、> 、<= 、>= 、&& 、^^ 、|| 、>> 、<< 、& 、^ 、| 、?: 、,(序列)等。

但是,需要注意的是,Open GL ES 着色语言中对类型有着严格的规则,所以运算只能在基于相同的基本类型的变量间进行。

另外,浮点、向量、矩阵之间可以进行相乘运算,而对于向量的比较运算,通常使用内建函数,而不宜使用比较运算符。

猜你喜欢

转载自blog.csdn.net/u011374318/article/details/80474583