Visual LabINTERACTIVE LEARNING
阶段 2 · 数据流基础18 分钟

Uniform Buffer:小而频繁的全局参数

绑定、对齐与 queue.writeBuffer

用 uniform 传递时间、颜色和缩放,逐帧更新同一个缓冲区而不重建资源。

LEARNING GOALS

先明确本课目标

1

创建 UNIFORM|COPY_DST 缓冲区

2

理解 16 字节对齐

3

使用 queue.writeBuffer 更新参数

MENTAL MODEL · 再建立心智模型

Uniform 像一小块每次绘制都能读取的参数表;JavaScript 更新字节,着色器按结构体布局读取。

MINIMAL EXAMPLE

为什么 JavaScript 写了数据,WGSL 却可能读错?

Uniform Buffer 是着色器只读的参数块。CPU 字节布局必须与 WGSL 类型的大小和对齐一致;vec4f 通常按 16 字节对齐,不能只按可见字段数量紧密拼接。

最小例子wgsl
struct Params {
  time: f32,
  scale: f32,
  padding: vec2f,
  color: vec4f,
}

@group(0) @binding(0)
var<uniform> params: Params;
  1. 前 16 字节 time、scale 和 padding 共同占满一个 16 字节区间。
  2. 后 16 字节 color 是 vec4f,占用并对齐到 16 字节。
  3. CPU 也写 32 字节 Float32Array 的排列必须与结构体布局完全一致。

用 32 字节 Uniform Buffer 写入参数后,着色器能稳定读取时间、缩放和颜色。

本课概念
OPTIONAL · 按需查阅完整术语表与概念边界

遇到陌生术语时再展开,不打断主线实验。

展开⌄
LIVE EXPERIMENT · 先获得反馈

边改边运行

浏览器加载后会激活代码编辑器、独立运行环境与实时输出。

本课挑战

把分辨率、鼠标、时间组合进一个统一的 FrameUniforms 结构体。

DEEP DIVE · 实验之后

回到原理,解释刚才发生了什么

先用结果建立反馈,再按运行流程、核心原理和知识关系逐层深入。

CORE IDEA

核心讲解

01

布局必须一致

WGSL uniform 地址空间遵循对齐规则,vec3f 虽然只有三个分量,结构布局常仍按 16 字节边界处理。最稳妥的学习方式是显式留出 padding。

02

更新而不是重建

动画参数应写入已有缓冲区。频繁创建 GPUBuffer 会增加验证、分配和垃圾回收压力。

OPTIONAL · 迁移时查阅WebGPU 与 WebGL2 对照

主线实验完成后,再用完整映射处理跨平台或跨 API 迁移。

展开⌄
API COMPARISON

两者都有 UBO;WebGPU 把资源绑定和布局验证从可变状态提升为显式契约。

WebGL

可用单独 uniform,也可通过 Uniform Block、binding point 与 bindBufferBase/Range 使用 UBO。

WebGPU

Uniform GPUBuffer 通过 BindGroupLayout/BindGroup 与 WGSL binding 对接。

两者布局规则不完全相同;迁移结构体时必须重新核对对齐与 padding。