Во время разработки своего движка я пытаюсь реализовать функцию, которая позволяет выполнять «горячую» замену между OpenGL и DirectX. В настоящее время я тестирую платформу 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 кадров в секунду (VSYNC)
- Вернитесь к OpenGL, снова рендеринг со скоростью 150 кадров в секунду (не более)
Существуют и другие сценарии, в которых OpenGL выполняет рендеринг со скоростью более 150 кадров в секунду, поэтому вызовы рендеринга выполняются правильно.
Я предполагаю, что переключение буферов как-то не работает, однако SwapBuffers
все равно возвращает TRUE
.
Я пробовал использовать SaveDC
и RestoreDC
до и после использования DirectX, теперь это привело к решению.
Использование wglSwapLayerBuffers
вместо SwapBuffers
не дает никаких изменений.
Могу я каким-то образом восстановить HWND или HDC в исходное состояние, или вы, ребята, знаете, почему это могло произойти?