三种着色器,一个三角形
这一页把 @compute、@vertex、@fragment 串在同一个三角形上:
画三角形只需顶点与片段两种着色器。本页额外加入计算着色器,先生成坐标,再交给绘制。每一步都是真实调用。
① 分工速查
@vertex | @fragment | @compute | |
|---|---|---|---|
| 在哪条管线上 | 渲染管线,第 1 段 | 渲染管线,第 2 段 | 独立计算管线,可为渲染准备数据 |
| 谁决定跑几次 | draw(3) → 3 次 |
由光栅化等决定,覆盖数量不等于精确调用次数 | 本例 1 个工作组 × 每组 3 个调用 |
| 本例使用的输入 | @builtin(vertex_index) |
fs_pos 读取 @builtin(position) 帧缓冲位置 |
@builtin(global_invocation_id) |
| 返回什么 | @builtin(position):裁剪空间坐标 |
@location(0):一个颜色 |
没有返回值 |
| 怎么输出 | 本例通过返回值向后续阶段输出 | 只能写内存(storage buffer / 纹理) | |
| 能不能写 storage | 不能,绑定只允许 uniform 或 read-only-storage |
能(本例未用) | 能,var<storage, read_write> |
| 必须带的属性 | — | — | @workgroup_size(...),少了编译不过 |
表格总结本例用法。顶点阶段不能写 storage buffer,但可以修改局部变量;计算入口没有返回值,仍可用 return; 提前结束。
② 跑一遍:计算算顶点 → 顶点读 → 片段上色
JavaScript 将同一个 buffer 绑定给两条管线,先提交计算,再提交绘制。读回 CPU 只是为了显示数字,绘制仍直接读取 GPU 上的原数据。试把 scale 调到 0.50:顶部坐标应为 (0, 0.25)。
先点「下一步」。第 ② 步之后可以拖 scale,看顶点被重新算出来。
画布还没画东西。
计算着色器写进内存的 24 个字节
(array<vec2f, 3>,从 GPU 拷回后原样打印)