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 前缓冲器的主要内容,如果未能解决你的问题,请参考以下文章
在 DirectX 11 中使用索引缓冲区;它是怎么知道的?