Shader 入门:GLSL ES(数据类型)
在上一篇文章中我们初步了解了 GLSL ES 的基本语法,那么本篇文章就和大家一起学习 GLSL ES 的数据类型。
Let’s go!!!
上一篇:《Shader 入门:GLSL ES(简介和基本语法)》
在本系列文章中主要针对 GLSL ES 3.0 进行讲解
正文
数据类型
标量(Scalar)
标量表示只有大小没有方向的量。
关键字
关键字 |
含义 |
|
int |
有符号整型(Signed Integer) |
|
uint |
无符号整型(Unsigned Integer) |
|
float |
单精度浮点型(Single Floating-Point) |
|
bool |
布尔型(Boolean) |
声明并赋值:
1 2 3 4 |
int age = 18; // 整型 uint hello = 3u; // 无符号整型,在后面数字加 u float pi = 3.14; // 浮点型 bool isMe = true; // 布尔型 GLSL |
类型转换
标量类型之间可以互相转换。
- 将 float 类型的值转换为 int 和 uint 时小数点后面的值将会被忽略,要注意负的 float 类型的值不能转换为 uint 类型。
- 当 int、uint 或 float 类型的值转换为 bool 类型时,0 或 0.0 将会被转换为 false,所有非零的值都会被转换为 true。
- 当 bool 类型的值转换为 int、uint 或 float 类型时,false 将会被转换为 0 或 0.0,true 会被转换为 1 或 1.0。
我们可以使用标量类型的构造函数来进行类型转换:
1 2 3 4 5 |
int a = 1; float b = float(a); // 1.0 int c = int(b); // 1 uint d = uint(c); // 1u bool e = bool(d); // true GLSL |
当尝试将非标量值转换为标量值时,实际处理的将会是非标量值的第一个元素:
1 2 |
vec3 a = vec3(0.1, 0.2, 0.3); float b = float(a); // 0.1 GLSL |
向量(Vector)
在 GLSL 中向量一般用于储存顶点坐标、颜色或纹理坐标数据。
一个向量可以包含 2 到 4 个分量(Component),分量的类型也可以是以上基础类型中的任意一个,一般情况下我们使用浮点型 vecn 就已经足够了。
关键字
下面表格中的 n 为分量的个数
关键字 |
含义 |
举例 |
vecn |
包含 n 个 float 类型分量的向量 |
vec2、vec4 |
ivecn |
包含 n 个 int 类型分量的向量 |
ivec2、ivec4 |
uvecn |
包含 n 个 uint 类型分量的向量 |
uvec2、uvec4 |
bvecn |
包含 n 个 bool 类型分量的向量 |
bvec2、bvec4 |
创建向量
我们可以使用不同的构造函数来创建相应的向量:
1 2 3 |
vec2 coord = vec2(0.5, 0.5); // 含有 2 个 float 类型分量的向量 ivec3 police = ivec3(1, 1, 0); // 含有 3 个 int 类型分量的向量 bvec4 hello = bvec4(true, false, true, false); // 含有 4 个 bool 类型分量的向量 GLSL |
只传入一个参数的情况下会自动将其他值也设为第一个参数:
1 |
vec3 three = vec3(0.1); // 等同于 vec3(0.1, 0.1, 0.1) GLSL |
也可以使用一个向量作为参数传给另一个向量构造函数:
1 2 |
vec2 two = vec2(0.1, 0.2); vec3 three = vec3(two, 0.3); // vec3(0.1, 0.2, 0.3) GLSL |
而将“大”向量作为参数来创建“小”向量(降维)会自动抛弃多余的值:
1 2 |
vec4 four = vec4(0.1, 0.2, 0.3, 0.4); vec3 three = vec3(four); // 等同于 vec3(0.1, 0.2, 0.3),抛弃了 0.4 GLSL |
获取分量
通过分量名来获取向量中的第 1 到第 4 个分量,包括:
实际上所有向量都可以使用 rgba、rgba 和 stpq 分量名,但是为了代码的严谨性和可读性,建议使用相应的分量名
分量名(对应第 1 - 4 个分量) |
使用场景 |
|
x, y, z, w |
顶点坐标向量 |
|
r, g, b, a |
颜色向量 |
|
s, t, p, q |
纹理坐标向量 |
使用 . 运算符加分量名来获取向量的分量:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
// 顶点坐标 vec2 coord = vec2(1.0, 0.5); float x = coord.x; // 1.0 float y = coord.y; // 0.5 float z = coord.z; // Error! 不存在
// 颜色 vec4 color = vec4(0.6, 0.8, 1,0, 0.5); float r = color.r; // 0.6 float a = color.a; // 0.5 // 纹理坐标 vec4 texCoord = vec4(0.2, 0.4, 0.6, 0.8); float t = texCoord.t; // 0.4 float p = texCoord.p; // 0.6 GLSL |
重组(Swizzling)
另外,你还可以使用同一组分量名的任意组合来创建一个新的向量,这一行为称作重组:
1 2 3 4 5 6 7 |
vec4 coord = vec4(0.1, 0.2, 0.3, 0.4); vec2 one = coord.xx; // vec2(0.1, 0.1) vec2 two = coord.xy; // vec2(0.1, 0.2) vec3 three = coord.xzw; // vec3(0.1, 0.3, 0.4) vec4 four = coord.wzyx; // vec4(0.4, 0.3, 0.2, 0.1) vec4 boom = coord.xyzw + coord.wzyx; // vec4(0.5, 0.5, 0.5, 0.5) vec4 hello = vec4(coord.zyx, 0.0); // vec4(0.3, 0.2, 0.1, 0.0) GLSL |
矩阵(Matrix)
一种类似于表格的复合数据类型,矩阵最多能够支持 4 列 4 行的数据,且其元素只能够为 float 类型。
关键字
下面表格中的 n 和 m 皆为 2 到 4 的任意数字
关键字 |
含义 |
举例 |
matnxn / matn(别名) |
表示一个 n 列 n 行的浮点型矩阵 |
mat2、mat3、 mat3x3 |
matnxm |
表示一个 n 列 m 行的浮点型矩阵 |
mat2x3、mat4x3 |
创建矩阵
使用不同的构造函数来创建相应的矩阵:
1 2 3 |
// 创建一个 2x2 的矩阵 mat2 two = mat2(0.1, 0.2, // 第一列 0.3, 0.4); // 第二列 GLSL |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
https://chenpipi.cn/post/shader-quickstart-glsles-2/