DirectX 12是否消除了对纹理图案的需求?

时间:2016-07-21 16:14:14

标签: texture-atlas directx-12

我记得当我看到关于DirectX 12的初步会谈时,我认为它消除了对纹理图谱的需求。然而,现在看来,我正在阅读文档,这似乎不是一个明显的结论。

我见过的一个可以替代它的功能是HLSL中资源数组的动态非均匀索引:

Texture2D<float4> textures[128];
SamplerState sampler;

textures[NonUniformResourceIndex(textureIndex)].Sample(sampler, uv);

另一个潜在的功能是ExecuteIndirect,它编码仍然是一堆单独的绘图和资源更改调用缓冲区,并在单个CPU调用中立即将其提交到GPU。

这两个都将解决纹理图集的局限性(无法在atlas区域使用边框模式,有问​​题的mipmapping),但我想知道性能特征或预期是否与纹理图谱相似或者该技术是否仍然存在合理的。

我也很想知道答案是否适用于Mantle,Vulkan和Metal。

1 个答案:

答案 0 :(得分:5)

简短的回答是肯定的,很长一段时间的答案可能是地图册中会有轻微的性能优势。

使用DX12和Vulkan,你可以忘记Mantle。具有描述符的纹理的当前表示接近于金属,使用无绑定不会涉及太多性能损失并且在当前硬件上对常规纹理或无绑定纹理的纹理提取是相同的,并且在可能的情况下甚至更好。未来,因为它是要走的路。

在nVidia上,绝对没有任何惩罚,NonUniformResourceIndex不是他们架构的要求,无法正常工作。

在AMD上,NonUniformResourceIndex具有着色器代码生成含义,如果将它们相乘可能会产生成本,并且最好避免它们。理想情况下,您不能一次使用多个索引的绘图调用(在一个实例中或跨实例中)。这是因为GPU使用向量和标量寄存器的组合。纹理和采样器描述符加载到标量寄存器中。如果纹理有不同的索引,则无法正常工作。 NonUniformResourceIndex事物在活动线程上生成循环,消耗索引,为其屏蔽线程并执行获取,循环直到它继续执行所有线程。但是无视这些考虑,无绑定纹理使用与常规绑定相同的系统。

ExecuteIndirect也是一个非常好的协议,它现在并不总是在驱动程序中完美优化,但随着DX12引擎的更多游戏,它将得到改善。这个API是gpu剔除和许多解决方案的开放之门,以减少更多的CPU工作。在Xbox One上,甚至可以用它来更改PipelineStateObject

相关问题