制作没有屏幕的 OpenGL 上下文

Posted

技术标签:

【中文标题】制作没有屏幕的 OpenGL 上下文【英文标题】:Make OpenGL context with No screens 【发布时间】:2015-01-31 16:55:39 【问题描述】:

我正在尝试在 debian 服务器上使用 glx 创建 opengl 上下文。问题是我无法进行显示,原因似乎是因为没有运行 X 服务器,我无法使用 sudo startx 启动 X 服务器,因为它说没有屏幕。

服务器在异地,无法在其上添加显示,我需要制作一个可以在其上运行并渲染东西和一些东西的 opengl 应用程序。

这是我当前的 c++ 测试代码:

#include <cstdio>
#include <X11/Xutil.h>
#include <GL/gl.h>
#include <GL/glx.h>

typedef GLXContext (*glXCreateContextAttribsARBProc) (Display*, GLXFBConfig, GLXContext, Bool, const int*);
typedef Bool (*glXMakeContextCurrentARBProc) (Display*, GLXDrawable, GLXDrawable, GLXContext);
static glXCreateContextAttribsARBProc glXCreateContextAttribsARB = NULL;
static glxMakeContextCurrentARBProc glxMakeContextCurrentARB = NULL;

int main()
    printf("tacos\n");
    glXCreateContextAttribsARB = (glXCreateContextAttribsARBProc) glXGetProcAddressARB((const GLubyte*) "glXCreateContextAttribsARB");
    glXMakeContextCurrentARB = (glXMakeContextCurrentARBProc) glXGetProcAddressARB((const GLubyte*) "glXMakeContextCurrent");

    [ ... ] // Check if the two funcs are null, they are not when I run the program.

    const char* display_name = NULL;
    Display* display = XOpenDisplay(display_name);
    if (display == NULL)
        printf("failed to open display\n"); // outputs this and ends program
        return 0;
    

    printf("Great Success\n"); // does not get this far ^
    return 0;

我检查 X Server 是否正在运行:

if ! xset q &>/dev/null; then
    echo "No X server at \$DISPLAY [$DISPLAY]" >&2;
fi

输出如下:

No X server at $DISPLAY []

这让我认为 $DISPLAY 变量未设置,但我不知道如何检查它是否已设置。

然后我运行“sudo startx”并得到以下信息:

Fatal server error:
(EE) no screens found(EE)

【问题讨论】:

【参考方案1】:

好吧,GLX 是 X11 OpenGL 传输协议。所以你绝对需要一个运行的 X 服务器(你在场外有 GPU 吗?)。

如果没有连接监视器,默认配置中的 Xorg 服务器的更高版本将拒绝启动。但是,使用放置在 /etc/X11 中的正确 xorg.conf 并使用正确的命令行选项,您甚至可以诱使服务器启动。但是,您要么必须启动重定向复合管理器,要么重写 OpenGL 程序以使用帧缓冲区对象,否则将无法绘制帧缓冲区(我强烈建议使用帧缓冲区对象路线)。

【讨论】:

对不起,我对 linux 很陌生,能否请您链接到一些可以提供更多信息的页面?有一个集成的 GPU,但不是专用的。 @MichaelMitchell:到底是哪种 GPU?能否请将lspci 的输出发布到pastebin 或类似文件中(您可能必须以超级用户身份运行lspci (sudo lspci))。 PCI 中没有任何内容。有一个集成的英特尔 gpu。 @MichaelMitchell:集成的英特尔 GPU 是通过 PCI 访问的。哎呀,甚至现代英特尔 CPU 的内存控制器也出现了广告 PCI 设备。已经这样做并报告结果。 我跑了sudo lspci 没有结果,因为根本没有输出。然后我跑了sudo lspci -vv,再次没有。最后我做了sudo lspci -m 并且只输出类似[000:000]

以上是关于制作没有屏幕的 OpenGL 上下文的主要内容,如果未能解决你的问题,请参考以下文章

使用 Vista/7 的 OpenGL 最多 32 个屏幕窗口

CGContextRef 作为 OpenGL 上下文

Opengl:渲染到 Win32 API 上下文

使用 OpenGL 不渲染 --> 上下文

创建跨平台 OpenGL 离屏上下文

使用 ubuntu 在不同的显示器上共享 opengl 上下文