2010-12-05 2 views
6

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

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

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

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

Спасибо, Cam

ответ

11

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

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

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

wglShareLists может быть использован для обмена РВЫ, текстур, шейдеров и т.д., а не только списки отображения (совместное использование списков рассылки является использованием устаревшего, отсюда и название функции).

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

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

Edit:

Я посмотрел на Qt, это выглядит, как он абстрагируется с членом QGLContext::create.

+2

Отлично! QGLContext немного изолирован, метод create может запускаться только после создания устройства отображения, которое в моем случае находится внутри QGLWidget. Поэтому я создам _invisible_ QGLWidget как мой контекст компиляции шейдеров, а затем передаю это как const QGLWidget * shareWidget arg в конструкторе скрытого QGLWidget документа, который содержит данные VBO, и этот виджет затем передается в видимый вид QGLWidgets. По существу создание иерархии дерева QGLWidget. Создание невидимых компонентов графического интерфейса вряд ли является стильным, но это сэкономит много времени, когда дело доходит до портирования. – cmannett85 2010-12-06 19:51:01

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