欢迎光临散文网 会员登陆 & 注册

【UE4材质】纹理数组Texture2DArray说明

2023-05-20 21:04 作者:这就很离谱丶  | 我要投稿

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源码,默认是开启的

UTexture2DArray源码
UTexture2DArray源码

若右键创建Materials&Textures列表没有Texture2DArray,在Cmd中输入命令r.AllowTexture2DArrayCreation 1开启

了解以后,下面是使用方法:
创建方法:

材质如何使用Texture2DArray?

把贴图放入其中

图片尺寸或格式需要保持一致

检查

UV第三个变量Z表示贴图索引

采样数目对比


【UE4材质】纹理数组Texture2DArray说明的评论 (共 条)

分享到微博请遵守国家法律