使用无屏幕创建 OpenGL 上下文
Make OpenGL context with No screens
我正在尝试在 debian 服务器上使用 glx 创建一个 opengl 上下文。问题是我无法显示,原因似乎是因为没有 X 服务器 运行ning 并且我无法使用 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)
嗯,GLX 是 X11 OpenGL 传输协议。所以你绝对需要一个 X 服务器 运行(你在场外位置有可用的 GPU 吗?)。
如果没有连接监视器,默认配置的更高版本的Xorg 服务器将拒绝启动。但是,使用 /etc/X11 中的正确 xorg.conf 和正确的命令行选项,您甚至可以诱导服务器启动。但是,您要么必须启动重定向复合管理器,要么重写您的 OpenGL 程序以使用帧缓冲区对象,否则您将无法获得要绘制的帧缓冲区(我强烈建议使用帧缓冲区对象路线)。
我正在尝试在 debian 服务器上使用 glx 创建一个 opengl 上下文。问题是我无法显示,原因似乎是因为没有 X 服务器 运行ning 并且我无法使用 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)
嗯,GLX 是 X11 OpenGL 传输协议。所以你绝对需要一个 X 服务器 运行(你在场外位置有可用的 GPU 吗?)。
如果没有连接监视器,默认配置的更高版本的Xorg 服务器将拒绝启动。但是,使用 /etc/X11 中的正确 xorg.conf 和正确的命令行选项,您甚至可以诱导服务器启动。但是,您要么必须启动重定向复合管理器,要么重写您的 OpenGL 程序以使用帧缓冲区对象,否则您将无法获得要绘制的帧缓冲区(我强烈建议使用帧缓冲区对象路线)。