2

我有一个在 Linux 上使用 SDL 的简单 OpenGL 程序,它只是尝试加载和打印 OpenGL 版本。

cout << "GL_VERSION  : " << glGetString(GL_VERSION) << endl;

当我运行程序时它只是挂起,输出如下......它基本上似乎在“等待”OpenGL库响应:

GL_VERSION  : 

它与 Nvidia Ubuntu OpenGL 库 (nvidia-current-dev pkg) 链接。我也确实在系统上安装了 Mesa,但正如您从“lsof”中看到的,它似乎正在使用 Nvidia。

sdl-hack 29491 x  mem    REG               8,18 34639056 4212198 /usr/lib/nvidia-current/libnvidia-glcore.so.295.40
sdl-hack 29491 x  mem    REG               8,18    11728 4212207 /usr/lib/nvidia-current/tls/libnvidia-tls.so.295.40
sdl-hack 29491 x  mem    REG               8,18  1054832 4212209 /usr/lib/nvidia-current/libGL.so.295.40

请注意,我确实必须安装“libglu1-mesa-dev”来提供 glu.h,因为这不是 Nvidia dev pkg 的一部分。

不太确定如何调试这个,有人可以指出我正确的方向吗?

4

3 回答 3

1

不要在通话SDL_OPENGL中与其他标志混合。SDL_SetVideoMode()好吧,您可以使用SDL_FULLSCREEN,但不需要SDL_HWSURFACE.

特别是,SDL_GL_DOUBLEBUFFER不以这种方式使用。打算做:

SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
SDL_SetVideoMode(640, 480, 32, SDL_OPENGL);
于 2012-09-13T19:54:05.497 回答
0

在终端中输入glxgears会发生什么?如果没有弹出显示齿轮旋转的窗口,则说明您的安装有问题。

如果您确实看到一个齿轮旋转的窗口,则说明您没有按照 Nicol Bolas 的建议正确初始化 OpenGL 上下文。

于 2012-09-13T19:50:21.943 回答
0

我解决了这个问题。我按照以下链接中的代码获取了初始工作版本:

http://www.sdltutorials.com/sdl-opengl-tutorial-basics

文章记录了一些 set 属性调用:

SDL_GL_SetAttribute(SDL_GL_RED_SIZE,        8);
SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE,      8);
SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE,       8);
SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE,      8);

SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE,      16);
SDL_GL_SetAttribute(SDL_GL_BUFFER_SIZE,        32);

SDL_GL_SetAttribute(SDL_GL_ACCUM_RED_SIZE,    8);
SDL_GL_SetAttribute(SDL_GL_ACCUM_GREEN_SIZE,    8);
SDL_GL_SetAttribute(SDL_GL_ACCUM_BLUE_SIZE,    8);
SDL_GL_SetAttribute(SDL_GL_ACCUM_ALPHA_SIZE,    8);

SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS,  1);
SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES,  2);

这些是在 SDL_Init 之后但在 SDL_SetVideoMode 调用之前。删除它们使程序运行良好!

奇怪的是,这个问题只发生在具有 Mesa 和 Nvidia GL 库的 Linux 上。Mac OSX 很好。

于 2012-09-14T13:41:42.370 回答