假设我有nbFramesAnimation * 3 float4 Texture2D我想传递给我的GPU,然后:
我将这些纹理用作G缓冲区,在上面应用一些后效果。因此,我可能必须使用非文字表达的索引来访问它们。此外,因为我将它们用作G缓冲区,所以必须经常加载它们。它们为我提供了需要精确定位的位置和法线信息,以及UV + IndexObject(因此有效地使用了4个浮点中的3个)。
目前,在每个帧渲染时,我都使用SetResource分别加载三个纹理。这是非常慢的,而且不是实时的。
我想知道是否:
[我也非常感谢我对如何进一步优化此转移的任何见解。
Texture2DArray
来简化具有相似目的的多个纹理的绑定,但在一起并不需要像一个体积那样表示整体(换句话说,不需要三线性插值)。深度索引用于访问数组的不同部分。
就像C ++(或空中其他语言)中的数组的概念一样,其目的是允许动态索引,而使用多个单独的索引是不可能的。性能方面的考虑并不超出将元素绑定到管道的成本,这是方便的问题,并且不要占用绑定点。
对于DirectX 12,最后一个考虑已被删除,引入了无绑定模型和诸如描述符堆之类的东西,在其中可以通过预先计算的根签名交换一吨吨的几乎所有资源映射到着色器。 HLSL Shader Model 5.1还引入了“无限”描述符范围和动态索引。好玩的东西。
无论如何,不要太担心两者之间的性能。担心工作的优雅。如果将所有东西放在一起,并且您的设计需要在某个时间对所有它们进行采样,请将它们分组在Texture2DArray
中。
以我的经验,Texture2DArray有一个很大的缺点-每帧30ms与没有它们的12ms。对于VR,这非常重要。刚刚做了一些测试。着色器非常相似,但一个着色器使用texture2d,另一个着色器使用-数组(两个DXT1纹理的数组中的反照率+ pbr贴图)。很坏。为什么要使用它们?