Проблемы создания независимых OpenGL Viewports

Цель:

В моем приложении я пытаюсь реализовать несколько окон просмотра, чтобы позволить пользователю просматривать сцену с разных точек зрения. Каждый из моих окон просмотра должен иметь возможность переключения между каркасом, затенением, освещением и т. Д. В настоящее время я могу выполнять рендеринг с разных точек зрения в каждом окне просмотра, но у меня есть проблемы.

Проблема:

Когда я пытаюсь установить различные настройки, такие как glPolygonMode () или же qglClearColor () в любой видовой экран, эти настройки кажется, относятся только к один видовой экран, как правило, самый последний видовой экран, который был создан. это не проблема сигналов / слотов, поскольку эти соединения обрабатываются внутри каждого виджета и не могут быть перепутаны между виджетами.

Попытки решить проблему:

Поскольку я использую Qt в качестве библиотеки для управления всеми связанными с пользовательским интерфейсом вещами, я уверен, что Qt позаботился о многих вещах для создания и настройки каждого экземпляра OpenGL для меня, поэтому могут быть вещи, которые я ‘ м с видом, о котором я не знаю.

Я проверил конструкторы, доступные для QGLWidgets, и увидел, что QGLWidget может принимать другой QGLWidget как «sharedwidget», а также объект QGLContext.

  • В настоящее время я использую маршрут «sharedwidget», потому что без него по какой-то причине я не могу связать текстуры для более чем 1 области просмотра. Однако это не решает проблему невозможности переключения между каркасным или затененным в каждом экземпляре QGLWidget.
  • Я также попробовал маршрут QGLContext. По умолчанию каждый QGLWidget
    в любом случае создает новый контекст, но при попытке назначить новый или
    разделяя один и тот же контекст между всеми ними, я бы просто получил проблемы
    с моими шейдерами, не связывающимися (я полагаю, что
    в этом случае вызывается), что приводит к сбою каждый раз, когда контекст передается другому QGLWidget:

ASSERT: «QOpenGLFunctions :: isInitialized (d_ptr)» в файле
C: \ работа \ сборка \ qt5_workdir \ ш \ s \ qtbase \ включить \ QtGui ../../ SRC / GUI / OpenGL / qopenglfunctions.h,
линия 2018

Подробности:

В настоящее время мое приложение имеет следующую иерархию:

  • заявка
    • Окно
      • ViewportWidget [динамический массив]
        • QGLWidget (пользовательский вариант)

Единственное, что нужно предоставить каждому QGLWidget, — это указатель на текущую «карту», ​​чтобы каждый мог отобразить карту на основе любых настроек, заданных в экземпляре этого конкретного виджета.

Я выполняю следующие функции для настройки области просмотра:

  • Я создаю новый ViewportWidget, создаю его родительский элемент и добавляю его в соответствующий фрейм и макет. Если область просмотра не первая, то она также передает самый первый QGLWidget для использования в качестве «sharedwidget»
  • Затем область просмотра создает QGLFormat с интервалом обмена 1 и передает указанный формат в конструктор нового QGLWidget.
  • Затем я вынужден вызвать «makeCurrent ()» для области просмотра, в противном случае я получаю сбой по причине:

ASSERT: «false» в файле qgl.cpp, строка 122

Возможно ли даже иметь отдельные QGLWidgets с разными «polygonMode» или «clearColor»? Я просто волнуюсь, что делаю что-то не так, что позже укушу меня в задницу, чего я хочу избежать.

0

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы [email protected]