Can I run GLU (OpenGL) on a headless server?

我们两清 提交于 2019-12-05 16:14:50

问题


we're trying to use GLU's tesselation functions on a headless, GNU/linux server. We'd like to use PyOpenGL for that, but the problem is that it crashes on a call to gluNewTess (Segmentation fault)

gdb backtrace says it's in glGetError, that makes me think that GLU tesselation needs a GL context? Or is it just some intricacy in PyOpenGL?

I tried to find some information on how to initialize GL context on a headless (and virtualized) machine, no luck. Any information on these topics is appreciated.


回答1:


easiest:

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

instead of glxgears, replace with your program, and stick a 'glutInit()' into your python code to get a basic GL window.

harder:

rewrite your program to create an GL context using the OSMesa library

hardest:

rip the guts out of the GLU tesselator and stick it in your project (download the MesaLib source code)




回答2:


Most of the options at VJovic's link aren't hardware accelerated and all of them are deprecated in favor of the OpenGL Framebuffer Object extension (Notice the date: 1997!). Also, offscreen rendering isn't the whole solution, as Calvin1602 noted, you need an openGL context (except for OSMesa, which uses software rendering).

Our research lab has been doing headless opengl rendering for about a year (you can see my related serverfault question here), and we found that the easiest thing was to just give users remote access to the server's local X-screen. The downsides: (a) giving remote access to the x-server is regarded by some as a bad security practice if done wrong, and (b) it opens a dummy window will pop up on the server's display, but if it's headless, this shouldn't matter. A few other options are described in the ServerFault link too, if you're interested.

You need an x-screen running on the server, and it should be noted that some video cards require a physical monitor to be attached if you want to start an x-screen. The NVidia driver lets you get around this using the ConnectedMonitor option in xorg.conf.. Another option I've used in the past is to the build a dummy monitor plug. that makes the system think there's a CRT monitor attached. There are probably other solutions.

Good Luck!

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




回答3:


You can do off-screen rendering. More about it here.

It depends what is supported by your graphical card and the OS. If you got old graphical chip, you can use mesa OS library (but you get software rendering). If it is newer, you can use pbuffers.




回答4:


I've been using glu tesselator without OpenGL context for a while, this works on Windows and Linux (not with python, but C++), so it is in theory possible. If you setup the error callbacks in gluTessCallback() see red book it probably will not call glGetError.




回答5:


I experimented with this and yes, it appears that you can. I managed to get it working under Docker.

For me, the trick was to run the following:

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

Note that this only allows software rendering - while it might be good enough for my project, it might not be for yours.




回答6:


GLU requires a valid openGL context, yes (even if it should be possible to call the tesselator alone withoug a context).

If you don't have a window, it should be possible - but hard. See the opengl wiki (and read it 3 times, it's quite hard to follow).

The basic idea is that you need a special extension to create your special, window-less context. Thus you have to call wglGetExtensionsStringARB to get this extension. But to be able to call it, you have to have a context in the first place ! ( yes, this is a nightmare. I have whoever created this api ). So create a context the usual way ( and hope that it works even it you don't have a screen ), get your extension, call wglCreateContextAttribsARB

Note : the extension spec says that When this extension is supported, calling wglCreateContext(hdc) is equivalent to calling wglCreateContextAttribs(hdc,0,NULL), so maybe, maybe you could bet along with a simple context creation.



来源:https://stackoverflow.com/questions/6281998/can-i-run-glu-opengl-on-a-headless-server

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!