GLSL语法概览

举报
天元浪子 发表于 2021/11/25 15:46:26 2021/11/25
【摘要】 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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。