【问题标题】:Does DirectX 12 eliminate the need for texture atlasing?DirectX 12 是否消除了对纹理图集的需求?
【发布时间】:2016-11-25 08:17:33
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

    标签: texture-atlas directx-12


    【解决方案1】:

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

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

    在 nVidia 上,绝对没有惩罚,NonUniformResourceIndex 不是他们架构的要求,无绑定即可。

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

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

    【讨论】:

    • 这是非常好的信息!我的用例类似于在不使用 spritesheet 的情况下绘制精灵,因此纹理索引可能会在不同三角形(四边形)对的像素之间发散。我猜即使在 ATI 上,如果精灵不是微不足道的,很少有扭曲会最终发散。
    • 在这种情况下,您将不得不使用非统一索引标记,但大多数波会看到单个索引,并且着色器开销应该可以忽略不计。如果您的粒子有大量过度绘制,您甚至可能希望在全屏计算过程中手动栅格化它们。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-19
    • 2012-01-19
    • 1970-01-01
    • 2012-12-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-13
    相关资源
    最近更新 更多