【UE4材質(zhì)】紋理數(shù)組Texture2DArray說明
Texture2DArray說白了就是將貼圖打成一組,一個(gè)集合/紋理數(shù)組。
什么情況下需要用Texture2DArray,目前我接觸到的基本都在地形或者建筑模型需要刷混合的時(shí)候用。
為什么要強(qiáng)調(diào)Texture2DArray在地形上的應(yīng)用?
紋理數(shù)組UTexture2DArray能夠讓我們輕松使用更多的紋理而不受制于采樣數(shù)目的限制。
說白了就是可以減少bind,優(yōu)化性能,減少性能消耗,尤其是手游用的比較多。
Texture2DArray具體的優(yōu)勢解釋起來比較復(fù)雜:
下面我收集了網(wǎng)上部分大佬的解釋:
A
為什么要強(qiáng)調(diào)Texture2DArray可以用于地形,除了減少Bind以外有什么優(yōu)勢?既然每個(gè)Slice都要Sampling的話,性能上應(yīng)該沒有明顯區(qū)別才對?
主要是為了減少 Bind,因?yàn)槔?API 對 texture slot 個(gè)數(shù)有限制。
2. 假設(shè)如一些資料所說Texture2DArray對比多個(gè)Texture有性能優(yōu)勢的話,那么是不是更極端點(diǎn)直接用Texture3D?Trilinear filtering甚至可以代替Shader里Blend的過程吧?但是實(shí)際沒有見過這種做法不知道是不是有什么沒有考慮到的地方。
Texture3D 只能對相鄰的兩個(gè) slice 進(jìn)行插值。
地形貼圖不止用兩張貼圖喲,可能 n 張貼圖同時(shí) blend。
B
為什么要強(qiáng)調(diào)Texture2DArray可以用于地形,除了減少Bind以外有什么優(yōu)勢?既然每個(gè)Slice都要Sampling的話,性能上應(yīng)該沒有明顯區(qū)別才對?
主要是為了減少 Bind,因?yàn)槔?API 對 texture slot 個(gè)數(shù)有限制。
2. 假設(shè)如一些資料所說Texture2DArray對比多個(gè)Texture有性能優(yōu)勢的話,那么是不是更極端點(diǎn)直接用Texture3D?Trilinear filtering甚至可以代替Shader里Blend的過程吧?但是實(shí)際沒有見過這種做法不知道是不是有什么沒有考慮到的地方。
Texture3D 只能對相鄰的兩個(gè) slice 進(jìn)行插值。
地形貼圖不止用兩張貼圖喲,可能 n 張貼圖同時(shí) blend。
C
1. Texture2DArray和Texture2D有什么區(qū)別,為什么在地形圖上要使用前者? 首先,像前面人回答的一樣,texture2Darray可以減少binding的次數(shù),但是這并不是主要原因。最重要的是Texture2DArray可以實(shí)現(xiàn)layer間的sampling & blending。舉個(gè)簡單的例子,假設(shè)你的Texture2DArray中有三層, 在某個(gè)場景下你需要從第二層和第一層分別sampling,再進(jìn)行blending時(shí),Texture2DArray就有這樣的硬件支持。一般GPU Texture pipeline中,Texture2DArray的紋理坐標(biāo)由r,s,t三個(gè)維度組成,而普通texture2D的只有r,s兩個(gè)維度。這就意味著在計(jì)算LOD時(shí),texture2D沒有辦法實(shí)現(xiàn)layer與layer之間的blending,相反Texture2DArray就可以。這要比你在Fragment shader中,讀取多個(gè)單一2維texture再blending要快多了。
2. Texture2DArray和Texture3D有什么區(qū)別,為什么不直接用Texture3D?
很多人對于這兩者都有些迷惑。舉個(gè)最形象的例子,Texture2DArray像一個(gè)相冊,每一頁都是一個(gè)獨(dú)立的圖片。而Texture3D像一個(gè)香腸,你用刀把它切成了幾節(jié),每一節(jié)看成一個(gè)2D texture。 了解到這點(diǎn), 你就知道為什么在地形圖這種場景下,要使用Texture2DArray了。
D
問題:2D 紋理數(shù)組和 3D 紋理有什么區(qū)別?(1D 紋理數(shù)組和 2D 紋理的類似問題)
它們根本沒有相似之處。至少,從概念上講。2D 數(shù)組紋理是一種 2D 紋理,其中每個(gè) mipmap 級別都包含一個(gè) 2D 圖像數(shù)組。3D 紋理是每個(gè) mipmap 級別包含單個(gè)三維圖像的紋理。
2D 數(shù)組紋理的目的是能夠在單個(gè)對象中具有多個(gè) 2D 紋理。這樣,著色器本身就可以選擇要用于每個(gè)特定對象的圖像。紋理坐標(biāo)的含義與 2D 紋理相同:表示 2D 空間中的位置。只是您還有一個(gè)選擇器,可以說明要使用的數(shù)組中的哪個(gè) 2D 圖像。
3D 紋理都是關(guān)于從數(shù)據(jù)量中采樣的。也就是說,您具有本質(zhì)上是三維的紋理坐標(biāo),可能表示紋理體積空間內(nèi)的位置。
這兩種紋理類型不會相互競爭。也就是說,你可以用2D數(shù)組紋理來解決,也可以用3D紋理解決(或者至少,不是沒有躲避某種形式的視覺偽影)。反之亦然;如果您需要 3D 紋理,則它處于不適合使用 2D 數(shù)組紋理的問題空間中。
哦,當(dāng)然,在硬件內(nèi)部,它們大多只是它們之間的一些差異。具體來說,數(shù)組的較低 mipmap 具有相同的深度但不同的寬度和高度,并且數(shù)組的過濾始終最接近 Z 分量。但就OpenGL本身(以及任何一種紋理類型的使用)而言,它們是兩個(gè)不同的東西,它們解決了兩組完全不同的問題。
因此,永遠(yuǎn)不應(yīng)該有您試圖在其中一個(gè)之間進(jìn)行選擇的情況。
bind texture對于api是非常費(fèi)cpu的操作。如果沒有bind texture array。綁定八個(gè)貼圖需要8個(gè)bing texture??赡苄枰獛装俸撩?。 有了texture array。一個(gè)綁定操作就可以了。
對于dx12 或者 Vulkan。沒有綁定texture的概念。一個(gè)texture 已經(jīng)很像cpu的一個(gè)內(nèi)存指針。想用多少都可以。
UTexture2DArray源碼,默認(rèn)是開啟的。


若右鍵創(chuàng)建Materials&Textures列表沒有Texture2DArray,在Cmd中輸入命令r.AllowTexture2DArrayCreation 1開啟
了解以后,下面是使用方法:
創(chuàng)建方法:

材質(zhì)如何使用Texture2DArray?
把貼圖放入其中

檢查

采樣數(shù)目對比

