目前,使用上传大型 4096x4096 纹理texImage2d
非常慢,在将纹理发送到 GPU 时锁定主线程并最终导致卡顿。
根据我的阅读,WebGL2 能够使用 PBO(像素缓冲区对象)以更有效的方式在 GPU 上创建纹理。但是,我无法在网上找到任何有关如何执行此操作的示例。
我找到了关于如何在OpenGL中实现这一点的很好的描述,但我不确定如何继续使用 WebGL API。
我想使用 aCanvas
或 anImageBitmap
作为纹理数据的来源。
到目前为止,我正在通过将纹理绘制到画布上进行测试,然后将图像转换为arrayBuffer
usingcanvas.toBlob()
后跟FileReader
and readAsArrayBuffer
。然后,一旦我实际上有一个有效的缓冲区,我就会尝试创建 PBO 并上传它。
我的代码的相关部分如下所示:
var buf = gl.createBuffer();
var view = new Uint8Array(ArrayBuffer);
gl.bindBuffer(gl.PIXEL_UNPACK_BUFFER, buf);
gl.bufferData(gl.PIXEL_UNPACK_BUFFER, view, gl.STATIC_DRAW);
gl.texImage2D(gl.TEXTURE_2D, 0, this.format, this.width, this.height, 0, this.format, this.type, 0);
但这会返回错误:
GL_INVALID_OPERATION : glTexImage2D: pixel unpack buffer is not large enough
我真的不知道我是否正确地接近它,所以任何帮助将不胜感激。