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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于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,还有一个新版本。

他们是

set by size

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

set with untyped ArrayBuffer

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

set with an ArrayBufferView like Uint8Array, Float32Array and the other array buffer view types.

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

set with an ArrayBufferView with an offset and length

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

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

以上是关于关于webgl中glBufferData的第二个参数的问题的主要内容,如果未能解决你的问题,请参考以下文章

TP关于create方法的第二个参数

MongoDB各种查询操作详解

关于promise中reject和catch的问题

WebGL递归处理和移动?旋转?缩放

如何在Ajax的第二个请求中修复数据库中插入的0值?

使用 laravel 在数据库中不保存多个下拉值的第二个下拉值