Skip to content

Latest commit

 

History

History
184 lines (79 loc) · 3.93 KB

03 WGSL基础之文本(代码)结构规范.md

File metadata and controls

184 lines (79 loc) · 3.93 KB

03 WGSL基础之文本(代码)结构规范

WGSL中代码文本结构规范主要由以下几种组成:编码格式、注释、空格与换行、数字标记、关键字、标识符、属性、指令、声明和作用域。


由于 WGLS 还处于草案阶段,所以本文所说的规范仅仅适用于当下,不排除未来有发生变化。


规范1:推荐使用 UTF-8 作为 WGSL 的代码文本编码格式

如同 JS 或 HTML,UTF-8 是作为代码编码格式的首选。

当然并不是说不可以使用其他编码格式,只是官方推荐选择使用 UTF-8。


规范2:一些可以接受的空格与换行符

在 WGSL 代码文本中,以下内容都会被视作为符合规范的 空格或换行:

  1. 空格

  2. 水平制表符,也就是按 Tab 键

  3. 垂直制表符

  4. 换行

  5. 回车

  6. 下一行

  7. 换页

  8. 行分隔符

  9. 段落分隔符

  10. 从左到右的标记

  11. 从右到左的标记


规范3:注释方式和 JS 完全相同

在 WGSL 中的添加注释方式和在 JS 中添加注释的方式完全相同。

  1. 行尾注释:在单行代码后面添加 //xxxx 形式的注释
  2. 块级注释:使用 /* xxx */ 这种形式

规范4:数字(数值)的一些特殊标记

在 WGSL 中数值的一些特殊标记含义和用法与 JS 是相同的,例如:

  1. 使用 0x 开头可以表示这是一个 十六进制数字

    在有些语言中,若以 0 开头的数字则表示为 八进制数字,但是在 WGSL 中并没有这个规范

  2. 使用 e 来表示科学计数法(十进制数字的指数)


WGSL 吸纳了 C 语言中的一些特殊数字标记符号。

在一些数字的后面,可以添加使用以下特殊标记符号:

  1. u:是单词 unsigned 的简写,表明这是一个无符号的整数

  2. i:是单词 int 的简写,表明这是一个有符号的整数

  3. f:是单词 float 的简写,表明这是一个 浮点数

  4. h:是单词 hex 的简写,表明这是一个 十六进制数

  5. l(L):是单词 long int 的简写,表明这是一个 长整型

  6. p:表明这是一个 十六进制数的指数

    e 是 十进制数的指数


数字的特殊符号还可以结合使用。

如果你在 WGSL 代码中看到这样一个数值 0x1p0f,不要惊讶,慢慢会习惯的。


强调一下:WGSL 中是不存在隐式转换的

例如数字 1 表示为一个整数,而数字 1.0 则表示为一个浮点数,因此 1 和 1.0 是不相同的两种数值。


规范5:规定的一些关键字

在 WGSL 中的关键字大致可以分为以下 3 种:

  1. 表明某种类型的关键字,例如 f16、mat2x3、vec2、vec3 等
  2. 一些语法对应的关键字,例如 let、if、for、flase、return 等
  3. 一些保留的关键字,例如 Buffer、Self、as、new、void、yield 等

规范6:标识符、属性、指令

这 3 项本文不做讲解,因为这一块是我们比较靠后时候才需要学习的。


规范7:声明和作用域

声明在 WGSL 中非常重要,主要用来表明:

  1. 某些变量的类型
  2. 声明定义函数
  3. 明确某些函数的返回值类型

如果你会 TypeScript 或 Rust,那么对于这种类型声明会比较容易接受


至于声明的变量对应的作用域,这点和 JS 没有什么区别。


规范8:特殊关键词 @stage

在 WGSL 代码的开头第一行,可以添加:

  1. @stage(vertex):表明接下来的代码是应用于 顶点阶段
  2. @stage(fragment):表明接下来的代码是应用于 片元阶段

总结:

实际上本文上面讲解的规范中,只有 数字结尾特殊标记 稍微难以理解(主要是不习惯),其他方面和 JS 或 TypeScript 没有太大的差别。


关于 WGSL 代码文本的一些结构规范就先学习到这里。

下一节,我们将过一遍 WGSL 中存在的各种类型。