Совместное использование буфера кадров OpenGL / буфера рендеринга между двумя приложениями - PullRequest
9 голосов
/ 17 июня 2011

Допустим, у меня есть приложение A, которое отвечает за рисование материала на экране с помощью библиотеки OpenGL. В целях тесной интеграции я хотел бы позволить этому приложению A выполнять свою работу, но выполнять рендеринг в FBO или непосредственно в буфере рендеринга и разрешать приложению B иметь доступ только для чтения доступа к этому буфер для обработки отображения на экране (в основном это рендеринг в виде 2D-текстуры).

Похоже, что FBO принадлежат контекстам OpenGL, и контексты не могут использоваться совместно между процессами. Я определенно понимаю, что позволить нескольким процессам связываться друг с другом в одном контексте - зло. Но в моем конкретном случае я думаю, что разумно думать, что это может быть довольно безопасно.

ПРИМЕЧАНИЕ:

Приложение A - это QApplication, а приложение B - это native win32 один

РЕДАКТИРОВАТЬ:

Размер рендера почти на весь экран, я думал о буфере 2048x2048 32bits (сейчас я не использую альфа-канал, но почему бы не последний).

Ответы [ 2 ]

3 голосов
/ 17 июня 2011

Framebuffer Объекты не могут быть разделены между контекстами OpenGL, будь то, что они принадлежат одному и тому же процессу или нет. Но текстуры могут совместно использоваться , а текстуры могут использоваться как прикрепление цветового буфера к объектам кадрового буфера.

Совместное использование контекстов OpenGL между процессами действительно возможно, если графическая система предоставляет API для этой работы. В случае X11 / GLX возможно разделить контексты косвенного рендеринга между несколькими процессами. Это может быть возможно в Windows, если использовать несколько действительно грубых хаков. MacOS X, не знаю, как это сделать.

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

0 голосов
/ 17 июня 2011

В моем понимании вы не сможете обмениваться объектами между процессами в Windows, если это не объект режима ядра.Даже общие текстуры и контексты могут создавать проблемы с производительностью, и это дает вам дополнительную ответственность за синхронизацию вызовов SwapBuffer ().Особенно под платформой Windows реализация OpenGL печально известна.

По моему мнению, вы можете ретранслировать механизмы межпроцессного взаимодействия, такие как события, мьютекс, оконные сообщения, каналы для синхронизации рендеринга.но просто поймите, что при подходе к этому подходу нужно учитывать производительность.Объекты режима ядра хороши, но каждый раз переход к ядру обходится в 100 мс.Что чертовски дорого для высокопроизводительного приложения рендеринга.На мой взгляд, вы должны пересмотреть дизайн многопроцессорного рендеринга.

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