更新(2017 年 9 月 17 日):
NVIDIA最近发表了一篇文章详细介绍如何在无头系统上使用 OpenGL https://devblogs.nvidia.com/parallelforall/linking-opengl-server-side-rendering/,这是与问题描述的非常相似的用例。
总之:
- Link to
libOpenGL.so
and libEGL.so
代替libGL.so
。 (因此,您的链接器选项应该是-lOpenGL -lEGL
- Call
eglGetDisplay
, then eglInitialize
初始化 EGL。
- Call
eglChooseConfig
与配置属性EGL_SURFACE_TYPE
随后是EGL_PBUFFER_BIT
.
- Call
eglCreatePbufferSurface
, then eglBindApi(EGL_OPENGL_API);
, then eglCreateContext
and eglMakeCurrent
.
从那时起,像往常一样进行 OpenGL 渲染,并且您可以在任何您喜欢的地方位块传输像素缓冲区表面。这篇来自 NVIDIA 的补充文章 https://devblogs.nvidia.com/parallelforall/egl-eye-opengl-visualization-without-x-server/包括一个基本示例和多个 GPU 的示例。根据应用程序的需要,PBuffer 表面也可以替换为窗口表面或像素图表面。
我很遗憾没有在之前的编辑中对此进行更多研究,但是哦,好吧。更好的答案就是更好的答案。
自从我在 2010 年回答以来,Linux 图形领域发生了许多重大变革。所以,更新的答案:
如今,nouveau 和其他 DRI 驱动程序已经成熟到 OpenGL 软件稳定并且总体性能相当好的程度。随着 Mesa 中引入 EGL API,现在甚至可以在 Linux 桌面上编写 OpenGL 和 OpenGL ES 应用程序。
您可以将应用程序编写为目标 EGL,并且可以在没有窗口管理器甚至合成器的情况下运行它。为此,您可以致电eglGetDisplay
, eglInitialize
,最终eglCreateContext
and 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
以下是过时的、之前接受的帖子:
我想在 Linux 中打开一个没有 X 的 OpenGL 上下文。有什么办法可以做到吗?
我相信 Mesa 提供了一个帧缓冲区目标。如果它提供任何硬件加速,则只能使用具有已调整为支持此类用途的开源驱动程序的硬件。
Gallium3D 也不成熟,据我所知,对此的支持甚至不在路线图上。
我想要一个适用于 nvidia 卡的解决方案。
没有一个。时期。
NVIDIA 仅提供 X 驱动程序,而 Nouveau 项目仍不成熟,并且不支持您正在寻找的用途,因为他们目前仅专注于 X11 驱动程序。