Могу ли я запустить GLU (OpenGL) на безголовом сервере?

мы пытаемся использовать функции тесселяции GLU на безголовом сервере GNU/linux. Мы хотели бы использовать PyOpenGL для этого, но проблема в том, что он сбой при вызове gluNewTess (ошибка сегментации)

gdb backtrace говорит об этом в glGetError, что заставляет меня думать, что для тестеляции GLU нужен контекст GL? Или это просто какая-то сложность в PyOpenGL?

Я попытался найти некоторую информацию о том, как инициализировать GL-контекст на безголовой (и виртуализированной) машине, не повезло. Любая информация по этим темам приветствуется.

Ответ 1

простой:

Xvfb :5 -screen 0 800x600x24 &
export DISPLAY=:5
glxgears 

вместо glxgears, замените вашу программу и вставьте в свой код python 'glutInit()', чтобы получить базовое окно GL.

сложнее:

перепишите свою программу для создания контекста GL, используя библиотеку OSMesa

труднее:

вырвите кишки из тестезера GLU и вставьте его в свой проект (загрузите исходный код MesaLib)

Ответ 2

Вы можете выполнять рендеринг за пределами экрана. Подробнее об этом здесь.

Это зависит от вашей графической карты и ОС. Если у вас есть старый графический чип, вы можете использовать библиотеку mesa OS (но вы получаете рендеринг программного обеспечения). Если он новее, вы можете использовать pbuffers.

Ответ 3

Большинство опций на VJovic не ускоряются с аппаратным ускорением, и все они устарели в пользу расширения объекта OpenGL Framebuffer (обратите внимание на дату: 1997!). Кроме того, внеэкранная рендеринг - это не все решение, как отметил Calvin1602, вам нужен контекст openGL (кроме OSMesa, который использует рендеринг программного обеспечения).

Наша исследовательская лаборатория делает безгонный рендеринг рендеринга в течение года (вы можете увидеть мой связанный с этим вопрос о сервере здесь), и мы обнаружили, что проще всего было просто дайте пользователям удаленный доступ к локальному X-экрану сервера. Недостатки: (a) предоставление удаленного доступа к x-серверу рассматривается некоторыми как плохая практика безопасности, если это сделано неправильно, и (b) он открывает окно фиктивного окна, которое появляется на дисплее сервера, но если оно безголовое, это не имеет значения. Несколько других параметров описаны в ссылке ServerFault, если вам интересно.

Вам нужен x-screen, работающий на сервере, и следует отметить, что некоторые видеокарты требуют подключения физического монитора, если вы хотите запустить x-экран. Драйвер NVidia позволяет обойти это, используя параметр ConnectedMonitor в xorg.conf.. Другим вариантом, который я использовал в прошлом, является сборка фиктивного монитора., что заставляет систему думать, что подключен монитор CRT. Есть, вероятно, другие решения.

Удачи!

https://serverfault.com/questions/186805/remote-offscreen-rendering

Ответ 4

GLU требует действительного контекста openGL, да (даже если вы можете вызвать тесселятор только с контекстом).

Если у вас нет окна, это должно быть возможно - но сложно. См. opengl wiki (и прочитайте его 3 раза, это довольно сложно).

Основная идея заключается в том, что для создания специального контекста без окон вам нужно специальное расширение. Таким образом, вы должны вызвать wglGetExtensionsStringARB для получения этого расширения. Но, чтобы иметь возможность назвать это, у вас должен быть контекст в первую очередь! (да, это кошмар. У меня есть тот, кто создал этот апи). Так что создайте контекст обычным способом (и надейтесь, что он работает, даже если у вас нет экрана), получите расширение, вызовите wglCreateContextAttribsARB

Примечание: спецификация расширения говорит, что When this extension is supported, calling wglCreateContext(hdc) is equivalent to calling wglCreateContextAttribs(hdc,0,NULL), может быть, возможно, вы могли бы сделать ставку вместе с простым созданием контекста.

Ответ 5

Я использую glu tesselator без контекста OpenGL некоторое время, это работает на Windows и Linux (а не на python, но на С++), поэтому теоретически это возможно. Если вы установите обратные вызовы ошибок в gluTessCallback() см. Красную книгу, вероятно, он не будет вызывать glGetError.