我正在处理一些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
内容的唯一方法是bufferData
和bufferSubData
。出于性能原因,我想避免在数据中保留
ArrayBuffer
的副本(因为缓冲区将使用少量的内存)。有什么方法可以(有效地)调整
WebGlBuffer
实例的大小,或将较小的WebGlBuffer
的内容复制到较大的WebGlBuffer
吗?我是否缺少WebGL API的任何功能,还是必须返回以保留重复数据? 最佳答案
不,不幸的是,WebGL缺乏这种能力。如果要调整缓冲区的大小,将会丢失其内容,因此无法解决。您所能做的就是尝试事先分配足够的空间供将来使用。在我的项目中,我这样做,并且还保留缓冲区内容的副本,以防可能出现“内存不足”的情况(这也有助于批量更新缓冲区)。但是我的几何数据相对较小。
同样,WebGL2也有copyBufferSubData
调用。
关于javascript - 如何调整WebGlBuffer的大小?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37922828/