Uniform buffer 是 CPU 對 GPU 講話的方式。這一節我們會把當前時間送進著色器,讓畫面動起來。
寫一個著色器,就是寫兩個函式:頂點函式(@vertex)決定形狀,片段函式(@fragment)決定顏色。但如果你只能寫死的形狀和顏色,畫面就不會動。
Uniform buffer 是 CPU 與 GPU 之間的小信箱。每一幀,你在 CPU 把資料(例如:當前時間、滑鼠位置、視窗大小)寫進這個信箱,著色器就能讀到。
建立一個 16 bytes 的 buffer(一個 vec4 = 4 個 float),並把它綁定到 group 0 / binding 0:
const uniformBuf = device.createBuffer({
size: 16, // time(4) + _pad(4) + res.xy(8)
usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,
});
const bindGroup = device.createBindGroup({
layout: pipeline.getBindGroupLayout(0),
entries: [{ binding: 0, resource: { buffer: uniformBuf } }],
});
// every frame:
const t = (performance.now() - startMs) / 1000;
device.queue.writeBuffer(uniformBuf, 0, new Float32Array([
t, 0, canvas.width, canvas.height,
]));