Стратегия совместного использования ресурсов OpenGL - PullRequest
6 голосов
/ 05 декабря 2010

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

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

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

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

Спасибо, Cam

1 Ответ

12 голосов
/ 05 декабря 2010

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

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

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

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

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

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

Edit:

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

...