我正在處理基於2D圖層的應用程序,並且想要使用WebGL進行合成。這些圖層可能會相對於彼此移動,並且每個圖層只有每個圖層的小(矩形)部分可能會發生變化。但是,該矩形部分的寬度和高度可能會發生不可預測的變化。 我想每層使用一個畫布(2D)和一個紋理,並且每個畫布在每個畫布上僅重繪被修改的圖層部分,然後只需將該小區域上載到GPU以將相應部分更新爲紋理,在GPU爲我合成之前。然而,我還沒有找到一種有效的方式將圖像的一部分上傳到紋理的一部分。看起來texSubImage2D()
可以更新紋理的一部分,但只拍攝完整的圖像/畫布,並且似乎無法指定要使用的圖像的矩形區域。WebGL:有沒有一種將圖像/畫布的一部分作爲紋理上傳的有效方法?
我已經想到了這樣做的幾種方法,但每次似乎有明顯的開銷:
- 使用
getImageData()
+texSubImage2D()
只上傳到GPU改變的部分(開銷將畫布像素數據的ImageData) - 重新上傳整個層畫布
texImage2D()
- 每一幀或創建/調整小canvas2D到正確的尺寸,以伏貼每層修改,然後使用
texSubImage2D()
將其發送到更新相關紋理(記憶r節約開銷)
那麼,有沒有辦法指定圖像的一部分/畫布的紋理?類似於texImagePart2D()
和texSubImagePart2D
,它們都會接受另外四個參數,sourceX
,sourceY
,sourceWidth
和sourceHeight
以指定要使用的圖像/畫布的矩形區域?
至少在大多數嵌入式GPU中,TexSubImage2D API將會變慢。使用TexImage2D本身可能會更好。 – prabindh
因此,即使只修改了整個紋理的一部分,也沒有比重新上傳整個紋理更快的方法嗎?但我不明白,爲什麼它會變慢,如果它只上傳一個小矩形而不是整個紋理?是否因爲修改現有的紋理很慢? – Jor