Могу ли я запустить GLU (OpenGL) на автономном сервере? - PullRequest
11 голосов
/ 08 июня 2011

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

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

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

Ответы [ 6 ]

10 голосов
/ 22 января 2012

просто:

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

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

сложнее:

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

harddest:

вырвать кишки из тесселятора GLU и вставитьэто в вашем проекте (скачать исходный код MesaLib)

2 голосов
/ 13 января 2012

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

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

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

Удачи!

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

1 голос
/ 04 ноября 2018

Я экспериментировал с этим, и да, похоже, что вы можете.Мне удалось заставить его работать под Docker.

Для меня хитрость заключалась в следующем:

RUN apt-get update && apt-get -y install libgl1 freeglut3-dev xvfb
RUN pip install -r requirements.txt
ENTRYPOINT xvfb-run -s '-screen 0 1024x768x24' ./main.py

Обратите внимание, что это позволяет только программный рендеринг - хотя это может быть достаточно длямой проект, это может быть не для вас.

1 голос
/ 10 февраля 2014

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

1 голос
/ 08 июня 2011

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

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

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

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

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

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

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

...