首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当向后缓冲像素格式设置为DXGI_FORMAT_B8G8R8X8_UNORM时,为什么DXGI_FORMAT_B8G8R8X8_UNORM会失败?

当向后缓冲像素格式设置为DXGI_FORMAT_B8G8R8X8_UNORM时,为什么DXGI_FORMAT_B8G8R8X8_UNORM会失败?
EN

Stack Overflow用户
提问于 2019-09-27 07:06:23
回答 2查看 1.4K关注 0票数 0

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

代码语言:javascript
复制
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被反对了,还是我所不知道的其他事情?

EN

回答 2

Stack Overflow用户

发布于 2019-09-27 17:54:45

对于Direct3D 11,您应该熟悉Direct3D硬件特征级--请参阅这篇博客文章获得一些背景知识。现代Direct3D只支持由D3D11_FORMAT_SUPPORT_DISPLAY指示的“显示出”(即后台缓冲区)的一组特定格式。所有Direct3D 11兼容硬件(特性级别9.1-12.1)都支持这些功能:

代码语言:javascript
复制
DXGI_FORMAT_R8G8B8A8_UNORM
DXGI_FORMAT_B8G8R8A8_UNORM

当使用“旧的”表示样式时,DXGI_FORMAT_R8G8B8A8_UNORM_SRGBB8G8R8A8_UNORM_SRGB也被支持作为后台缓冲区格式,但是新的翻转样式模型DXGI_SWAP_EFFECT_FLIP_*不直接支持它们。在这些情况下,您只为呈现目标视图提供*_SRGB格式,而不是为后台缓冲区本身提供。

Direct3D硬件功能级别10.0或更高也支持:

代码语言:javascript
复制
DXGI_FORMAT_R16G16B16A16_FLOAT
DXGI_FORMAT_R10G10B10A2_UNORM

请参阅Direct3D 11创建装置的解剖

如果您正在为您的开发机器运行Windows8.1或Windows10,您还应该研究如何启用DXGI调试层,因为这将为此失败提供更多信息。

代码语言:javascript
复制
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: ]
票数 1
EN

Stack Overflow用户

发布于 2019-09-27 08:53:27

现在,我从未用Direct3D编写代码,但我认为这是通用的。

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

你所选的对手在这方面是相似的-没有阿尔法。MSDN:一种四分量的32位无符号归一化整数格式,支持每个颜色通道8位和未使用的8位.

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

我认为问题在于您的硬件不支持非alpha格式。你试过在同一个硬件上运行旧代码吗?您确定旧的DX3D没有静默地添加alpha通道吗?通常,API会要求驱动程序提供受支持的格式,并尝试与您的驱动程序匹配。一旦失败,就会产生这样的错误。还有一些驱动程序将不接受硬件缓冲区的非alpha格式。,这就是为什么R8G8B8A8格式能够工作,因为它支持alpha通道。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58129485

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档