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

Tri*_*ian 5 texture-atlas directx-12

我记得当我看到DirectX 12的最初谈话时,我认为它消除了对纹理图谱的需求.然而,现在看起来并不是一个明显的结论,我正在阅读文档.

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

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

textures[NonUniformResourceIndex(textureIndex)].Sample(sampler, uv);
Run Code Online (Sandbox Code Playgroud)

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

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

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

gal*_*p1n 6

简短的回答是肯定的,长期的答案可能是有些情况下地图册会有轻微的性能优势.

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

在nVidia上,绝对没有任何惩罚,并且NonUniformResourceIndex不需要他们的架构,无法正常工作.

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

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