2017-01-08 46 views
3

我有一个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支持哪些格式?

回答

1

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

我怎么知道D3D9支持哪些格式?

您可以使用“DirectX Caps Viewer”(随Visual Studio最新版本附带的Windows SDK一起提供)获得此版本(适用于您的系统)。有一部分“Direct3D9设备”。如果你扩展了你的适配器,然后D3D设备类型 - > HAL - >适配器格式,有部分backbuffer格式,它们支持哪些格式(附带我的系统截图)。

DirectX Caps Viewer

此相同的信息通过IDirect3D9::CheckDeviceFormat是在运行时可用。

本文档似乎认为只有ARGB格式支持D3D9中的后台缓冲区,而ABGR格式未在任何支持部分列出。这是文档中的错误还是这种格式完全不受支持?

D3D9不支持渲染为ABGR格式,但理论上它可用作可采样的格式。然而,它并不常用,并且通过我目前的驱动程序大小来看,它不受支持。最好坚持ARGB,它具有普遍的(但实际上并不能保证)支持。

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(其针对假设的“完美”GPU并通过在CPU上执行必要的转换而允许许多不兼容的格式组合)允许的情况下显而易见。