【发布时间】:2017-09-17 17:03:46
【问题描述】:
目前,使用texImage2d 上传大型 4096x4096 纹理非常慢,在将纹理发送到 GPU 时锁定主线程并最终导致卡顿。
据我了解,WebGL2 能够使用 PBO(像素缓冲区对象)以更有效的方式在 GPU 上创建纹理。但是,我无法在网上找到任何有关如何执行此操作的示例。
我在OpenGL 中找到了有关如何实现此目的的很好描述,但我不确定如何继续使用 WebGL API。
我想使用Canvas 或ImageBitmap 作为纹理数据的来源。
到目前为止,我正在通过将纹理绘制到画布上进行测试,然后使用canvas.toBlob() 后跟FileReader 和readAsArrayBuffer 将图像转换为arrayBuffer。然后,一旦我实际上有一个有效的缓冲区,我就会尝试创建 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
我真的不知道我是否正确地接近它,所以任何帮助将不胜感激。
【问题讨论】:
标签: webgl2