WebGL:异步 texImage2D?
WebGL: Asynchronous texImage2D?
我一直在通过新图像更新场景的一些纹理。
问题是上传是同步的,texImage2D 需要大约 100 毫秒。即使在下一帧的渲染过程中不使用纹理或关闭渲染,也需要很长时间。
请问有什么方法可以异步上传贴图数据吗?
附加条件:
我曾提到有旧纹理可以保持活动状态,直到新纹理上传到 GPU 完成。
is there any way to upload texture data asynchronously?
不,不在 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?
取决于浏览器通常如何存储它可能拥有的图像
将图像转换为您请求的格式
图片需要解压
你确定你的时间在 "uploading" 和 "decompressing" 之间吗?如果您切换到上传相同尺寸的 TypedArray,它会加速吗?
解决方案是使用 texSubImage2D 并将图像一小部分上传到 GPU。上传完成后激活您的新纹理并删除旧纹理。
我一直在通过新图像更新场景的一些纹理。 问题是上传是同步的,texImage2D 需要大约 100 毫秒。即使在下一帧的渲染过程中不使用纹理或关闭渲染,也需要很长时间。
请问有什么方法可以异步上传贴图数据吗?
附加条件:
我曾提到有旧纹理可以保持活动状态,直到新纹理上传到 GPU 完成。
is there any way to upload texture data asynchronously?
不,不在 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?
取决于浏览器通常如何存储它可能拥有的图像 将图像转换为您请求的格式
图片需要解压
你确定你的时间在 "uploading" 和 "decompressing" 之间吗?如果您切换到上传相同尺寸的 TypedArray,它会加速吗?
解决方案是使用 texSubImage2D 并将图像一小部分上传到 GPU。上传完成后激活您的新纹理并删除旧纹理。