GLSL语法概览
【摘要】 GLSL的数据类型,大致可以分为基本数据类型、向量、矩阵、结构体和数组等五类。
1 数据类型
GLSL的数据类型,大致可以分为基本数据类型、向量、矩阵、结构体和数组等五类。
1.1 基本数据类型
GLSL的基本数据类型有五种,分别是浮点型、双精度浮点型、整型、无符号整型和布尔型。
类型 | 说明 |
---|---|
float | IEEE32位浮点数 |
double | IEEE64位浮点数 |
int | 有符号32整数 |
uint | 无符号32整数 |
bool | 布尔型:true, false |
1.2 向量
五种基本数据类型都可以生成二元、三元和四元向量。
基本类型 | 二元向量 | 三元向量 | 四元向量 |
---|---|---|---|
float | vec2 | vec3 | vec4 |
double | dvec2 | dvec3 | dvec4 |
int | ivec2 | ivec3 | ivec4 |
uint | uvec2 | uvec3 | uvec4 |
bool | bvec2 | bvec3 | bvec4 |
以下关于向量类型的变量声明都是合法的。
vec3 p1 = vec3(1.0, 2.0, 3.0);
vec4 p2 = vec4(p1, 4.0);
ivec3 n = ivec3(p1);
vec4 white = vec4(1.0);
vec3 rgb= vec3(white);
1.3 矩阵
矩阵类型只有由float和double生成,矩阵阶数限定在2,3,4阶。以下关于矩阵类型的变量声明都是合法的。
mat3 m1 = mat3(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0);
mat3 m2 = mat2(vec3(1.0, 2.0, 3.0), vec3(4.0, 5.0, 6.0), vec3(7.0, 8.0, 9.0));
mat4 m3 = mat4(9.0) // 主对角线元素为9.0,其他元素全为0.0
1.4 结构体
和C语言类似,GLSL的结构体可以将不同类型的数据组合在一起,成为一个新的类型,并隐式定义一个新类型的构造函数。
struct particle {
float lifetime;
vec3 positon;
vec3 velocity;
};
particle p = particle(3.0, vec3(1.0, 2.0, 3.0), vec3(4.0, 5.0, 6.0));
1.5 数组
GLSL支持任意类型的数组,包括结构体数组。数组的length()方法返回数据元素的个数。数组不支持负数索引。
float p[3] = float[](1.0, 2.0, 3.0);
int ids[] = float[3](1, 2, 3);
2 操作符和优先级
下表列出了GLSL支持的操作符,以及各自的优先级。
优先级 | 操作符 | 操作对象类型 | 备注 |
---|---|---|---|
1 | () | 无限制 | 可以嵌套 |
2 | [] | 数组、向量、矩阵 | 索引 |
2 | f() | 函数 | 函数调用 |
2 | . | 结构体 | 访问结构体的域变量或方法 |
2 | ++ – | 算术类型 | 后置递增/递减 |
3 | ++ – | 算术类型 | 前置递增/递减 |
3 | + - | 算术类型 | 一元操作符,正负号 |
3 | ~ | 整型 | 一元操作符,按位非 |
3 | ! | 布尔型 | 一元操作符,逻辑非 |
4 | * / % | 算术类型 | 乘/除/模 |
5 | + - | 算术类型 | 加/减 |
6 | << >> | 整型 | 位操作,左移/右移 |
7 | < > <= >= | 算术类型 | 关系比较操作 |
8 | == != | 无限制 | 相等操作 |
9 | & | 整型 | 按位与 |
10 | ^ | 整型 | 按位异或 |
11 | | | 整型 | 按位或 |
12 | && | 布尔型 | 逻辑与 |
13 | ^^ | 布尔型 | 逻辑异或 |
14 | || | 布尔型 | 逻辑或 |
15 | a?b:c | 布尔型?任意:任意 | 三元操作符,分支结构 |
16 | = | 无限制 | 赋值 |
16 | += -+ *= /= %= | 算术类型 | 算术赋值 |
16 | <<= >>= | 整型 | 位操作赋值 |
16 | &= ^= |= | 整型 | 位操作赋值 |
17 | , | 无限制 | 操作符序列 |
3 流控制
和大多数编程语言一样,GLSL也同样支持顺序结构、分支机构和循环结构,也支持break、continue、return等流控制语句。此外,GLSL还有一个专用的流控制语句discard,仅用于片元着色器中,意为丢弃当前片元。
3.1 循环结构
GLSL完全复制了C语言的循环结构,包括for循环、while循环和do…while循环。
// for循环
for (int i=0; i<100; i++) {
... ...
}
// while循环
while (n < 100) {
... ...
}
// do...while循环
do {
... ...
} while (n < 100)
3.2 分支结构
GLSL支持if…else结构和switch结构。
// if...else结构
if (condition) {
... ...
} else {
... ...
}
// switch结构
switch (int_value) {
case n1:
... ...
break;
case n1:
... ...
break;
default:
... ...
}
4 函数
GLSL支持自定义函数,函数声明的语法和C语言类似,只是形参的类型前面需要加上参数限制符。如果函数类型是void,则函数可以无返回值。另外,函数命名也不能以gl_作为前缀。下表是四种参数限制符的说明。
参数限制符 | 说明 |
---|---|
in | 将数据复制到函数中(默认) |
const in | 将只读数据复制到函数中 |
out | 从函数中获取数据 |
inout | 将数据复制到函数中,并返回函数中修改的数据 |
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)