Стратегия совместного использования ресурсов OpenGL

Я создаю CAD-подобное приложение (на основе Qt), это будет интерфейс с несколькими документами, и каждый документ будет содержать около 5 окон просмотра (полученных из QGLWidget). Таким образом, мне нужно, чтобы мой плоский шейдер был общим для всего приложения, а затем 3D-ресурсы (модели, хранящиеся в виде VBO) были общими для каждого документа, то есть для 5 окон просмотра.

Я думал, что пока я делюсь шейдерной программой и адресами VBO GLuint, все будет работать автоматически, но это не так. Я думаю, потому что у каждого окна просмотра/контекста есть свое адресное пространство на видеокарте, если кто знает лучше, сообщите!

Я хотел бы, чтобы шейдер скомпилировался при запуске приложения, но это оказалось сложно, так как мне нужен действительный QGLWidget, чтобы заранее перевести OpenGL в действительное состояние. Но так как мне нужно совместно использовать QGLWidgets (через их конструктор), чтобы они совместно использовали ресурсы, необходимо создать и показать один из них, прежде чем можно будет создать экземпляр других. Но это крайне непрактично, поскольку пользователю нужно одновременно показывать несколько представлений.

Это должно быть проще, чем я понимаю, потому что это вряд ли новаторские вещи, но я действительно борюсь - может ли кто-нибудь указать мне правильное направление?

Спасибо, Кэм


person cmannett85    schedule 05.12.2010    source источник


Ответы (1)


Вот что делают обычные приложения CAD/MDI:

  • они создают общий контекст, который служит для совместного использования ресурсов.

  • они используют wglShareLists при создании нового контекста рендеринга OpenGL для предоставления доступа к идентификаторам ресурсов общего контекста.

wglShareLists можно использовать для совместного использования VBO, текстур, шейдеров и т. д., а не только для списков отображения (совместное использование DL — это устаревшее использование, отсюда и название функции).

Я не помню, нужно ли создавать ресурсы с общим контекстом или их можно создавать в любых контекстах.

Если вы не используете Windows, см. glXCreateContext. Это должно поставить вас на путь.

Изменить:

Я посмотрел на Qt, похоже, что он абстрагирован с членом QGLContext::create.

person Stringer    schedule 05.12.2010
comment
Отлично! QGLContext немного бесполезен сам по себе, метод create может быть запущен только после создания устройства отображения, которое в моем случае находится внутри QGLWidget. Поэтому я создам невидимый QGLWidget в качестве контекста компиляции моего шейдера, а затем передам его как аргумент const QGLWidget* shareWidget в конструктор скрытого QGLWidget документа, который содержит данные VBO, и этот виджет затем передается на видимое окно просмотра QGLWidgets. По сути, создание иерархии дерева QGLWidget. Создание невидимых компонентов графического интерфейса вряд ли можно назвать стильным, но это сэкономит много времени, когда дело доходит до переноса. - person cmannett85; 06.12.2010
comment
@cmannett85 На самом деле, это это класс, вроде: blog.qt.digia.com/blog/2011/06/03/threaded-opengl-in-4-8 - person mlvljr; 28.10.2013