使用 DirectX 11 后重置窗口

Posted

技术标签:

【中文标题】使用 DirectX 11 后重置窗口【英文标题】:Resetting window after using DirectX 11 【发布时间】:2014-01-05 23:52:19 【问题描述】:

我编写了一个应用程序,它可以在 OpenGL、DirectX 9 和 DirectX 11 之间切换以进行渲染,而无需重新启动或重新创建窗口。在 OpenGL 和 DirectX 9 以及 DirectX 11 模式之间切换效果很好,但是在使用 DirectX 11 后,其他渲染模式不再起作用。

在释放所有 DirectX 11 接口后,窗口仍然显示最后渲染的帧,甚至在调整窗口大小时正确更新。可以创建 DirectX 9 设备并且 Present 调用成功,但是,我看到的只是 DirectX 11 绘制的最后一帧。

我已使用 IDXGIDebug::ReportLiveObjects 来确保所有 DirectX 11 接口都已实际发布。我也尝试过 IDXGIFactory::MakeWindowAssociation,但没有解决问题。

为什么要重绘最后一帧,谁重绘了它?如何摆脱它并恢复窗口的原始行为。

顺便说一句,创建一个新窗口是一种解决方法,但我想为 DirectX 9/11 和 OpenGL 使用相同的窗口。

【问题讨论】:

最后一帧归Desktop Window Manager所有。你确定你所有的东西都没有绑定吗?另外,你试过reporting live D3D objects(不仅仅是DXGI)吗?窗口解除关联的正确过程应该是:从管道中解绑交换链渲染目标视图(全部设置为NULL),释放交换链渲染目标视图,释放交换链,刷新上下文,释放上下文,释放设备。 感谢您的提示。我会检查并告诉你结果。 ID3D11Debug::ReportLiveDeviceObjects 返回与 IDXGIDebug::ReportLiveObjects 相同的接口。 IDXGIDebug 是从设备中查询的,因此它会增加设备的引用计数。不使用 ID3D11Debug 时,ReportLiveObjects 没有列出任何对象,所以我相信我已经释放了所有对象。尽管如此,原来的问题仍然存在。 好的,我发现问题只出现在 DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL 上。我修改了一个简单的 Microsoft DX11 示例应用程序,使用 DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL 时遇到了同样的问题:即使调用了清理方法,它仍然显示最后渲染的帧。 【参考方案1】:

问题的原因是 DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL。 http://msdn.microsoft.com/en-us/library/windows/desktop/hh706346(v=vs.85).aspx 说

当您使用翻转模型时,只有运行时传递给 DWM 的翻转模型交换链中的 Direct3D 内容可见。运行时忽略所有其他 bitblt 模型 Direct3D 或 GDI 内容更新。

这解释了为什么在翻转顺序模式下使用 DirectX 11 后使用 DirectX 9 没有得到任何输出。

【讨论】:

这正是我今天遇到的问题。您是否找到了仍然使用 DXGO_SWAP_EFFECT_FLIP_SEQUENTIAL 并且仍然设法切换到 OpenGL 的任何解决方案?还是您仍然可以恢复 HWND 以使用 GDI 而不是 DWM 管理的? 我只是创建了一个子窗口并在使用 DirectX 11 后将其删除。

以上是关于使用 DirectX 11 后重置窗口的主要内容,如果未能解决你的问题,请参考以下文章

使用 Direct 3D (C++) 的 DIrectX 11 2D 游戏引擎

例外“纹理不能为空”Direct X.

c++ - Win32 窗口在第一次绘制后冻结(directx 11)

魔兽世界如何才能启用DIRECTX11

C++ DirectX11 窗口颜色不变

DirectX11 2 窗口渲染