我有一个简单的OpenGL程序,在Linux上使用SDL,它只是尝试加载和打印OpenGL版本。
cout << "GL_VERSION : " << glGetString(GL_VERSION) << endl;
当我运行程序时,它只是挂起,输出如下。。。它基本上是在"等待"OpenGL库的响应:
GL_VERSION :
它与英伟达Ubuntu OpenGL库(nvidiancurrent-dev pkg)相链接。我确实在系统上安装了Mesa,但正如你从"lsof"中看到的,它似乎正在使用英伟达。
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,因为这不是英伟达开发软件包的一部分。
不太确定如何调试这个,有人能给我指明正确的方向吗?
不要在SDL_SetVideoMode()
调用中混合使用SDL_OPENGL
和其他标志。嗯,你可以使用SDL_FULLSCREEN
,但你不需要SDL_HWSURFACE
。
特别地,SDL_GL_DOUBLEBUFFER
不是以这种方式使用的。Intead do:
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
SDL_SetVideoMode(640, 480, 32, SDL_OPENGL);
在终端中键入glxgear时会发生什么?如果没有弹出显示齿轮旋转的窗口,则说明您的安装有问题。
如果您确实看到一个齿轮旋转的窗口,那么您没有像Nicol Bolas建议的那样正确初始化OpenGL上下文。
我解决了这个问题。我按照下面链接中的代码获得了一个初始工作版本:
http://www.sdltutorials.com/sdl-opengl-tutorial-basics
本文注意到了一些集合属性调用:
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很好。