确定支持哪些交换链格式

Determining which swap chain formats are supported

当用 DXGI_FORMAT_B5G6R5_UNORM 调用 IDXGIFactory1::CreateSwapChain 时,我得到一个错误,指出不支持这种格式,特别是 E_INVALIDARG One or more arguments are invalid. 但是,这适用于更标准的格式,如 [=14] =].

我正在尝试了解如何知道支持哪些交换链格式。通过深入研究文档,我可以找到“渲染目标”支持的格式列表,但这似乎与交换链支持的格式集不同。 B5G6R5 确实需要 11.1 才能支持大多数用途,但它作为渲染目标工作。

作为测试,我遍历了所有格式并尝试为每种格式创建交换链。在 118 种格式中,我的机器 (RTX 2070) 似乎只支持 8 种格式:

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) 格式。我有一个可选的“预览 window”,我偶尔会打开它以快速查看渲染结果。当我创建 window 时,我创建了一个交换链,并将真实渲染目标复制到交换链后台缓冲区中。我的目标是 DirectX 11 或 11.1。我能够很好地呈现为 B5G6R5 格式,只是交换链有问题。我是 运行 Windows 10 1909.

这是一个包含资源创建片段和完整代码示例的 Gist。 https://gist.github.com/akbyrd/c9d312048b49c5bd607ceba084d95bd0

对于交换链,必须支持“显示扫描输出”。如果需要在运行时检查格式支持,可以使用:

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 Vista 或古老的 WDDM 1.0 遗留驱动程序,否则您也可以指望 DXGI_FORMAT_B8G8R8A8_UNORM

对于 Direct3D 硬件功能级别 10.0 或更高版本的设备,您还可以指望 DXGI_FORMAT_R16G16B16A16_FLOATDXGI_FORMAT_R10G10B10A2_UNORM 得到支持。

You can also count on all Direct3D Hardware Feature Level devices supporting DXGI_FORMAT_R8G8B8A8_UNORM_SRGB and DXGI_FORMAT_B8G8R8A8_UNORM_SRGB for swap-chains if you are using the 'legacy' swap effects. For modern swap effects which are required for DirectX 12 and recommended on Windows 10 for DirectX 11 (see this blog post), the swapchain buffer is not created with _SRGB but instead you create just the render target view with it.

Anatomy of Direct3D 11 Create Device