在我的引擎开发过程中,我试图实现一个功能,可以实现OpenGL和DirectX之间的热插拔。目前我在Win32平台上测试,遇到以下问题:DirectX到OpenGL的热插拔,不会显示在Win32窗口
我实现了两个渲染器(OpenGL 3.0和Direct3D11),两者都很好地工作。交换机制如下:
销毁当前渲染上下文,并建立新的上下文。例如:发布所有DirectX对象,然后通过WGL创建OpenGL上下文。我试图实现这一点,只使用一个窗口(HWND)。
从OpenGL 3.0切换到DirectX11的作品。 (破坏OpenGL后,DirectX渲染正常)
销毁OpenGL,然后再次重新创建OpenGL,起作用。与DirectX一样。
当我试图从DirectX切换到OpenGL时,窗口将停止显示新绘制的内容,只显示最后绘制的DirectX帧。
为了构建OpenGL上下文,我使用了WGL。该窗口的类是使用CS_OWNDC
样式创建的。我使用SwapBuffers
来翻转窗口缓冲区。在设置上下文之前,我使用SetPixelFormat
以及以前从ChoosePixelFormat
返回的值。创建的上下文是版本3.0,通过wglCreateContextAttribsARB
确保。
其他信息:
所有的DirectX引用被释放,这是通过调用ReportLiveDeviceObjects
和检查ID3D11Device1::Release
返回值检查(0)。调用ID3D11DeviceContext1::ClearState
和Flush
以确保对象被破坏。
没有一个OpenGL方法通过glGetError
报告错误,每次调用后都会检查这个错误。这对所有操作系统和WGL调用都是一样的。
OpenGL的渲染调用执行如预期,例如:
- 的OpenGL用150 fps的渲染
- 交换到DirectX,渲染60帧(VSYNC)
- 交换回OpenGL中,渲染再次以150 fps(不多于)
还有其他场景,其中OpenGL渲染超过150帧/秒,所以渲染调用正常执行。
我的猜测是缓冲区的翻转并不起作用,但SwapBuffers
无论如何返回TRUE
。
我在使用DirectX之前和之后尝试使用SaveDC
和RestoreDC
,这导致了现在的解决方案。
使用wglSwapLayerBuffers
而不是SwapBuffers
没有改变。
我可以以某种方式恢复HWND或HDC到原始状态,或者你们有什么想法,为什么会发生这种情况?