【UE4材质】纹理数组Texture2DArray说明
Texture2DArray说白了就是将贴图打成一组,一个集合/纹理数组。
什么情况下需要用Texture2DArray,目前我接触到的基本都在地形或者建筑模型需要刷混合的时候用。
为什么要强调Texture2DArray在地形上的应用?
纹理数组UTexture2DArray能够让我们轻松使用更多的纹理而不受制于采样数目的限制。
说白了就是可以减少bind,优化性能,减少性能消耗,尤其是手游用的比较多。
Texture2DArray具体的优势解释起来比较复杂:
下面我收集了网上部分大佬的解释:
A
为什么要强调Texture2DArray可以用于地形,除了减少Bind以外有什么优势?既然每个Slice都要Sampling的话,性能上应该没有明显区别才对?
主要是为了减少 Bind,因为老 API 对 texture slot 个数有限制。
2. 假设如一些资料所说Texture2DArray对比多个Texture有性能优势的话,那么是不是更极端点直接用Texture3D?Trilinear filtering甚至可以代替Shader里Blend的过程吧?但是实际没有见过这种做法不知道是不是有什么没有考虑到的地方。
Texture3D 只能对相邻的两个 slice 进行插值。
地形贴图不止用两张贴图哟,可能 n 张贴图同时 blend。
B
为什么要强调Texture2DArray可以用于地形,除了减少Bind以外有什么优势?既然每个Slice都要Sampling的话,性能上应该没有明显区别才对?
主要是为了减少 Bind,因为老 API 对 texture slot 个数有限制。
2. 假设如一些资料所说Texture2DArray对比多个Texture有性能优势的话,那么是不是更极端点直接用Texture3D?Trilinear filtering甚至可以代替Shader里Blend的过程吧?但是实际没有见过这种做法不知道是不是有什么没有考虑到的地方。
Texture3D 只能对相邻的两个 slice 进行插值。
地形贴图不止用两张贴图哟,可能 n 张贴图同时 blend。
C
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了。
D
问题:2D 纹理数组和 3D 纹理有什么区别?(1D 纹理数组和 2D 纹理的类似问题)
它们根本没有相似之处。至少,从概念上讲。2D 数组纹理是一种 2D 纹理,其中每个 mipmap 级别都包含一个 2D 图像数组。3D 纹理是每个 mipmap 级别包含单个三维图像的纹理。
2D 数组纹理的目的是能够在单个对象中具有多个 2D 纹理。这样,着色器本身就可以选择要用于每个特定对象的图像。纹理坐标的含义与 2D 纹理相同:表示 2D 空间中的位置。只是您还有一个选择器,可以说明要使用的数组中的哪个 2D 图像。
3D 纹理都是关于从数据量中采样的。也就是说,您具有本质上是三维的纹理坐标,可能表示纹理体积空间内的位置。
这两种纹理类型不会相互竞争。也就是说,你可以用2D数组纹理来解决,也可以用3D纹理解决(或者至少,不是没有躲避某种形式的视觉伪影)。反之亦然;如果您需要 3D 纹理,则它处于不适合使用 2D 数组纹理的问题空间中。
哦,当然,在硬件内部,它们大多只是它们之间的一些差异。具体来说,数组的较低 mipmap 具有相同的深度但不同的宽度和高度,并且数组的过滤始终最接近 Z 分量。但就OpenGL本身(以及任何一种纹理类型的使用)而言,它们是两个不同的东西,它们解决了两组完全不同的问题。
因此,永远不应该有您试图在其中一个之间进行选择的情况。
bind texture对于api是非常费cpu的操作。如果没有bind texture array。绑定八个贴图需要8个bing texture。可能需要几百毫秒。 有了texture array。一个绑定操作就可以了。
对于dx12 或者 Vulkan。没有绑定texture的概念。一个texture 已经很像cpu的一个内存指针。想用多少都可以。
UTexture2DArray源码,默认是开启的。


若右键创建Materials&Textures列表没有Texture2DArray,在Cmd中输入命令r.AllowTexture2DArrayCreation 1开启
了解以后,下面是使用方法:
创建方法:

材质如何使用Texture2DArray?
把贴图放入其中

检查

采样数目对比

