我正在处理一些WebGL代码,其中一部分正在处理WebGlBuffer实例以保存顶点属性。

我不知道(先验)缓冲区必须容纳的数据量,因此WebGlBuffer会随着向场景中添加更多三角形而增长,例如:

/// Init the WebGlBuffer
var buff = gl.createBuffer();

gl.bindBuffer(gl.ARRAY_BUFFER, buff);
gl.bufferData(gl.ARRAY_BUFFER, 1024, this._gl.DYNAMIC_DRAW);

/// Push data for some triangles
gl.bufferSubData(gl.ARRAY_BUFFER,   0, new Float32Array( dataForVertex0 ));
gl.bufferSubData(gl.ARRAY_BUFFER, 128, new Float32Array( dataForVertex1 ));
gl.bufferSubData(gl.ARRAY_BUFFER, 256, new Float32Array( dataForVertex2 ));


/// A few seconds later, room for more triangles is needed

gl.bindBuffer(gl.ARRAY_BUFFER, buff);
gl.bufferData(gl.ARRAY_BUFFER, 2048, this._gl.DYNAMIC_DRAW);

/// ... so I can keep adding data for more triangles
gl.bufferSubData(gl.ARRAY_BUFFER, 1024, new Float32Array( dataForVertex0 ));
gl.bufferSubData(gl.ARRAY_BUFFER, 1152, new Float32Array( dataForVertex1 ));
gl.bufferSubData(gl.ARRAY_BUFFER, 1280, new Float32Array( dataForVertex2 ));


我的问题是,每次对gl.bufferData()的调用都将用零覆盖WebGlBuffer的当前内容。 bufferSubData不会自动调整缓冲区大小,而是触发缓冲区溢出警告。

据我所知,操纵WebGlBuffer内容的唯一方法是bufferDatabufferSubData

出于性能原因,我想避免在数据中保留ArrayBuffer的副本(因为缓冲区将使用少量的内存)。

有什么方法可以(有效地)调整WebGlBuffer实例的大小,或将较小的WebGlBuffer的内容复制到较大的WebGlBuffer吗?我是否缺少WebGL API的任何功能,还是必须返回以保留重复数据?

最佳答案

不,不幸的是,WebGL缺乏这种能力。如果要调整缓冲区的大小,将会丢失其内容,因此无法解决。您所能做的就是尝试事先分配足够的空间供将来使用。在我的项目中,我这样做,并且还保留缓冲区内容的副本,以防可能出现“内存不足”的情况(这也有助于批量更新缓冲区)。但是我的几何数据相对较小。

同样,WebGL2也有copyBufferSubData调用。

关于javascript - 如何调整WebGlBuffer的大小?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37922828/

10-10 01:17