我正在通过新图像一直更新场景的一些纹理。 问题是上传是同步的,texImage2D需要~100ms。即使在渲染下一帧期间未使用纹理或关闭渲染,也需要很长时间。
我想知道,有没有办法异步上传纹理数据?
附加条件:
我已经提到有旧的纹理可以保持活动状态,直到将新的一个上传到GPU。
答案 0 :(得分:4)
有没有办法异步上传纹理数据?
不,不在WebGL 1.0中。可能在WebGL 2.0中,但尚未出现。
你可能会尝试的事情。
缩小
你在上传什么?视频?你能把它缩小吗?
您尝试过不同的格式吗?
WebGL将图像存储的任何格式转换为您请求的格式。因此,例如,如果您加载.JPG,浏览器可能会生成RGB图像。如果你然后用gl.RGBA,gl.RGBA,gl.UNSIGNED_BYTE上传它,它必须在上传之前将图像转换为RGBA(更多时间)。
您是否将UNPACK_FLIP_Y设置为true?
如果是这样,WebGL必须在上传之前翻转图像。
您是否将UNPACK_COLORSPACE_CONVERSION_WEBGL设置为BROWSER_DEFAULT_WEBGL?
如果不是WebGL可能需要重新解压缩您的图像
您是否将UNPACK_PREMULTIPLY_ALPHA_WEBGL设置为false或true?
取决于浏览器如何正常存储它可能具有的图像 将图像转换为您要求的格式
图片必须解压缩
你确定你的时间是“上传”还是“解压缩”?如果您切换到上传相同尺寸的TypedArray会加快速度吗?
答案 1 :(得分:3)
解决方案是使用texSubImage2D并将图像上传一小部分到GPU。上传完成后,激活新纹理并删除旧纹理。