6

我记得当我看到关于 DirectX 12 的最初讨论时,我认为它消除了对纹理图集的需要。但是,现在我正在浏览文档,这似乎不是一个明显的结论。

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

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

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

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

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

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

4

1 回答 1

7

简短的回答是肯定的,长的回答可能是在某些情况下 atlas 会有轻微的性能优势。

使用 DX12 和 Vulkan,您可以忘记 Mantle。当前使用描述符的纹理表示接近金属,使用 bindless 不会带来太多性能损失,并且在当前硬件上常规纹理或 bindless 的纹理获取是相同的,并且可能在未来,因为它是要走的路。

在 nVidia 上,绝对没有惩罚,NonUniformResourceIndex也不是他们架构的要求,bindless 只是工作。

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

ExecuteIndirect也是一个很好的交易,它现在并不总是在驱动程序中完美优化,但随着更多游戏与 DX12 引擎一起出现,它会有所改善。这个 API 为 gpu 剔除和许多减少更多 cpu 工作的解决方案打开了大门。在 Xbox One 上,甚至可以PipelineStateObject使用它进行更改。

于 2016-07-21T17:49:18.283 回答