我有一个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支持哪些格式?
答案 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 - >适配器格式,有后备缓冲区格式的部分,以及它们支持的格式(附带我系统的截图)。
同样的信息在运行时通过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上执行必要的转换来允许许多不兼容的格式组合。)