C语言 当后台缓冲区像素格式设置为 DXGI_FORMAT_B8G8R8X8_UNORM 时,为什么 D3D11Crea



我正在尝试将一段Direct3D 9代码移植到Direct3D 11。原始代码使用D3DFMT_X8R8G8B8的适配器格式。我搜索了MSDN,发现Direct3D 11中的等效项是DXGI_FORMAT_B8G8R8X8_UNORM。下面是我在创建窗口后为 Direct3D 11 修改的代码:

DXGI_SWAP_CHAIN_DESC swap_chain_description;
ZeroMemory(&swap_chain_description, sizeof swap_chain_description);
swap_chain_description.BufferDesc.Width = window_width;
swap_chain_description.BufferDesc.Height = window_height;
swap_chain_description.BufferDesc.RefreshRate.Denominator = 1;
swap_chain_description.BufferDesc.Format = DXGI_FORMAT_B8G8R8X8_UNORM;
swap_chain_description.SampleDesc.Count = 1;
swap_chain_description.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
swap_chain_description.BufferCount = 1;
swap_chain_description.OutputWindow = hWnd;
swap_chain_description.Windowed = TRUE;
swap_chain_description.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
swap_chain_description.Flags = 0;
HRESULT hr = D3D11CreateDeviceAndSwapChain(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, 0, NULL, 0, D3D11_SDK_VERSION, &swap_chain_description, &dxgi_swap_chain, &d3d11_device, supported_feature_level, &d3d11_device_context);
if (FAILED(hr)) {
return EXIT_FAILURE;
}

D3D11CreateDeviceAndSwapChain返回E_INVALIDARG时,我的代码惨遭失败。我将BufferDesc.Format更改为DXGI_FORMAT_R8G8B8A8_UNORM,函数按预期返回S_OK。为什么会这样?是DXGI_FORMAT_B8G8R8X8_UNORM被弃用还是其他超出我所知的事情?

对于 Direct3D11,应熟悉 Direct3D 硬件功能级别 - 有关一些背景,请参阅此博客文章。现代 Direct3D 仅支持一组特定的格式,用于"显示输出"(即后台缓冲区(,由D3D11_FORMAT_SUPPORT_DISPLAY指示。所有 Direct3D 11 兼容硬件(功能级别 9.1 - 12.1(都支持这些硬件:

DXGI_FORMAT_R8G8B8A8_UNORM
DXGI_FORMAT_B8G8R8A8_UNORM

使用"较旧"的演示样式时,还支持将DXGI_FORMAT_R8G8B8A8_UNORM_SRGBB8G8R8A8_UNORM_SRGB作为后台缓冲区格式,但新的翻转样式模型DXGI_SWAP_EFFECT_FLIP_*不直接支持。在这些情况下,仅为呈现器目标视图提供*_SRGB格式,而不为后台缓冲区本身提供格式。

Direct3D 硬件功能级别 10.0 或更高版本还支持:

DXGI_FORMAT_R16G16B16A16_FLOAT
DXGI_FORMAT_R10G10B10A2_UNORM

请参阅 Direct3D 11 创建设备的剖析

如果为开发计算机运行 Windows 8.1 或 Windows 10,则还应查看如何启用 DXGI 调试层,因为这将为此故障提供更多信息。

DXGI WARNING: IDXGIFactory::CreateSwapChain: Blt-model swap effects (DXGI_SWAP_EFFECT_DISCARD and DXGI_SWAP_EFFECT_SEQUENTIAL)
are legacy swap effects that are predominantly superceded by their
flip-model counterparts (DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL and DXGI_SWAP_EFFECT_FLIP_DISCARD).
Please consider updating your application to leverage flip-model swap effects
to benefit from modern presentation enhancements. More information
is available at http://aka.ms/dxgiflipmodel. [ MISCELLANEOUS WARNING #294: ]
DXGI ERROR: IDXGIFactory::CreateSwapChain: Flip model swapchains (DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL
and DXGI_SWAP_EFFECT_FLIP_DISCARD) only support the following Formats:
(DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_B8G8R8A8_UNORM,
DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_R10G10B10A2_UNORM), assuming
the underlying Device does as well.
DXGI_SWAP_CHAIN_DESC{ SwapChainType = ..._HWND, BufferDesc = DXGI_MODE_DESC1{Width = 800, Height = 600, RefreshRate = DXGI_RATIONAL{ Numerator = 0, Denominator = 0 }, Format = B8G8R8X8_UNORM, ScanlineOrdering = ..._UNSPECIFIED, Scaling = ..._UNSPECIFIED, Stereo = FALSE }, SampleDesc = DXGI_SAMPLE_DESC{ Count = 1, Quality = 0 }, BufferUsage = 0x20, BufferCount = 2, OutputWindow = 0x0023094C, Scaling = ..._STRETCH, Windowed = TRUE, SwapEffect = ..._FLIP_DISCARD, AlphaMode = ..._IGNORE, Flags = 0x0 }[ MISCELLANEOUS ERROR #101: ]

现在我从未在 Direct3D 中编码,但我看到的方式是通用的。

根据 MSDN 的说法,D3DFMT_X8R8G8B8是一种 32 位 RGB 像素格式,其中每种颜色保留 8 位。这意味着没有字母,不使用第一个字节。

您选择的对应项在这方面是相似的 - 没有阿尔法。MSDN:一种四分量的 32 位无符号规范化整数格式,每个颜色通道支持 8 位,未使用的 8 位。

后一种格式实际上不是对应格式,因为它将颜色放置在不同的字节中,但只要正确渲染所有纹理,这并不重要。

我认为问题在于您的硬件不支持非 alpha 格式。您是否尝试在同一硬件上运行旧代码?您确定旧的DX3D不会静默添加alpha通道吗?通常,API 会要求驱动程序提供支持的格式,并尝试与您的格式匹配。失败时,它会产生这样的错误。此外,某些驱动程序不接受硬件缓冲区的非 alpha 格式。这就是 R8G8B8A8 格式起作用的原因,因为它支持 alpha 通道。

相关内容

最新更新