Я пытаюсь разработать модуль Apache2, который использует OpenGL для выполнения рендеринга вне экрана и динамического создания изображений, которые затем я могу отправить обратно клиенту.
Apache2 работает на машине Ubuntu 12.04, и я создал тестовый модуль, который отображает квад и сохраняет кадр как образ на диск с использованием OpenGL/GLX. Но когда модуль получает запрос клиента, он сбой при XOpenDisplay(0)
с ошибкой сегментации. Любые идеи, что может пойти не так?
Изменить: все примеры, которые я видел, говорят об использовании пиксельного буфера (PBuffer). Насколько я знаю, они устарели, и вместо этого следует использовать ФБО. Может ли кто-нибудь объяснить, как создать контекст и использовать FBO для выполнения рендеринга вне экрана?
В то время как технически это вполне возможно сделать без окон, отображать сервер за вычетом ускоренного рендеринга с помощью графического процессора с OpenGL, практически это невозможно в наши дни, потому что вам нужна среда отображения, чтобы фактически получить доступ к графическому процессору. К счастью, структура графических систем меняется в эти дни (гибридная графика, дисплеи). Уже Mesa предоставляет режим создания внеэкранного контекста (OSMesa), но это далеко не полный набор функций.
Поэтому прямо сейчас вам понадобится какой-то сервер отображения, пригодный для работы, с которым вы можете привязать контекст. X11 предлагает два вида графических ускорителей: Windows и PBuffers. Вы можете использовать FBOs с помощью (PBuffers - это технически Windows, которые не могут быть сопоставлены с корневым окном и иметь экранный холст). Самый простой способ - создать регулярное окно на X-сервере, но не показывать его; вы все равно можете создать контекст OpenGL и создать FBOs, как показано в многочисленных руководствах. Но для OpenGL для работы X-сервер, который вы используете, должен быть активным, удерживать консоль и настраиваться на использование графического процессора (теоретически с новыми X-серверами и драйверами с гибридной графикой, которые должны быть доступны, чтобы настроить X-сервер на использование фиктивного устройства отображения и сконфигурируйте GPU как вторичное устройство для ускоренного рендеринга, но пока я этого не делал).
XOpenDisplay()
всегда дает сбой. Я попытался передатьNULL
чтобы получить число из переменной среды, но все равно не получается. Я протестировал запуск Apache2 из командной строки как единый процесс, чтобы я мог контролировать вывод на консоли.-auth …
чтобы указать путь к месту размещения данных авторизации (где-то в/var/run
или около того) и сделать их читаемыми процессом веб-сервера. Затем установите для переменной среды XAUTHORITY этот путь.