【问题标题】:DirectX11 - Textures and dynamic changesDirectX11 - 纹理和动态变化
【发布时间】:2017-10-09 17:19:53
【问题描述】:

我有几个关于 DirectX 11 的问题。

当我通过 CreateTexture2D 创建纹理并指定 DEFAULT 用法时,我应该能够使用 UpdateSubresource,对吧?

a) 内存更新是否必须与原始纹理的格式相同?我的意思是当我用 DDS DXT1 CreateTexture 时,UpdateSubresource 数据也必须是 DDS DXT1 吗?

b) 什么时候可以更新资源?在 DX12 中,您可以在完成命令列表之前更新资源。否则什么都不会发生。

c) 我应该用 update 来更新每个 mip,其中子资源的每个索引都是 index*miplevels,对吧?

或者我应该改用 map unmap 吗?有没有成功更新所需的所有规则的好例子?

【问题讨论】:

    标签: dynamic textures directx-11


    【解决方案1】:

    加载纹理最有效的方法是在创建纹理时使用initData。您可以将其设为DEFAULTIMMUTABLE

    另一种方法是使用DEFAULT 纹理和一组较小的STAGING 纹理。通过Map 将数据加载到STAGING 纹理中,然后通过CopyResource 复制。理想情况下,您可以重复使用 STAGING 纹理(相同的大小、mips、格式等)。 UpdateSubresource 有效,但效率不高——它最常用于常量缓冲区。

    动态纹理实际上仅适用于您计划每帧或每几帧更新的内容。根据硬件的不同,它们被放入 GPU 和 CPU 都可以访问的效率稍低(用于渲染)的内存中。

    使用d3d11.h中定义的帮助器D3D11CalcSubresource找出子资源:

    UINT D3D11CalcSubresource( UINT MipSlice, UINT ArraySlice, UINT MipLevels )
    {
        return MipSlice + ArraySlice * MipLevels;
    }
    

    这在 MSDN 的编程指南中有所介绍:

    How to: Initialize a Texture Programmatically
    How to: Use dynamic resources

    另见DDSTextureLoaderWICTextureLoader

    请注意,您可以通过查看实现 here 功能的 DirectX 12 助手来了解 UpdateSubresource 的效率有多低。

    【讨论】:

    • 我实际上是在做项目的任务,我的目标是在现有的 DX11 应用程序中用不同的纹理替换所有纹理。所以我不得不挂钩不同的 DirectX 方法。
    • 你的回答自相矛盾。一方面,您说动态资源/纹理非常低效(使用 Map/Unmap)。另一方面,您说 UpdateSubresource 效率非常低,这意味着要与 _USAGE_DEFAULT 纹理一起使用。但是为什么首先要创建一个暂存纹理​​。我通过创建一个 _USAGE_DEFAULT 纹理并在运行时使用UpdateSubresourceD3D11CalcSubresource 随意更改它。当然,这仅对您不打算更改每一帧左右的纹理有效(在这种情况下,您应该使用 _USAGE_DYNAMIC) - 正如您所提到的。
    • UpdateSubresource 在背景中创建等效的暂存纹理。相对昂贵的是资源的创建/销毁。将纹理保存在您可以从 CPU 访问的内存中也会受到惩罚(UMA 架构除外)。
    【解决方案2】:

    所以我发现包括我的解决方案:

    如果纹理创建为DYNAMIC,如果它有多个mips,则不能Map。 (我的纹理中有更多的 mip,所以我不得不以其他方式进行)

    所以我不得不在创建时使用DEFAULT 纹理。然后 UpdateSubresourceD3D11CalcSubresource 在 for 循环中更新纹理中的所有 mip。所以在我的情况下,使用简单的多 mip-map 2D 纹理:D3D11CalcSubresource( i, 0, totalMipsInTexture)。在调用Present 之前,我设法更新了纹理(注意多线程)。

    我的最终建议:如果您遇到困难,请在 DirectX 中启用调试层(当您创建设备通道时)。它会告诉你你做错了什么。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多