关于 webgl 中 glBufferData 的第二个参数的问题



我一直在阅读著名的webgl教程 https://webgl2fundamentals.org/webgl 并学习如何使用bufferData将数据放入缓冲区。本教程以这样的形式广泛使用bufferData

gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);

这里的第二个参数是我们想要发送到 GPU 上的缓冲区的实际数组或数据。但是,我今天遇到了 API 的这种新用法。

gl.bufferData(gl.ARRAY_BUFFER, 8*maxNumVertices, gl.STATIC_DRAW);

此处的第二个参数指示缓冲区的大小。

所以我对此感到困惑。我在 MDN https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/bufferData 上查找了这个 API,它说

// WebGL1: 
void gl.bufferData(target, size, usage); 
void gl.bufferData(target, ArrayBuffer? srcData, usage); 
void gl.bufferData(target, ArrayBufferView srcData, usage); 
// WebGL2: 
void gl.bufferData(target, ArrayBufferView srcData, usage, srcOffset, length);

这是否意味着对于 webgl1.0,我们可以将实际的数据数组或缓冲区的大小作为第二个参数传递给 API。但是对于WebGL2.0,我们只能将实际的数据数组传递给API?

我仍然不清楚这一点。请帮忙。

WebGL2 添加到 WebGL1 API 中,因此 WebGL2 有 4 个版本的gl.bufferData,其中 3 个来自 WebGL1 和一个新的。

他们是

按大小设置

void gl.bufferData(target, size, usage); 

使用非类型化ArrayBuffer设置

void gl.bufferData(target, ArrayBuffer? srcData, usage); 

使用Uint8ArrayFloat32Array和其他数组缓冲区视图类型等ArrayBufferView进行设置。

void gl.bufferData(target, ArrayBufferView srcData, usage);

设置有偏移和长度的ArrayBufferView

// WebGL2: 
void gl.bufferData(target, ArrayBufferView srcData, usage, srcOffset, length);

最后一个可以说是为WebAssembly添加的。问题是,如果您有较大的ArrayBufferView并且只想上传一部分,则必须在覆盖要上传的部分的同一缓冲区上创建新ArrayBufferView。即使同一ArrayBuffer上的ArrayBufferView相对便宜,但视图仍然有一个分配,最终将不得不进行垃圾回收。添加新版本的 gl.bufferData 可消除该问题。您不必仅仅为了上传ArrayBuffer的一部分而创建临时ArrayBufferView

相关内容

  • 没有找到相关文章

最新更新