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

Graphics 关于webgl中glBufferData第二个参数的问题,graphics,webgl,webgl2,Graphics,Webgl,Webgl2,我一直在阅读著名的webgl教程,学习如何使用bufferData将数据放入缓冲区。本教程以如下形式广泛使用bufferData gl.bufferData(gl.ARRAY\u BUFFER,新Float32Array(顶点),gl.STATIC\u DRAW); 这里的第二个参数是要发送到GPU缓冲区的实际数组或数据。然而,我今天遇到了API的这种新用法 gl.bufferData(gl.ARRAY\u BUFFER,8*maxNumVertices,gl.STATIC\u DRAW);

我一直在阅读著名的webgl教程,学习如何使用
bufferData
将数据放入缓冲区。本教程以如下形式广泛使用
bufferData

gl.bufferData(gl.ARRAY\u BUFFER,新Float32Array(顶点),gl.STATIC\u DRAW);

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

gl.bufferData(gl.ARRAY\u BUFFER,8*maxNumVertices,gl.STATIC\u DRAW);

这里第二个参数表示缓冲区的大小

所以我被这个弄糊涂了。我在MDN上查找了这个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,还有一个新版本

是的

按大小设置 使用非类型化的
ArrayBuffer设置
使用
ArrayBufferView
设置,如
Uint8Array
Float32Array
和其他数组缓冲区视图类型。 void gl.bufferData(目标、ArrayBufferView srcData、用法)

使用带有偏移量和长度的
ArrayBufferView
设置
最后一个是为WebAssembly添加的。问题是,如果您有大的
ArrayBufferView
并且只想上载一部分,那么您必须在覆盖要上载部分的同一缓冲区上创建一个新的
ArrayBufferView
。尽管同一
ArrayBuffer
上的
ArrayBuffer视图相对便宜,但仍有一个视图分配,最终将不得不进行垃圾收集。添加新版本的
gl.bufferData
将消除该问题。您不必创建一个临时的
ArrayBufferView
,只需上传
ArrayBuffer的一部分即可。谢谢您的回复。我不完全理解第二个版本和第三个版本。
ArrayBufferView
ArrayBuffer
之间有什么区别。它们都是包含真实数据的数组吗?另外,如果我将数字作为大小传递给
bufferData
API,它如何知道我是指大小,而不是任何其他可接受的参数,例如
ArrayBufferView
ArrayBuffer
?对于
ArrayBuffer
vs
ArrayBufferView
,请参见。现在它知道,如果你想在JS中编写一个类似的函数,你可以做
函数doSomething(dataOrSize){if(typeof dataOrSize=='number'){//用作大小}或者if(dataOrSize instanceof ArrayBuffer){//用作ArrayBuffer}或者{//用作ArrayBufferView}
void gl.bufferData(target, size, usage); 
void gl.bufferData(target, ArrayBuffer? srcData, usage); 
// WebGL2: 
void gl.bufferData(target, ArrayBufferView srcData, usage, srcOffset, length);