Проблемы создания независимых OpenGL Viewports
Цель:
В моем приложении я пытаюсь реализовать несколько окон просмотра, чтобы позволить пользователю просматривать сцену с разных точек зрения. Каждый из моих окон просмотра должен иметь возможность переключения между каркасом, затенением, освещением и т. Д. В настоящее время я могу выполнять рендеринг с разных точек зрения в каждом окне просмотра, но у меня есть проблемы.
Проблема:
Когда я пытаюсь установить различные параметры, такие как glPolygonMode() или qglClearColor() в любом окне просмотра, эти настройки применяются только к одному окну просмотра, как правило, к последнему созданному окну просмотра. Это не проблема сигналов / слотов, поскольку эти соединения обрабатываются внутри каждого виджета и не могут быть перепутаны между виджетами.
Попытки решить проблему:
Поскольку я использую Qt в качестве библиотеки для управления всеми связанными с пользовательским интерфейсом вещами, я уверен, что Qt позаботился о многих вещах для создания и настройки каждого экземпляра OpenGL для меня, так что могут быть вещи, которые я ' м с видом, о котором я не знаю.
Я проверил конструкторы, доступные для QGLWidgets, и увидел, что QGLWidget может принимать другой QGLWidget как "sharedwidget", а также объект QGLContext.
- В настоящее время я использую маршрут "sharedwidget", потому что без него по какой-то причине я не могу связать текстуры для более чем 1 области просмотра. Однако это не решает проблему невозможности переключения между каркасным или затененным в каждом экземпляре QGLWidget.
- Я также попробовал маршрут QGLContext. По умолчанию каждый QGLWidget создает новый контекст в любом случае, но при попытке назначить новый или разделить один и тот же контекст между всеми ними у меня просто возникнут проблемы с не связыванием моих шейдеров (я считаю, что слот initializeGL в этом случае не вызывается), приводя к сбою каждый раз, когда контекст передается другому QGLWidget:
ASSERT: "QOpenGLFunctions:: isInitialized (d_ptr)" в файле c:\work\build\qt5_workdir\w\s\qtbase\include\qtgui../../src/gui/opengl/qopenglfunctions.h, строка 2018
Подробности:
В настоящее время мое приложение имеет следующую иерархию:
- заявка
- Окно
- ViewportWidget [динамический массив]
- QGLWidget (пользовательский вариант)
- ViewportWidget [динамический массив]
- Окно
Единственная вещь, которой должен поделиться каждый QGLWidget, - это указатель на текущую "карту", чтобы каждый мог отобразить карту на основе любых настроек, установленных в экземпляре этого конкретного виджета.
Я выполняю следующие функции для настройки области просмотра:
- Я создаю новый ViewportWidget, создаю родительский элемент и добавляю его в соответствующий фрейм и макет. Если область просмотра не первая, она также передает самый первый QGLWidget для использования в качестве "sharedwidget"
- Затем область просмотра создает QGLFormat с интервалом обмена 1 и передает указанный формат в конструктор нового QGLWidget.
- Затем я вынужден вызвать "makeCurrent()" для области просмотра, в противном случае я получаю сбой по причине:
ASSERT: "false" в файле qgl.cpp, строка 122
Возможно ли даже иметь отдельные QGLWidgets с разными "polygonMode" или "clearColor"? Я просто волнуюсь, что делаю что-то не так, что позже укушу меня в задницу, чего я хочу избежать.