与纹理阵列相比,使用TextureArray的性能优势



假设我有nbFramesAnimation*3float4Texture2D,我想将其传递给我的GPU,并且:

  • 我不需要在纹理之间进行插值
  • 纹理具有相同的大小
  • 我不知道它是否相关,但我没有任何mip地图

我使用这些纹理作为G缓冲区,在上面应用一些后期效果。因此,我可能不得不使用索引的非文字表达式来访问它们。此外,因为我将它们用作G-Buffer,所以我必须经常加载它们。它们为我提供了需要精确的位置和法线Infos,以及UV+IndexObject(因此有效地只使用了4个浮动中的3个)。

到目前为止,在每次帧渲染时,我都会使用SetResource分别加载这三个纹理。它非常缓慢,而且远非实时。

我想知道是否:

  • 有一个Texture2DArrays阵列更有效,每个Texture2dArray有三个纹理(在我的情况下),并且在每帧传递一个textures 2DArray
  • 还是与传递3个单独的Texture2D相同
  • 做几个nbFramesAnimation/X*3纹理的Texture2DArrays,并在每个X帧加载其中一个,会更有效吗

我也很感激任何关于我如何进一步优化这次转会的见解。

引入

Texture2DArrayS是为了简化具有相似目的的多个纹理的绑定,这些纹理组合在一起,但不代表像体积一样的整体(换句话说,不需要三线性插值)。深度索引用于访问阵列的不同部分。

就像C++(或任何其他语言)中的数组概念一样,其目的是允许动态索引,这在多个单独的索引中是不可能的。性能考虑不会超出将元素绑定到管道的成本,这是一个方便的问题,而不是占用绑定点。

有了DirectX 12,最后一个考虑因素已经消除,引入了无绑定模型和描述符堆之类的东西,在描述符堆中,可以通过预先计算的根签名交换映射到着色器的大量资源。此外,HLSL Shader Model 5.1引入了"无限"描述符范围和动态索引。有趣的东西。

无论如何,不要太担心两者之间的表现。担心你的作品是否高雅。如果这些东西组合在一起,并且您的设计需要在某个时间对所有这些东西进行采样,请将它们分组到Texture2DArray中。

根据我的经验,Texture2DArray有一个巨大的缺点——每帧30ms,而没有它们的情况下为12ms。对于VR来说,这是非常重要的。刚刚做了一些测试。着色器非常相似,但一个使用texture2d,另一个使用数组(两个DXT1纹理的数组中的反照率+pbr贴图)。非常糟糕。那么为什么要使用它们呢?

最新更新