Direct3D9中支持的纹理格式

时间:2017-01-08 01:12:18

标签: directx direct3d

我有一个Direct3D 11渲染器,我实现共享曲面以显示WPF应用程序中的内容(仅使用Direct3D 9)。

在D3D11一侧,我的后台缓冲区使用DXGI_FORMAT_R8G8B8A8_UNORM格式,这很好用。根据{{​​3}} DXGI_FORMAT_R8G8B8A8_UNORM映射到D3D9中的D3DFMT_A8B8G8R8。但是,当我使用该格式在D3D9侧创建纹理时,它会失败。我使用的是Windows 10,并且没有D3D9调试运行时,所以我得到的是D3DERR_INVALIDCALL,因此没有其他信息。

this documentation似乎表示D3D9中的后缓冲区仅支持ARGB格式,ABGR格式未在任何部分列出以获得支持。这是文档中的错误还是完全不支持这种格式?

如果我在D3D11侧使用DXGI_FORMAT_B8G8R8A8_UNORM而在D3D9侧使用D3DFMT_A8R8G8B8纹理创建成功。

为了进一步混淆,This documentation暗示DXGI_FORMAT_R8G8B8A8_UNORM应该是更多兼容的格式,但它是我遇到问题的格式。

我还在GitHub上使用this post确认了此行为。开箱即用它使用DXGI_FORMAT_R8G8B8A8_UNORM并且工作正常,但如果我将后台缓冲区更改为DXGI_FORMAT_B8G8R8A8_UNORM则会中断。

为什么我的视频卡支持的格式在一个API而不是另一个API中工作?我如何确定D3D9支持哪些格式?

2 个答案:

答案 0 :(得分:1)

在D3D11侧坚持DXGI_FORMAT_B8G8R8A8_UNORM,在D3D9坚持D3DFMT_A8R8G8B8。虽然DXGI_FORMAT_R8G8B8A8_UNORM在技术上更兼容,但如果您不需要D3D10支持,则应该支持所有D3D11设备。

我如何确定D3D9支持哪些格式?

您可以使用" DirectX Caps Viewer"来获取此功能(适用于您的系统)。 (随Windows SDK一起提供 - 最新版本的Visual Studio附带)。有一节" Direct3D9设备"。如果为适配器展开,然后 D3D设备类型 - > HAL - >适配器格式,有后备缓冲区格式的部分,以及它们支持的格式(附带我系统的截图)。

DirectX Caps Viewer

同样的信息在运行时通过IDirect3D9::CheckDeviceFormat提供。

此文档似乎表明D3D9中的后缓冲区仅支持ARGB格式,ABGR格式未列在任何支持部分下。这是文档中的错误还是完全不支持此格式?

D3D9不支持渲染到ABGR格式,但理论上它可以作为可以采样的格式。但是,它并不常用,并且通过我当前的驱动程序上限查看,它不受支持。最好坚持ARGB,它具有普遍(虽然,实际上没有保证)的支持。

答案 1 :(得分:0)

BGRA(或ARGB)格式实际上在大多数PC上更兼容,因为它是Windows GDI使用的像素格式。至少NVidia在构建他们的GPU时考虑到了Windows GDI像素格式,所以他们建议使用BGRA而不是RGBA来绕过任何昂贵的格式转换:http://http.download.nvidia.com/developer/Papers/2005/Fast_Texture_Transfers/Fast_Texture_Transfers.pdf

如果你有一个使用D3DFMT_A8B8G8R8的Direct3D9后台缓冲区(如果Direct3D9会支持),那么在每次调用IDirect3DDevice9::Present()时,系统(或GPU)都必须切换每个后台缓冲区的字节像素周围匹配Windows GDI所期望的,这是一个非常昂贵的操作。这种性能损失在OpenGL上实际上是显而易见的(OpenGL针对一个假想的"完美的" GPU,并通过在CPU上执行必要的转换来允许许多不兼容的格式组合。)