Что общего между контекстами OpenGL и как включить совместное использование - PullRequest
2 голосов
/ 28 апреля 2019

Я создаю программное обеспечение САПР, которое будет создавать различные контексты OpenGL для одинакового представления (если они не показывают одно и то же).

Я хотел бы разделить как можно больше данных между этими контекстами OpenGLособенно VBO и шейдеры.

Я хочу знать что я могу поделиться и как я делюсь ими, кросс-платформенным способоми возможно с простым OpenGL 3.2 (без двигателя).

Ответы [ 2 ]

3 голосов
/ 28 апреля 2019

Контекст OpenGL может делиться только объектами.И даже тогда объекты-контейнеры не могут быть общими.Контейнерные объекты - это объекты, основной целью которых является присоединение к ним других объектов.В частности, следующие объекты-контейнеры:

  • объекты Framebuffer
  • объекты массива вершин
  • объекты преобразования обратной связи
  • объекты программного конвейера

Все остальные объекты могут быть общими.

Совместное использование объектов - это контекстно-зависимая задача, обычно выполняемая как часть создания контекста или сразу после него.Однако, поскольку это делается для самого контекста, не может быть кроссплатформенной операцией.OpenGL определяет только поведение контекста, а не то, как манипулировать объектом контекста.Специфичные для платформы API, отвечающие за создание и управление контекстами, обрабатывают это: GLX, WGL, EGL и т. Д.

Как правило, это обрабатывается двумя способами.Один из способов заключается в том, чтобы функция создания контекста принимала другой контекст в качестве параметра;Вновь созданный контекст поделится всеми разделяемыми объектами с данным контекстом.wglCreateContextAttribsARB - это функция создания контекста WGL, которая использует контекст для совместного использования с новым.

Другими способами является использование функции сразу после создания контекста.Эта функция принимает два контекста и разделяет объекты между ними.Однако вы должны использовать такую ​​функцию сразу после создания контекста;Вы не хотите создавать объекты в контексте назначения, которые могут конфликтовать с теми, которые уже есть в источнике.WGL имеет более старую функцию, wglShareLists, которая разделяет объекты между контекстами.Я знаю, что он говорит только о списках отображения, но он разделяет все разделяемые объекты.

1 голос
/ 28 апреля 2019

Я создаю программное обеспечение САПР, которое будет создавать различные контексты OpenGL для одинакового представления (если они не показывают одно и то же).

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

Я хочу знать, чем я могу поделиться и как я делюсь ими, кросс-платформенным способом

В общем случае все объекты, содержащие данные (текстуры, объекты вершин / пикселей / элементов, объекты рендеринга), являются общими, а объекты, которые содержат состояние (объект массива вершин, объект фреймбуфера), не являются.

Совместное использование настраивается в Windows либо посредством вызова wglShareLists для подключения вновь созданного контекста к ранее существующим.Или передавая дескриптор в контекст, чтобы поделиться с wglCreateContextAttribsARB;однако, чтобы получить указатель на эту функцию, сначала необходимо создать прокси-контекст (для этого требуется выполнить несколько прыжков, что я реализовал в https://git.datenwolf.net/wglarb/, поэтому вы можете просто вызвать wglarb_CreateContextAttribsARB, не заботясь оостальные).

В среде X11 / GLX совместное использование контекста всегда настраивалось во время создания контекста, практически идентично способу wglCreateContextAttribsARB с использованием glXCreateContext

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...