GLSL ES着色器语言-数据类型

基本数据类型

关键字 数据类型
bool 布尔值 布尔变量值为true或false
int 整形数 值为整数,如1,2,3….
float 单精度浮点数 浮点数用小数点表示,如0.6,3.14,2.8
// bool关键字声明一个数据类型是布尔值的变量,并赋值为true
bool lightBool = true;
// 改变变量的值
lightBool = false;
// 着色器语言定义一个整形常量
int count = 10;
// 改变变量count的值
count = 20;
// 定义一个浮点数变量num,并赋值10.0,赋值为整数时会报错
float num = 10.0;

数据类型转换

整型数int、浮点数float、布尔值bool三种不同的数据值可以相互转化,把一个类型转化为另一个类型通过相应的内置函数int()float()bool()实现。

转化 函数 规则
浮点数转整型数 int(10.1) 直接把浮点数部分去掉,10.1转化为10
整型数转浮点数 float(10) 整型数直接转化为浮点数10.0
数值转布尔值 bool(10) 0或0.0转化为false,非0或非0.0转化为true
布尔值转整型数 int(true) false转化为0,true转化为1
布尔值转浮点数 float(true) false转化为0.0,true转化为1.0
//声明一个整型数变量num,并赋值1
int num = 1;
// 整型数num转化为浮点数fnum
float fnum = float(num);
//声明一个浮点数变量fnum,并赋值1.0
float fnum = 1.08;
// 浮点数转化整型数
int inum = int(num);//转化结果1

矢量/向量

关键字 数据类型
vec2 二维向量,具有xy两个分量,分量是浮点数。
vec3 三维向量,具有xyz三个分量,分量是浮点数
vec4 四维向量 ,具有xyzw四个分量,分量是浮点数
ivec2 二维向量,分量是整型数
ivec3 三维向量 ,分量是整型数
ivec4 四维向量 ,分量是整型数
bvec2 二维向量,分量是布尔值bool
bvec3 三维向量 ,分量是布尔值bool
bvec4 四维向量 ,分量是布尔值bool
声明变量

vec3 direction;

构造函数赋值

向量类型数据需要通过相应的构造函数创建,vec3()构造函数创建一个三维向量赋值给direction变量

vec3 direction;
// 赋值
direction = vec3(1.0,0.0,0.0);
// 声明一个整型二维向量,ivec2所有参数都是整型数
ivec2 iv2 = ivec2(5,3);
访问获取向量分量

一个向量由多个不同分量构成,可以通过符号.进行访问

向量vector 访问方法
第一个分量 vector.x
第二个分量 vector.y
第三个分量 vector.z
第四个分量 vector.w

如:

// 声明一个三维向量,假设向量表示三维坐标中一个位置坐标
vec3 pos = vec3(10.2,9.6,3.9);
// 访问x坐标
float x = pos.x;//访问获取向量的x分量
// 访问z坐标
float z = pos.z;//访问获取向量的z分量
// 声明一个三维向量,假设表示RGB颜色值,三个参数分别表示红色R、绿色G、蓝色B
vec3 rgb = vec3(0.5,0.3,0.2);
// 访问颜色值R分量
float R = rgb.x;//访问获取向量的x分量
// 访问颜色值G分量
float G = rgb.z;//访问获取向量的z分量

向量的分量可以获取赋值给其它的变量,也可以通过访问分量改变向量的值。

// 声明一个三维向量,假设向量表示三维坐标中一个位置坐标
vec3 pos = vec3(10.2,9.6,3.9);
// 三维向量pos的x分量被改变,相当于在原来的基础上沿着x轴平移2.0
pos.x = pos.x+2.0;
// 直接改变三维向量的x分量,相当于把顶点的x坐标值直接设置为20.0
pos.x = 20.0;
向量分量更多灵活写法
// 声明一个三维向量变量,并赋值
vec3 v3 = vec3(10.0,9.0,3.0);
// 声明一个二维向量
vec2 v2;
// 提取向量v3的xy两个分量赋值给二维向量v2
v2 = v3.xy;//v3.xy相等于vec2(10.0,9.0);
// v3的x分量赋值给v2的x分量,v3的z分量赋值给v2的y分量
v2 = v3.xz;//获得zx分量  v3.xz等价于vec2(10.0,3.0)
v2 = v3.yz;//获得yz分量
//获得zx分量 v3的z分量赋值给v2的x分量,v3的x分量赋值给v2的y分量
v2 = v3.zx;

// 声明一个四维向量变量,并赋值
vec4 v4 = vec4(10.0,9.0,3.0,1.0);
// 提取v4前三个分量,并赋值给一个三维向量变量
vec3 v3 = v4.xyz;

// 声明一个四维向量变量,并赋值
vec4 v4 = vec4(10.0,9.0,3.0,1.0);
// 访问特定分量,使用构造函数重新构造一个向量
vec3 v3 = vec3(v4.x,2.9,v4.y);
vec2 v2 = vec2(v4.x,v4.z);
数学运算

一个向量加一个数字,相当于每个分量加上该数字,注意向量分量是整型数还是浮点数,加上的数字保持数据类型一致。

//加法:
vec3 pos = vec3(1.0,2.0,3.0);
pos = pos+1.0;//pos新的值为vec3(2.0,3.0,4.0)
vec3 pos2 = pos+1.0;//pos不改变,赋值给新的变量

//减法:
vec3 pos = vec3(1.0,2.0,3.0);
pos = pos-1.0;//pos新的值为vec3(0.0,1.0,2.0)

//乘法
vec3 pos = vec3(1.0,2.0,3.0);
pos = pos*2.0;//pos新的值为vec3(2.0,4.0,6.0)

//除法
vec3 pos = vec3(1.0,2.0,3.0);
pos = pos/2.0;//pos新的值为vec3(0.5,1.0,1.5)

两向量

//加法:
vec3 v1 = vec3(1.0,2.0,3.0);
vec3 v2 = vec3(-1.0,-2.0,-3.0);
vec3 v3 = v1+v2;//结果为vec3(0.0,0.0,0.0)

//减法:
vec3 v1 = vec3(1.0,2.0,3.0);
vec3 v2 = vec3(-1.0,-2.0,-3.0);
vec3 v3 = v1-v2;//结果为vec3(2.0,4.0,6.0)

//乘法
vec3 v1 = vec3(1.0,2.0,3.0);
vec3 v2 = vec3(-1.0,-2.0,-3.0);
vec3 v3 = v1*v2;//结果为vec3(-1.0,-4.0,-9.0)

//除法
vec3 v1 = vec3(1.0,2.0,3.0);
vec3 v2 = vec3(-1.0,-2.0,-3.0);
vec3 v3 = v1/v2;//结果为vec3(-1.0,-1.0,-1.0)

矩阵

着色器语言中通过关键字mat2mat3mat4分别声明一个2x2矩阵、3x3矩阵、4x4矩阵,通过内置函数mat2()mat3()mat4()分别创建一个2x2矩阵、3x3矩阵、4x4矩阵。

关键字 数据类型
mat2 2x2矩阵,4个元素
mat3 3x3矩阵,9个元素
mat4 4x4矩阵,16个元素
构造函数赋值

创建一个4x4矩阵并赋值

// 需要表示的矩阵
// 1.1 1.2 1.3 1.4
// 2.1 2.2 2.3 2.4
// 3.1 3.2 3.3 3.4
// 4.1 4.2 4.3 4.4
mat4 matrix4 = mat4(
1.1,2.1,3.1,4.1,
1.2,2.2,3.2,4.2,
1.3,2.3,3.3,4.3,
1.4,2.4,3.4,4.4
);
快速创建对角矩阵

如果是对角矩阵,可以直接传入一个参数就可以。

// 2.0 0.0 0.0 0.0
// 0.0 2.0 0.0 0.0
// 0.0 0.0 2.0 0.0
// 0.0 0.0 0.0 2.0
mat4 matrix = mat4(2.0)
访问矩阵元素([ ]运算符)
mat4 matrix4 = mat4(
1.1,2.1,3.1,4.1,
1.2,2.2,3.2,4.2,
1.3,2.3,3.3,4.3,
1.4,2.4,3.4,4.4
);
// 访问矩阵matrix4的第二列
vec4 v4 = matrix4[1];//返回值vec4(1.2,2.2,3.2,4.2)
// 访问矩阵matrix4的第三列第四行对应的元素
float f = matrix4[2][3];//返回4.3
数学运算(矩阵与浮点数)
mat4 matrix4 = mat4(1.1,2.1,3.1...);
mat4 m2 = matrix4*10;//结果是mat4(11.0,21.0,31.0...)
数学运算(矩阵乘向量)
//声明一个四维向量pos,xyz的坐标是0.8,3.2,6.8,假设表示一个顶点位置坐标
vec4 pos = vec4(0.0,3.2,6.8,1.0);
//创建平移矩阵(表示沿x轴平移-0.4)
//1   0   0  -0.4
//0   1   0    0
//0   0   1    0
//0   0   0    1
mat4 m4 = mat4(1,0,0,0,  0,1,0,0,  0,0,1,0,  -0.4,0,0,1);
//平移矩阵m4左乘顶点坐标pos(vec4类型数据可以理解为线性代数中的nx1矩阵,即列向量)
// 顶点位置坐标pos进行平移变换
vec4 newPos= m4*pos;//平移后结果:newPos = vec4(-0.4,3.2,6.8,1.0)
数学运算(矩阵乘矩阵)

mx*my:表示矩阵mx左乘矩阵my,着色器中矩阵之间乘法运算规则和线性代数中规则一致。

假设mxmy都是旋转矩阵,下面代码表示旋转矩阵mx和旋转矩阵my的乘积,然后对顶点进行变换,相当顶点旋转执行mx和my两次旋转。

// 顶点齐次坐标pos
vec4 pos = vec4(0.0,3.2,6.8,1.0);
float radian = radians(30.0);//角度转弧度
float cos = cos(radian);//求解旋转角度余弦值
float sin = sin(radian);//求解旋转角度正弦值
//旋转矩阵mx,创建绕x轴旋转矩阵
mat4 mx = mat4(1,0,0,0,  0,cos,-sin,0,  0,sin,cos,0,  0,0,0,1);
//旋转矩阵my,创建绕y轴旋转矩阵
mat4 my = mat4(cos,0,-sin,0,  0,1,0,0,  sin,0,cos,0,  0,0,0,1);
//两个旋转矩阵、顶点齐次坐标连乘
vec4 newPos = mx*my*pos;