首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >确定支持哪种交换链格式

确定支持哪种交换链格式
EN

Stack Overflow用户
提问于 2020-07-30 19:34:14
回答 1查看 1.2K关注 0票数 2

当使用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):

代码语言:javascript
运行
复制
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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-30 21:18:31

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

代码语言:javascript
运行
复制
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_FLOATDXGI_FORMAT_R10G10B10A2_UNORM

如果您使用的是“遗留”交换效果,还可以依赖所有支持Direct3D和DXGI_FORMAT_B8G8R8A8_UNORM_SRGB的硬件功能级设备进行交换链。对于DirectX 12所需的现代交换效果,以及DirectX 11在Windows 10中推荐的效果(参见这篇博客文章),不是用_SRGB创建的,而是使用它创建呈现目标视图。

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

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

https://stackoverflow.com/questions/63180144

复制
相关文章

相似问题

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