当使用IDXGIFactory1::CreateSwapChain
调用DXGI_FORMAT_B5G6R5_UNORM
时,我得到一个错误,即该格式不受支持,特别是E_INVALIDARG One or more arguments are invalid.
,但是,对于更标准的格式(如DXGI_FORMAT_B8G8R8A8_UNORM
),这很好。
我试图了解如何知道支持哪种交换链格式。通过浏览文档,我可以找到“呈现目标”所支持的格式列表,但这似乎不是交换链支持的同一组格式。B5G6R5确实需要11.1才能为大多数用途提供所需的支持,但它是作为呈现目标工作的。
作为一种测试,我遍历了所有格式,并尝试用每种格式创建交换链。在118种格式中,只有8种在我的计算机上得到支持(RTX 2070):
DXGI_FORMAT_R16G16B16A16_FLOAT
DXGI_FORMAT_R10G10B10A2_UNORM
DXGI_FORMAT_R8G8B8A8_UNORM
DXGI_FORMAT_R8G8B8A8_UNORM_SRGB
DXGI_FORMAT_B8G8R8A8_UNORM
DXGI_FORMAT_B8G8R8A8_UNORM_SRGB
DXGI_FORMAT_NV12
DXGI_FORMAT_YUY2
,知道支持哪种交换链格式的正确方法是什么?
对于额外的上下文,我正在进行16位(565)格式的屏幕外呈现。我有一个可选的“预览窗口”,我偶尔打开,以快速看到渲染结果。创建窗口时,我创建一个交换链,并从真实的呈现目标复制到交换链回缓冲区。我的目标是DirectX 11或11.1。我可以很好地呈现B5G6R5格式,只有交换链才会发出抱怨。我在运行Windows 101909。
这里有一个带有资源创建片段的Gist和一个完整的代码示例。https://gist.github.com/akbyrd/c9d312048b49c5bd607ceba084d95bd0
发布于 2020-07-30 21:18:31
对于交换链,必须支持“显示扫描”。如果需要在运行时检查格式支持,可以使用:
UINT formatSupport = 0;
if (FAILED(device->CheckFormatSupport(backBufferFormat, &formatSupport)))
formatSupport = 0;
UINT32 required = D3D11_FORMAT_SUPPORT_RENDER_TARGET | D3D11_FORMAT_SUPPORT_DISPLAY;
if ((formatSupport & required) != required)
{
// Not supported
}
对于所有Direct3D硬件功能级别的设备,始终可以指望DXGI_FORMAT_R8G8B8A8_UNORM
工作。除非您使用的是Windows或旧的WDDM1.0遗留驱动程序,否则也可以依赖DXGI_FORMAT_B8G8R8A8_UNORM
。
对于Direct3D硬件功能级别10.0或更高的设备,还可以依赖于支持DXGI_FORMAT_R16G16B16A16_FLOAT
和DXGI_FORMAT_R10G10B10A2_UNORM
。
如果您使用的是“遗留”交换效果,还可以依赖所有支持Direct3D和
DXGI_FORMAT_B8G8R8A8_UNORM_SRGB
的硬件功能级设备进行交换链。对于DirectX 12所需的现代交换效果,以及DirectX 11在Windows 10中推荐的效果(参见这篇博客文章),不是用_SRGB
创建的,而是使用它创建呈现目标视图。
https://stackoverflow.com/questions/63180144
复制相似问题