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

时间:2019-01-26 00:26:42

标签: graphics webgl webgl2

我一直在阅读著名的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?

我仍然不清楚。请帮忙。

1 个答案:

答案 0 :(得分:1)

WebGL2添加到WebGL1 api中,因此WebGL2具有4个gl.bufferData版本,其中3个来自WebGL1,另外1个是新版本。

他们是

按尺寸设置

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

使用无类型的ArrayBuffer设置

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

设置为ArrayBufferView,例如Uint8ArrayFloat32Array和其他数组缓冲区视图类型。

void gl.bufferData(target,ArrayBufferView srcData,用法);

设置带有偏移量和长度的ArrayBufferView

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

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