c++ - Apache2 模块中的无窗口 OpenGL 上下文

标签 c++ opengl glx apache2-module openglcontext

我正在尝试开发一个 Apache2 模块,它利用 OpenGL 执行离屏渲染并动态生成图像,然后我可以将这些图像发送回客户端。

Apache2 在 Ubuntu 12.04 机器上运行,我创建了一个测试模块,它使用 OpenGL/GLX 渲染四边形并将帧作为图像存储到磁盘。但是,当模块收到客户端请求时,它会在 XOpenDisplay(0) 处崩溃并出现段错误。有什么想法可能会出错吗?

编辑: 我看到的所有示例都在谈论使用像素缓冲区 (PBuffer)。据我所知,这些已被弃用,应改用 FBO。有人可以解释如何创建上下文并使用 FBO 执行离屏渲染吗?

最佳答案

虽然从技术上讲完全有可能使用 OpenGL 进行无窗口、无显示服务器的屏幕外 GPU 加速渲染,但实际上现在这是不可能的,因为您需要一个显示环境才能真正访问 GPU。幸运的是,如今图形系统的结构正在发生变化(混合图形、显示合成器)。 Mesa 已经提供了一种屏幕外上下文创建模式 (OSMesa),但它的功能远未完成。

所以现在,您需要某种可绘制的显示服务器,您可以在其上绑定(bind)上下文。 X11 提供两种 GPU 加速绘图:Windows 和 PBuffers。您可以将 FBO 与其中任何一个一起使用(从技术上讲,PBuffer 是无法映射到根窗口并具有屏幕外 Canvas 的 Windows)。最简单的方法是在 X 服务器上创建一个常规窗口但不显示它;您仍然可以在其上创建 OpenGL 上下文并创建 FBO,如许多教程中所示。 但是要使 OpenGL 正常工作,您使用的 X 服务器必须处于事件状态并保持控制台并配置为使用 GPU(理论上,使用支持混合图形的较新 X 服务器和驱动程序,应该可以配置 X 服务器使用虚拟显示设备并将 GPU 配置为加速渲染的辅助设备,但到目前为止我从未尝试过)。

关于c++ - Apache2 模块中的无窗口 OpenGL 上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22446593/

相关文章:

c++ - 如何在 Linux 上使用 Boost.Filesystem?

c++ - 使用 FFMPEG 和 url_fopen 示例

c++ - 将 multimap 转换为一组集合

c++ - 如何找到 glx 库名称?

linux - “glSwapInterval”未在此范围内声明

c++ - 未在此范围内声明 C++

c++ - OpenGL 相机方向

c++ - 为什么我的翻译矩阵需要转置?

c++ - 不正确的随机彩色矩形

c++ - 手动调用 OpenGL 函数