WGSL中代码文本结构规范主要由以下几种组成:编码格式、注释、空格与换行、数字标记、关键字、标识符、属性、指令、声明和作用域。
由于 WGLS 还处于草案阶段,所以本文所说的规范仅仅适用于当下,不排除未来有发生变化。
规范1:推荐使用 UTF-8 作为 WGSL 的代码文本编码格式
如同 JS 或 HTML,UTF-8 是作为代码编码格式的首选。
当然并不是说不可以使用其他编码格式,只是官方推荐选择使用 UTF-8。
规范2:一些可以接受的空格与换行符
在 WGSL 代码文本中,以下内容都会被视作为符合规范的 空格或换行:
-
空格
-
水平制表符,也就是按 Tab 键
-
垂直制表符
-
换行
-
回车
-
下一行
-
换页
-
行分隔符
-
段落分隔符
-
从左到右的标记
-
从右到左的标记
规范3:注释方式和 JS 完全相同
在 WGSL 中的添加注释方式和在 JS 中添加注释的方式完全相同。
- 行尾注释:在单行代码后面添加
//xxxx
形式的注释 - 块级注释:使用
/* xxx */
这种形式
规范4:数字(数值)的一些特殊标记
在 WGSL 中数值的一些特殊标记含义和用法与 JS 是相同的,例如:
-
使用
0x
开头可以表示这是一个 十六进制数字在有些语言中,若以
0
开头的数字则表示为 八进制数字,但是在 WGSL 中并没有这个规范 -
使用
e
来表示科学计数法(十进制数字的指数)
WGSL 吸纳了 C 语言中的一些特殊数字标记符号。
在一些数字的后面,可以添加使用以下特殊标记符号:
-
u:是单词 unsigned 的简写,表明这是一个无符号的整数
-
i:是单词 int 的简写,表明这是一个有符号的整数
-
f:是单词 float 的简写,表明这是一个 浮点数
-
h:是单词 hex 的简写,表明这是一个 十六进制数
-
l(L):是单词 long int 的简写,表明这是一个 长整型
-
p:表明这是一个 十六进制数的指数
e 是 十进制数的指数
数字的特殊符号还可以结合使用。
如果你在 WGSL 代码中看到这样一个数值 0x1p0f
,不要惊讶,慢慢会习惯的。
强调一下:WGSL 中是不存在隐式转换的
例如数字 1 表示为一个整数,而数字 1.0 则表示为一个浮点数,因此 1 和 1.0 是不相同的两种数值。
规范5:规定的一些关键字
在 WGSL 中的关键字大致可以分为以下 3 种:
- 表明某种类型的关键字,例如 f16、mat2x3、vec2、vec3 等
- 一些语法对应的关键字,例如 let、if、for、flase、return 等
- 一些保留的关键字,例如 Buffer、Self、as、new、void、yield 等
规范6:标识符、属性、指令
这 3 项本文不做讲解,因为这一块是我们比较靠后时候才需要学习的。
规范7:声明和作用域
声明在 WGSL 中非常重要,主要用来表明:
- 某些变量的类型
- 声明定义函数
- 明确某些函数的返回值类型
如果你会 TypeScript 或 Rust,那么对于这种类型声明会比较容易接受
至于声明的变量对应的作用域,这点和 JS 没有什么区别。
规范8:特殊关键词 @stage
在 WGSL 代码的开头第一行,可以添加:
@stage(vertex)
:表明接下来的代码是应用于 顶点阶段@stage(fragment)
:表明接下来的代码是应用于 片元阶段
总结:
实际上本文上面讲解的规范中,只有 数字结尾特殊标记 稍微难以理解(主要是不习惯),其他方面和 JS 或 TypeScript 没有太大的差别。
关于 WGSL 代码文本的一些结构规范就先学习到这里。
下一节,我们将过一遍 WGSL 中存在的各种类型。