2016-11-25 3 views
0

Я хочу отобразить сцену с различными точками зрения во многих QOpenGLWidget, которые находятся в одном окне (разделенные архитектурой QSplitter). Важно то, что я хочу хранить данные сцены (геометрию и текстуры) только один раз на графическом процессоре. Но каждый QOpenGLWidget имеет собственный QOpenGLContext.Глобальный контекст OpenGL для рендеринга в fbo для отображения во многих QOpenGLWidget

Моя идея состояла в создании независимого контекста, который визуализирует сцену в объекте FrameBufferObject (не QFrameBufferObject) и использует полученную текстуру в соответствующем QOpenGLWidget.

Более технически, мой подход заключался в создании нового QOpenGLContext и QOffscreenSurface. Но когда я хочу использовать полученные QOpenGLFunctions, данные моим QOpenGLContext, он останавливается с ошибкой сегментации, даже если я проверил, что мой созданный QOpenGlContext действителен.

В более общем смысле мне трудно понять роль QOpenGLContext, поверхности (QOffscreenSurface в моем случае) и функции makeCurrent.

Моя просьба - понять, что является хорошим способом сделать это и почему я получаю ошибку сегментации.

+0

Обратите внимание, что все QOpenGLWidgets в одном и том же окне верхнего уровня уже обмениваются друг с другом, поскольку они совместно используют внутренний контекст GL, используемый Qt для «компоновки» самого окна (сборка в виде 2D-текстур QOpenGLWidgets, другие виджеты и т. д.). Поэтому вам не нужно делать ничего особенного, чтобы делиться вещами между этими контекстами. Более того, есть даже флаг, чтобы эти контексты были распространены среди всех окон верхнего уровня вашего приложения. – peppe

+0

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

+0

Конечно, вы можете это сделать, если хотите. Опять же, ФБО не будут разделяться, но фоновые текстуры или рендерингбуферы будут. – peppe

ответ

0

Я возвращаюсь с ответом на свою проблему.

Фактически я использовал свой первый инициализированный контекст QOpenGLWidget как глобальный контекст, чтобы избежать создания нового.

Сложная часть - сделать глобальный контекст актуальным каждый раз, когда это необходимо (добавление данных на графический процессор или использование fbo).

Шаги paintGL просты: - Сделать глобальный контекст актуальным. - Начать запись fbo. - визуализировать сцену. - Остановите запись fbo. - Сделать контекст QOpenGLWidget текущим. - Измените результат fbo на экране.

Я проверил свою память с помощью gDEBugger, и вся моя память находится в глобальном контексте (и хранится только один раз).

 Смежные вопросы

  • Нет связанных вопросов^_^