我有一个Direct3D 11渲染器,我正在实现共享表面以显示WPF应用程序(仅使用Direct3D 9)中的内容。Direct3D9中支持的纹理格式
在D3D11方面,我的后台缓冲区使用格式DXGI_FORMAT_R8G8B8A8_UNORM,这工作正常。根据this documentation DXGI_FORMAT_R8G8B8A8_UNORM映射到D3D9中的D3DFMT_A8B8G8R8。但是,当我使用该格式在D3D9端创建纹理时,它会失败。我使用Windows 10,并且没有D3D9调试运行时,所以我得到的只是一个D3DERR_INVALIDCALL,因此没有附加信息。
This documentation似乎认为只有ARGB格式支持D3D9中的后台缓冲区,ABGR格式没有在任何支持部分下列出。这是文档中的错误还是这种格式完全不受支持?
如果我改为在D3D11一侧使用DXGI_FORMAT_B8G8R8A8_UNORM,而在D3D9一侧纹理创建成功使用D3DFMT_A8R8G8B8。
对于进一步的混乱,this post意味着DXGI_FORMAT_R8G8B8A8_UNORM应该是更兼容的格式,但它是我遇到的麻烦之一。
我也在GitHub上用Microsoft WPF DirectX Interop sample确认了这种行为。开箱即用的是DXGI_FORMAT_R8G8B8A8_UNORM,并且工作正常,但如果我将后台缓冲区更改为DXGI_FORMAT_B8G8R8A8_UNORM,则会中断。
为什么我的视频卡支持的格式可以在一个API中工作,而不是在另一个API中工作?我怎么知道D3D9支持哪些格式?