QOpenGLWidget с общим контекстом OpenGL?

У меня есть существующий контекст OpenGL, которым я хотел бы поделиться с новым QOpenGLWidget.

Я знаю, что я могу сделать это:

  1. Создать QOpenGLWidget
  2. Подождите, пока не будет вызван initializeGL, и сохраните контекст
  3. Создайте новый QOpenGLContext и сделайте его доступным для сохраненного контекста

Тем не менее, я хотел бы сделать это в другом порядке:

  1. Создать QOpenGLContext
  2. Создайте QOpenGLWidget, предоставив существующий контекст и сделав его доступным

Это возможно?

4

Решение

Редактировать, я пока не знаю много о QOpenGLFramebufferObject, так что игнорируйте мой предыдущий контент ответа.

В QOpenGLWidget он всегда устанавливает свой контекст для совместного использования с ближайшим окном верхнего уровня (или с самим собой, если это окно). Вы правы в своем понимании того, что нет способа изменить контекст члена QOpenGLWidget без его подкласса, чтобы полностью изменить его работу. В функции QOpenGLWidgetPrivate :: initialize () контекст инициализируется из defaultFormat и из shareContext верхнего уровня. Если вы хотите работать с контекстом перед созданием QOpenGLWidget, тогда он должен быть через глобальный общий контекст. Qt :: AA_ShareOpenGLContexts необходимо установить перед созданием вашего объекта QGuiApplication.

Вам нужно подождать, пока QGuiApplication инициализирует глобальный контекст, прежде чем пытаться получить к нему доступ. Поскольку global_share_context является статическим членом класса QOpenGLContext, вы можете просто создать любой QOpenGLContext и получить к нему доступ через context.globalShareContext (). Затем просто удалите исходный QOpenGLContext. Любой созданный вами QOpenGLWidget автоматически поделится этим контекстом. Если вы можете найти способ получить указатель на глобальный общий контекст до того, как создадите () свой специальный контекст, то вы можете просто поделиться с глобальным контекстом, и вы готовы к этому, поскольку совместное использование происходит в обоих направлениях. Совместное использование осуществляется через всю группу общих контекстов, которые совместно используются друг с другом, поэтому любое совместное использование с одним контекстом совместно используется всей группой.

Кроме того, я не знаю, если это что-то меняет, кроме QOpenGLContext говорит, что может делиться объектами фреймбуфера тоже.

2

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

Других решений пока нет …

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