更新(2017年9月17日):
NVIDIA最近发表了一篇文章,详细介绍了如何在无头系统上使用OpenGL,该问题与问题描述非常相似。
综上所述:
- 链接到
libOpenGL.so
而libEGL.so
不是libGL.so
。(因此,您的链接器选项应为-lOpenGL -lEGL
- 呼叫
eglGetDisplay
,然后eglInitialize
初始化EGL。 - 调用
eglChooseConfig
config属性,EGL_SURFACE_TYPE
后跟EGL_PBUFFER_BIT
。 - 呼叫
eglCreatePbufferSurface
,然后eglBindApi(EGL_OPENGL_API);
,再eglCreateContext
和eglMakeCurrent
。
从那时起,像往常一样执行OpenGL渲染,然后可以随心所欲地涂抹像素缓冲区表面。NVIDIA的这篇补充文章包括一个基本示例和多个GPU的示例。根据应用需要,也可以将PBuffer表面替换为窗口表面或像素图表面。
我很遗憾没有在以前的编辑中对此做更多的研究,但是很好。更好的答案就是更好的答案。
自从2010年我的回答以来,Linux图形领域发生了许多重大变化。因此,一个更新的答案:
如今,nouveau和其他DRI驱动程序已经成熟到OpenGL软件稳定并且总体上表现良好的地步。随着Mesa中EGL
API的引入,现在甚至可以在Linux桌面上编写OpenGL和OpenGL ES应用程序。
您可以将应用程序编写为目标EGL,并且可以在没有窗口管理器甚至合成器的情况下运行它。为此,您可以调用
eglGetDisplay,
eglInitialize并最终调用
eglCreateContext和
eglMakeCurrent,而不是通常的glx调用来执行相同的操作。
我不知道在没有显示服务器的情况下工作的具体代码路径,但是EGL接受X11显示器和Wayland显示器,而且我知道EGL可以不使用它而运行。您可以创建GL
ES 1.1,ES 2.0,ES 3.0(如果您具有Mesa 9.1或更高版本)和OpenGL 3.1(Mesa
9.0或更高版本)上下文。Mesa尚未(截至2013年9月)尚未实现OpenGL 3.2 Core。
值得注意的是,在Raspberry Pi和Android上,默认情况下支持EGL和GL ES 2.0(Android
<3.0上为1.1)。在Raspberry
Pi上,我认为Wayland仍无法正常工作(截至2013年9月),但是在不使用包含的二进制驱动程序的显示服务器的情况下,您确实可以获得EGL。如果您感兴趣的话,您的EGL代码也应该可以移植到iOS(经过最小的修改)。
以下是过时的,以前接受的帖子:
我想在Linux中打开不带X的OpenGL上下文。有什么办法吗?
我相信Mesa提供了一个帧缓冲目标。如果它完全提供了任何硬件加速,那么它将仅与那些具有适用于这种用途的开源驱动程序的硬件一起使用。
Gallium3D也不成熟,据我所知,甚至对此路线的支持都还没有。
我想获得一种适用于nvidia卡的解决方案。
没有一个。期。
NVIDIA仅提供X驱动程序,而Nouveau项目仍不成熟,并且不支持您正在寻找的使用类型,因为它们目前仅专注于X11驱动程序。



