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

Yau*_*uda 4 c++ performance directx-11

假设我有想要传递给我的GPU的nbFramesAnimation*3 float4 Texture2D,并且:

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

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

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

我想知道是否:

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

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

Eli*_*rak 6

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

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

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

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