Во время разработки моего движка я пытаюсь реализовать функцию, которая позволяет осуществлять горячую замену между OpenGL и DirectX. В настоящее время я тестирую на платформе Win32 и столкнулся со следующей проблемой:DirectX to OpenGL hot-swap, не отображается в окне Win32
Я реализовал оба средства визуализации (OpenGL 3.0 и Direct3D11), оба работают отлично в одиночку. Механизм замены:
Уничтожьте текущий контекст рендеринга и создайте новый. Например: Отпустите все объекты DirectX, а затем создайте контекст OpenGL через WGL. Я пытаюсь реализовать это, используя только одно окно (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 кадров в секунду
- Переключить DirectX, рендер с 60 кадров в секунду (ВСИНХ)
- своп обратно в OpenGL, рендеринг снова с 150 fps (не более)
Существуют и другие сценарии, в которых OpenGL отображает более 150 кадров в секунду, поэтому вызовы рендеринга выполняются должным образом.
Я предполагаю, что перелистывание буферов не работает, но SwapBuffers
возвращает TRUE
в любом случае.
Я попытался использовать SaveDC
и RestoreDC
до и после использования DirectX, в результате получилось решение.
Использование wglSwapLayerBuffers
вместо SwapBuffers
не дает никаких изменений.
Могу ли я каким-то образом восстановить HWND или HDC в исходное состояние, или вы, ребята, не знаете, почему это может произойти?