Я пытаюсь разработать модуль Apache2, который использует OpenGL для выполнения закадрового рендеринга и динамического генерирования изображений, которые затем я могу отправить обратно клиенту.
Apache2 работает на компьютере с Ubuntu 12.04, и я создал тестовый модуль, который рендерит четырехугольник и сохраняет фрейм как изображение на диск, используя OpenGL / GLX. Но когда модуль получает запрос клиента, он падает на XOpenDisplay(0)
с ошибкой сегментации. Есть идеи, что может пойти не так?
Редактировать:
Все примеры, которые я видел, говорят об использовании пиксельного буфера (PBuffer). Насколько я знаю, они устарели и вместо них следует использовать FBO. Может кто-нибудь объяснить, как создать контекст и использовать FBO для выполнения закадрового рендеринга?
Хотя технически это вполне возможно сделать без окон, отображать сервер с меньшим ускорением рендеринга вне экрана с помощью графического процессора с помощью OpenGL, в наши дни это практически невозможно, потому что вам нужна среда отображения, чтобы фактически получить доступ к графическому процессору. К счастью, в наши дни структура графических систем меняется (гибридная графика, дисплейные композиторы). В Mesa уже есть режим создания контекста вне экрана (OSMesa), но он еще далеко не завершен.
Так что сейчас вам понадобится какой-нибудь сервер отображения, который можно будет использовать для привязки контекста. X11 предлагает два вида графических ускорителей: Windows и PBuffers. Вы можете использовать FBO с любым (PBuffers технически Windows, которые не могут быть сопоставлены с корневым окном и имеют закадровый холст). Самый простой способ — создать обычное окно на X-сервере, но не показывать его; вы все равно можете создать контекст OpenGL и создать FBO, как показано в многочисленных руководствах. Но чтобы OpenGL работал на используемом вами X-сервере, он должен быть активным, удерживать консоль и быть настроенным на использование графического процессора (теоретически для более новых X-серверов и драйверов с гибридной графикой должна быть возможность настроить X-сервер на использование фиктивного устройства отображения и настроить GPU как вторичное устройство для ускоренного рендеринга, но я никогда этого не пробовал).
Других решений пока нет …