前言
在上一篇文章中我们初步了解了 GLSL ES 的基本语法,那么本篇文章就和大家一起学习 GLSL ES 的数据类型。
Let’s go!!!
在本系列文章中主要针对 GLSL ES 3.0 进行讲解
正文
数据类型
标量(Scalar)
标量表示只有大小没有方向的量。
关键字
关键字 | 含义 |
---|---|
int | 有符号整型(Signed Integer) |
uint | 无符号整型(Unsigned Integer) |
float | 单精度浮点型(Single Floating-Point) |
bool | 布尔型(Boolean) |
声明并赋值:
int age = 18; // 整型
uint hello = 3u; // 无符号整型,在后面数字加 u
float pi = 3.14; // 浮点型
bool isMe = true; // 布尔型
类型转换
标量类型之间可以互相转换。
-
将
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
。
我们可以使用标量类型的构造函数来进行类型转换:
int a = 1;
float b = float(a); // 1.0
int c = int(b); // 1
uint d = uint(c); // 1u
bool e = bool(d); // true
当尝试将非标量值转换为标量值时,实际处理的将会是非标量值的第一个元素:
vec3 a = vec3(0.1, 0.2, 0.3);
float b = float(a); // 0.1
向量(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 |
创建向量
我们可以使用不同的构造函数来创建相应的向量:
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 类型分量的向量
只传入一个参数的情况下会自动将其他值也设为第一个参数:
vec3 three = vec3(0.1); // 等同于 vec3(0.1, 0.1, 0.1)
也可以使用一个向量作为参数传给另一个向量构造函数:
vec2 two = vec2(0.1, 0.2);
vec3 three = vec3(two, 0.3); // vec3(0.1, 0.2, 0.3)
而将“大”向量作为参数来创建“小”向量(降维)会自动抛弃多余的值:
vec4 four = vec4(0.1, 0.2, 0.3, 0.4);
vec3 three = vec3(four); // 等同于 vec3(0.1, 0.2, 0.3),抛弃了 0.4
获取分量
通过分量名来获取向量中的第 1 到第 4 个分量,包括:
实际上所有向量都可以使用
rgba
、rgba
和stpq
分量名,但是为了代码的严谨性和可读性,建议使用相应的分量名
分量名(对应第 1 - 4 个分量) | 使用场景 |
---|---|
x, y, z, w | 顶点坐标向量 |
r, g, b, a | 颜色向量 |
s, t, p, q | 纹理坐标向量 |
使用 .
运算符加分量名来获取向量的分量: