【问题标题】:Determining which swap chain formats are supported确定支持哪些交换链格式
【发布时间】:2020-07-30 19:34:14
【问题描述】:

当用DXGI_FORMAT_B5G6R5_UNORM 调用IDXGIFactory1::CreateSwapChain 时,我收到一个错误,指出不支持这种格式,特别是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 10 1909。

这是一个包含资源创建 sn-ps 和完整代码示例的要点。 https://gist.github.com/akbyrd/c9d312048b49c5bd607ceba084d95bd0

【问题讨论】:

标签: directx directx-11 direct3d direct3d11 dxgi


【解决方案1】:

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

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 得到支持。

如果您使用“旧版”交换效果,您还可以依靠所有支持 DXGI_FORMAT_R8G8B8A8_UNORM_SRGBDXGI_FORMAT_B8G8R8A8_UNORM_SRGB 的 Direct3D 硬件功能级别设备进行交换链。对于 DirectX 12 所需并在 Windows 10 上为 DirectX 11 推荐的现代交换效果(请参阅 this blog post),交换链缓冲区不是使用 _SRGB 创建的,而是您只使用它创建渲染目标视图。

Anatomy of Direct3D 11 Create Device

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-14
    • 2015-08-05
    • 2014-08-04
    • 2011-09-10
    • 2021-01-09
    • 2019-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多