【问题标题】:Windowless OpenGL Context in Apache2 ModuleApache2 模块中的无窗口 OpenGL 上下文
【发布时间】:2014-03-17 03:46:36
【问题描述】:

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

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

编辑: 我见过的所有例子都在谈论使用像素缓冲区(PBuffer)。据我所知,这些已被弃用,应该使用 FBO。谁能解释一下如何创建上下文并使用 FBO 执行离屏渲染?

【问题讨论】:

    标签: c++ opengl glx apache2-module openglcontext


    【解决方案1】:

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

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

    【讨论】:

    • 这确实很有帮助。但是您能否详细说明这部分:“要使 OpenGL 工作,您使用的 X 服务器必须处于活动状态,并持有控制台并配置为使用 GPU”。我面临的主要问题是无法打开显示,因为XOpenDisplay() 总是失败。我尝试通过NULL 从环境变量中获取数字,但仍然失败。我通过从命令行启动 Apache2 作为单个进程进行了测试,以便我可以监控控制台上的输出。
    • @informer2000:首先确保实际上有一个 X 服务器正在运行。如果是这样,您必须向客户端提供 DISPLAY 编号和授权信息的路径。启动 X 服务器时,使用 -auth … 选项指定放置授权数据的路径(在 /var/run 左右的某个位置)并使其可由网络服务器进程读取。然后将 XAUTHORITY 环境变量设置为该路径。
    • 感谢 datenwolf。但我看不出我在做什么与你提到的不同。我从我的代码中检查了 DISPLAY 变量,它确实得到了正确的值(:0.0)。所以我猜XOpenDisplay() 是用那个值调用的。 X 服务器的客户端应用程序将是我的模块(或基本上是 Apache)。 XAUTHORITY 指向我用户家中的 .Xauthority 文件。由于我是从命令行作为单个进程启动 Apache,因此我的用户可能是该进程的所有者。
    • 我唯一能想到的可能是子进程的所有者说www-data 无权访问.Xauthority 文件!
    • @informer2000:帧可能回来了,因为在进行 OpenGL 渲染时,您使用的 X 服务器不是持有终端的服务器。为了使 OpenGL 与当前的 X 服务器一起工作,使用的 X 服务器必须是一个,即当前在显示连接器上产生输出。如果您在您的机器上启动第二个 X 服务器,然后切换回您的会话,则另一个 X 服务器无法产生 OpenGL 输出(使用当前驱动程序)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-03
    • 1970-01-01
    • 1970-01-01
    • 2011-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多