我正在开发一个基于层的2D应用程序,希望使用WebGL进行合成。这些层可能相对于彼此移动,每一帧只有每个层的一个小矩形部分可能会发生改变。但是,该矩形部分的宽度和高度可能不可预测。
我想为每个图层使用一个画布(2D)和一个纹理,并且在每个画布上仅重绘已修改的图层部分,然后简单地将该小区域上传到GPU以更新相应的纹理,之后GPU会为我进行合成。然而,我没有找到有效的方法来将图像的部分上传到纹理的部分。似乎
我想了几种方法来解决这个问题,但每种方法都有明显的额外开销:
我想为每个图层使用一个画布(2D)和一个纹理,并且在每个画布上仅重绘已修改的图层部分,然后简单地将该小区域上传到GPU以更新相应的纹理,之后GPU会为我进行合成。然而,我没有找到有效的方法来将图像的部分上传到纹理的部分。似乎
texSubImage2D()
可以更新纹理的一部分,但只能采用完整的图像/画布,并且似乎无法指定要使用的图像的矩形区域。我想了几种方法来解决这个问题,但每种方法都有明显的额外开销:
- 使用
getImageData()
+texSubImage2D()
仅将更改的部分上传到GPU(在将画布像素数据转换为ImageData时存在开销) - 每帧重新上传整个图层画布
texImage2D()
- 或者创建/调整大小的小canvas2D,以适应每个图层修改的正确尺寸,然后使用
texSubImage2D()
将其发送以更新相关的纹理(存在内存预留开销)
texImagePart2D()
和texSubImagePart2D()
,它们都会接受四个更多参数:sourceX
,sourceY
,sourceWidth
和sourceHeight
,以指定要使用的矩形区域?