【发布时间】:2020-11-07 21:55:49
【问题描述】:
我试图弄清楚缓冲区在 WebGL 中的工作原理,但我有点卡在这里。以下是我的猜测 - 请确认或否认。
const positions = new Float32Array([
-1, 1,
-0.5, 0,
-0.25, 0.25,
]);
let buffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
gl.bufferData(gl.ARRAY_BUFFER, positions, gl.STATIC_DRAW);
gl.bindBuffer(gl.ARRAY_BUFFER, null);
- 我们通过 JS 在 RAM 上创建一个浮点数组。
- WebGL 直接在 GPU 上创建一个空缓冲区,并将此缓冲区上的引用返回给 JS。现在变量
buffer是一个指针。 - 将缓冲区上的指针设置为
gl.ARRAY_BUFFER。 - 现在我们将数据从 RAM 复制到 GPU 缓冲区。
- 从
gl.ARRAY_BUFFER取消绑定缓冲区(但缓冲区在 GPU 上仍然可用,我们可以重新绑定更多次)。
那么为什么我们不能只用positions 调用createBuffer() 而不是使用ARRAY_BUFFER 作为JS 和GPU 之间的桥梁呢?这些仅仅是 OpenGL API 的限制,还是我们有充分的理由不这样做?如果我错了,请纠正我,但是在我们调用bufferData 之后,分配已知大小的内存比使用positions 大小分配一些内存和重新分配要快。
【问题讨论】:
标签: javascript webgl