在纹理数组上使用TextureArray的性能优势?

时间:2014-08-29 21:57:41

标签: c++ performance directx-11

让我说我想传递给我的GPU的nbFramesAnimation * 3 float4 Texture2D,并且:

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

我将这些纹理用作G-buffer,我在其上应用了一些后效应。因此,我可能必须使用索引的非文字表达式来访问它们。此外,因为我使用它们作为G-Buffers我必须经常加载它们。它们给我位置和法线信息,需要精确,以及UV + IndexObject(因此只使用4个浮点中的3个)。

至于现在,在每个帧渲染时,我使用SetResource单独加载三个纹理。它非常慢而且远非实时。

我想知道是否:

  • 拥有一个Texture2DArray数组效率更高,每个Texture2dArray都有三个纹理(在我的例子中),并在每一帧传递一个Texture2DArray;
  • 或者它与传递3个单独的Texture2D相同?;
  • 使用nbFramesAnimation / X * 3纹理的几个Texture2DArrays并在每个X帧中加载其中一个纹理会更有效吗?

我也很感激有关如何进一步优化此转移的任何见解。

2 个答案:

答案 0 :(得分:5)

引入了

Texture2DArray来简化多个纹理的绑定,这些纹理具有相似的目的,但并不像流量一样表示整体(换句话说,不需要三线性插值)。深度索引用于访问数组的不同部分。

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

使用DirectX 12,最后一个考虑因素已经被删除,引入了无绑定模型和描述符堆之类的东西,人们可以通过预先计算的根签名交换几乎所有资源的公吨映射到着色器。还有“无限”描述符范围和HLSL Shader Model 5.1引入的动态索引。有趣的东西。

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

答案 1 :(得分:-1)

以我的经验,Texture2DArray有一个很大的缺点-每帧30ms与没有它们的12ms。对于VR,这非常重要。刚刚做了一些测试。着色器非常相似,但一个着色器使用texture2d,另一个着色器使用-数组(两个DXT1纹理的数组中的反照率+ pbr贴图)。很坏。为什么要使用它们?