【问题标题】:How to create a texture2d with a full set of mipmaps with DirectX11(version before DirectX11.1)如何使用 DirectX11(DirectX11.1 之前的版本)创建带有全套 mipmap 的 texture2d
【发布时间】:2018-05-11 09:22:48
【问题描述】:

其实这个问题是从我之前发过的thisquestion 得到的。它可以在带有 directx 12 的 windows 10 下工作。但是我无法在带有 directx 11 的 windows 7 下创建 Texture2D。我创建了第二个 texture2d 来生成这样的 mipmap:

D3D11_TEXTURE2D_DESC textureDesc;
textureDesc.Width = nWidth;//Video width
textureDesc.Height = nHeight;//Video height
textureDesc.MipLevels = 0;//generate a full set of subtextures.
textureDesc.ArraySize = 1;
textureDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
textureDesc.SampleDesc.Count = 1;
textureDesc.Usage = D3D11_USAGE_DEFAULT;
textureDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET;
textureDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
textureDesc.MiscFlags = D3D11_RESOURCE_MISC_GENERATE_MIPS;
m_pD3dDevice->CreateTexture2D(&textureDesc, NULL, &m_pTexture);

我刚刚在 Windows7 下得到“无效参数”。根据Extended support for shared Texture2D resources,似乎只有DirectX11.1保证这种用法。 Windows 7下不支持D3D11_BIND_SHADER_RESOURCE和D3D11_BIND_RENDER_TARGET的绑定标志(DirectX的版本应该是directx11)。没有这个,ID3D11DeviceContext::GenerateMips method无效。我的应用程序必须支持 Windows 7,那么有什么替代解决方案吗?

【问题讨论】:

  • 调试 Direct3D 问题的第一步是启用调试设备。你有没有从中得到任何诊断输出?此外,如果您安装了KB2670838,Windows 7 也支持 DirectX 11.1。 Autogen mipmap 在 DirectX 11.0 或更高版本上工作得很好,所以问题可能是其他问题......

标签: directx-11 texture2d mipmaps


【解决方案1】:

它在 Windows 7 上失败但在 Windows 10 上运行的原因是因为您实际上正在使用Direct3D 11.2 Runtime 可选功能:D3D11_FEATURE_DATA_D3D11_OPTIONS1.MapOnDefaultBuffers。您同时设置了D3D11_USAGE_DEFAULTD3D11_CPU_ACCESS_WRITE,如果没有此可选功能,则不支持,并且在 Windows 7 上从不支持。即使在 Windows 10 上也有设备不支持此功能,所以您不能依靠它 100% 的时间工作。

要获得 CPU 写访问权限,您需要使用 D311_USAGE_DYNAMIC。这可能会影响使用该纹理进行渲染的性能,因此更常见的是您会使用 D3D11_USAGE_DEFAULT 而没有 CPU 写入访问权限。要初始化此类纹理,您可以使用另一个设置为 D3D11_USAGE_STAGING 的纹理,它始终支持 CPU 写入访问,然后复制到 DEFAULT 资源,或者您可以使用 UpdateSubresource

有关执行所有这些操作的 C++ 源示例,包括自动生成 mipmapping,请参阅 DirectX Tool Kit for DX11 中的 WICTextureLoader

Windows 7 Service Pack 1 可以使用KB2670838 更新到 DirectX 11.1 运行时,此时它已被广泛部署。在MSDN 上列出的 Windows 7 上运行时存在一些限制,主要是它只支持“软件”功能,不支持需要 WDDM 1.2 驱动程序的“硬件”功能。 Windows 7 不支持 DirectX 11.2 Runtime 或更高版本。

【讨论】:

  • 我只是把D3D11_CPU_ACCESS_WRITE改成0,然后就可以了。奇怪的是D3D11_CPU_ACCESS_READ不行。非常感谢!
  • MSDN 上这篇稍有过时的文章可能会有所帮助...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-27
  • 1970-01-01
  • 2016-07-11
  • 2014-03-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多