為什麼要強調Texture2DArray在地形上的應用?

看一些資料提到地形系統會採用Texture2DArray來提高效率,但沒有說邊界部分需要Blend的情況下應該怎麼處理。

如果邊界上需要多次Sampling然後手動在shader里lerp的話,效率上會和直接用Texture3D有區別嗎?還是說跟API或是硬體有關?

之前表述有點不太清楚,明確一下問題有2個。

  1. 為什麼要強調Texture2DArray可以用於地形,除了減少Bind以外有什麼優勢?既然每個Slice都要Sampling的話,性能上應該沒有明顯區別才對?
  2. 假設如一些資料所說Texture2DArray對比多個Texture有性能優勢的話,那麼是不是更極端點直接用Texture3D?Trilinear filtering甚至可以代替Shader里Blend的過程吧?但是實際沒有見過這種做法不知道是不是有什麼沒有考慮到的地方。

(自己沒想清楚一個問題里夾雜了2個疑問非常抱歉,但因為有前後關係也不好拆分)

----------------------------------------------------------------------------------------

Difference between texture arrays and multiple single textures?

退一步講... 為什麼有Texture3D了還要有Texture2DArray呢?(3D也不一定要Trilinear吧?)

Performance advantage of using a TextureArray over an array of Textures?
看這裡的說法主要就是便於綁定,所以DX12出了Bindless就沒用了...
但是這樣還是不能解釋為什麼地形系統傾向於用TextureArray。
地形的貼圖spec一直這些可以理解,但邊界上的Blending應該怎麼都免不了吧?而且不先計算lod的話dynamic branch也不可行的樣子。

資料:

?Witcher裡面提到使用了TextureArray http://twvideo01.ubm-us.net/o1/vault/GDC2014/Presentations/Gollent_Marcin_Landscape_Creation_and.pdf

?Introduction To Textures in Direct3D 11

?Unity - Scripting API: Texture2DArray


  1. 為什麼要強調Texture2DArray可以用於地形,除了減少Bind以外有什麼優勢?既然每個Slice都要Sampling的話,性能上應該沒有明顯區別才對?

主要是為了減少 Bind,因為老 API 對 texture slot 個數有限制。

2. 假設如一些資料所說Texture2DArray對比多個Texture有性能優勢的話,那麼是不是更極端點直接用Texture3D?Trilinear filtering甚至可以代替Shader里Blend的過程吧?但是實際沒有見過這種做法不知道是不是有什麼沒有考慮到的地方。

Texture3D 只能對相鄰的兩個 slice 進行插值。

地形貼圖不止用兩張貼圖喲,可能 n 張貼圖同時 blend。


1. 為什麼要強調Texture2DArray可以用於地形,除了減少Bind以外有什麼優勢?

減少bind優勢很大啊。即能減少drawcall,有能減少流水線暫停。即便只有這個優勢,也是一個非常非常巨大的優勢了。

2. 既然每個Slice都要Sampling的話,性能上應該沒有明顯區別才對?

沒有每個slice都要sample,這一點你理解錯了。

3. 退一步講... 為什麼有Texture3D了還要有Texture2DArray呢?

一個mipmap過的Texture3D,在depth方向也是逐層遞減的。而mipmap過的Texture2DArray,只有x和y方向是逐層遞減。Array長度不減。顯然對於地形來說,你要的是後者。

4. 看這裡的說法主要就是便於綁定,所以DX12出了Bindless就沒用了...

是的,有了bindless之後就不需要那些勞什子了。但你要考慮歷史的進程啊。Texture2DArray畢竟是D3D10就有,硬體支持率幾乎100%。


主要可以解決:

1. 減少Binding次數。

2. 在沒有Texture Array之前一般都使用多紋理混合。如果地形只使用部分紋理層,要麼採樣全部紋理後用0權重計算,要麼就在分支中採樣,要麼分組後多次渲染。這些都多少會導致性能問題。

3. 如果使用Texture Atlas或者3D Texture,可能會有不正確的Mipmap。這點有不少人都在答案中提到了。

至於Bindless texture為什麼出來這麼晚,我個人猜測主要是下面這些原因:

第一,Bindless texture要做到有用,得想辦法支持Virtual Address和Page Swap以擴展紋理的地址空間;

第二,Bindless texture會增加Texture state object管理的複雜度;

第三,會導致Texture state object Cache missing,增加Latency hiding的難度;

第四,會鼓勵碼農寫出各種對Cache不友好的代碼。

嗯,大概就這麼多以後想到了再補充/修正吧。


一下鏈接詳細解釋了兩者的區別:

https://www.opengl.org/discussion_boards/showthread.php/185637-2D-Texture-Array-vs-3D-Texture

1L的回答個2L的鏈接都寫的非常詳細。

我再解釋一下:

對於2D Texture Array,只是2d貼圖的數組。一層里包含了所有mip信息。

3D Texture是同一個mip里保存所有層的信息。

常識1:臨近的數據容易做緩存,速度快。

於是對於voxelbased渲染數據,隨時要訪問3d空間信息,而且voxelbased一般mip都會保存特殊內容,當然是根據位置做緩存的3D Texture更有優勢

對於地形渲染,可能附近20平米內都是同一張或者兩張貼圖的fetch,完全不需要緩存所有層次的貼圖,而且20平米內可能會有大量的mip變化,自然是2DTextureArray勝出。至於層之間的blend,應該沒人會在不知情的情況下就用3DTexture的Filtering。都是取出需要的貼圖層來手動混合的。

常識2:上述緩存方案僅僅是邏輯分布,具體GPU是怎麼做的與廠商和驅動都有關。


terrain 不同 layer 之間 blend,本質上就是兩張貼圖通過某種指定權重做 lerp,你似乎把這個和用 linear sampling filter 搞混了。

把 N 張尺寸一樣格式一樣的貼圖放到一個 texture array 中,然後用 linear sampling filter 採樣其中一個 slice,filter 只會作用到這個 slice 的 XY方向(和普通貼圖一樣)。

把 N 張貼圖放到一個 3d texture 中,然後用 linear sampling filter 採樣,就算你採樣的 Z 坐標是整數,採樣出來的圖像也會和前後的 slice 有 filter,因為 linear sampling filter 在 3d texture 上石 XYZ 方向的。


我想你的問題主要是以下兩個:

1. Texture2DArray和Texture2D有什麼區別,為什麼在地形圖上要使用前者?
首先,像前面人回答的一樣,texture2Darray可以減少binding的次數,但是這並不是主要原因。最重要的是Texture2DArray可以實現layer間的sampling blending。舉個簡單的例子,假設你的Texture2DArray中有三層, 在某個場景下你需要從第二層和第一層分別sampling,再進行blending時,Texture2DArray就有這樣的硬體支持。一般GPU Texture pipeline中,Texture2DArray的紋理坐標由r,s,t三個維度組成,而普通texture2D的只有r,s兩個維度。這就意味著在計算LOD時,texture2D沒有辦法實現layer與layer之間的blending,相反Texture2DArray就可以。這要比你在Fragment shader中,讀取多個單一2維texture再blending要快多了。

2. Texture2DArray和Texture3D有什麼區別,為什麼不直接用Texture3D?

很多人對於這兩者都有些迷惑。舉個最形象的例子,Texture2DArray像一個相冊,每一頁都是一個獨立的圖片。而Texture3D像一個香腸,你用刀把它切成了幾節,每一節看成一個2D texture。 了解到這點, 你就知道為什麼在地形圖這種場景下,要使用Texture2DArray了。

希望我的回答能對你有用。


bind texture對於api是非常費cpu的操作。如果沒有bind texture array。綁定八個貼圖需要8個bing texture。可能需要幾百毫秒。 有了texture array。一個綁定操作就可以了。

對於dx12 或者 Vulkan。沒有綁定texture的概念。一個texture 已經很像cpu的一個內存指針。想用多少都可以。


推薦閱讀:

女性在遊戲公司做程序、測試還是策劃比較適合啊?
為什麼遊戲引擎要渲染那麼多內容還是能到 60fps?
策劃反推案是什麼意思?

TAG:遊戲開發 | OpenGL | Unity遊戲引擎 | 圖形處理器GPU | DirectX |