Graphics 关于webgl中glBufferData第二个参数的问题
我一直在阅读著名的webgl教程,学习如何使用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);
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
vsArrayBufferView
,请参见。现在它知道,如果你想在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);