Directx 11 前缓冲器

Posted

技术标签:

【中文标题】Directx 11 前缓冲器【英文标题】:Directx 11 Front Buffer 【发布时间】:2013-08-29 19:42:08 【问题描述】:

我希望这是一个我找不到答案的简单问题的简单答案。

如何在 Directx 11 / DXGI 中访问前端缓冲区?我在 Directx 9 中发现您可以使用 GetFrontBufferData() 并且您可以在 Directx 11 中使用 GetBuffer() 来访问后台缓冲区,但这存在问题。后缓冲区没有前缓冲区所做的计算。

所以我想知道我是否缺少某些东西。

我可以尝试使用 GetDisplaySurfaceData,除非我误解了某些内容,否则它不会工作,因为我并不总是处于全屏模式。

编辑:有人可以告诉我 GetBuffer 在 Directx 11 的 SwapChain 中是如何工作的。正如我所读到的,抗锯齿只发生在前缓冲区而不是后缓冲区。 0 是第一个后备缓冲区吗? (Microsoft 声明您只能在某些情况下使用 0。)

是否有可能在 Directx 11 中获得 Front Buffer?

非常感谢,

【问题讨论】:

为什么需要前端缓冲区?除了 AA 之外,几乎所有可以执行的渲染操作都是在后台缓冲区中完成的。 因为我想要AA。 创建交换链时,您可以指定多重采样,这将允许您打开 MSAA。如果您不想要 MSAA,您可以在不进行多重采样的情况下创建交换链,并将 AntialiasedLineEnable 在设备的光栅化器状态下设置为 true。如果这些都不适合您,请禁用自动抗锯齿,渲染整个场景,然后获取后台缓冲区并通过自定义着色器执行 AA。除此之外,您无能为力。请参阅the community content here 了解更多信息。 【参考方案1】:

您需要使用IDXGISwapChain::GetBuffer API 来检索交换链表面(使用 uuid ID3D11Texture2D 作为结果类型)。

现在,交换链缓冲区不可映射,因此您需要将其复制到暂存资源。

使用ID3D11Texture2D::GetDesc 检索表面描述 使用D3D11_USAGE_STAGING 用法和D3D11_CPU_ACCESS_READ 的cpu 访问标志对其进行修补 创建一个临时表面ID3D11Device::CreateTexture2D 复制到暂存界面ID3D11DeviceContext::CopyResource

您现在有一个 ID3D11Texture2D 与您的交换链缓冲区的内容,允许您使用 ID3D11DeviceContext::Map API 在 CPU 上读取它

【讨论】:

据我所知,这是后台缓冲区,还是我弄错了。如果那不是后备缓冲区,那么后备缓冲区在哪里? DXGI 无法访问前端缓冲区。很少直接渲染到后台缓冲区并让交换链解决多重采样。创建一个单样本交换链和一个额外的多样本帧缓冲区,然后调用ID3D11DeviceContext::ResolveSubresource 将样本合并到后台缓冲区,然后按照我的解释在演示前转储它。 在阅读微软时,它指出只有 FrontBuffer 已抗锯齿。这不再是真的了吗? 交换链能够为您将多样本后缓冲区解析为单个样本前缓冲区,并且还可以进行一些缩放以使图像适合窗口。当您依赖自动服务时,通常会失去控制。这就是您自己做事的原因,它可以让您在ResolveSubresource 调用之后渲染一些非抗锯齿表面,例如 2D 界面,或者使用带有自定义着色器的手动全屏四边形来根据需要合并片段。

以上是关于Directx 11 前缓冲器的主要内容,如果未能解决你的问题,请参考以下文章

将 FBX 顶点和索引缓冲区导入 DirectX 11

C++ DirectX 11 从第二个顶点缓冲区渲染问题

在 DirectX 11 中使用索引缓冲区;它是怎么知道的?

DirectX 11 中是不是可以有 SoA 顶点缓冲区?

对于 DirectX 11,我不能在每个渲染()中计算缓冲区吗?

使用 DirectX11 更新非 UI 线程中的顶点缓冲区