我正在尝试在远程计算集群上运行opengl应用程序。我正在使用osmesa,因为我打算执行屏幕外的软件渲染(无x11转发等)。我想使用glew (让处理着色器和其他扩展相关的调用变得更容易),而且我似乎已经很好地构建并链接了mesa和glew。
当我调用mesa-create-context时,glewinit给出了OPENGL Version not available输出,这可能意味着上下文还没有创建。当我调用glGetString(GL_EXTENSIONS)时,我没有得到任何输出,这证实了这一点。这也表明glew本身工作得很好。(其他glew命令,如glew、version等也可以使用)。
现在,当我(如下所示)添加mesa-make-context-current函数时,glewinit会崩溃,并显示segfault。但是,现在运行glGetString(GL_EXTENSIONS)会给出一个扩展列表(这意味着上下文创建成功了!)
我花了几个小时试图弄清楚这一点,尝试修补,但都没有奏效。将非常感谢在这方面的帮助。也许你们中的一些人以前经历过类似的事情??再次感谢!
int Height = 1; int Width = 1;
OSMesaContext ctx; void *buffer;
ctx = OSMesaCreateContext( OSMESA_RGBA, NULL );
buffer = malloc( Width * Height * 4 * sizeof(GLfloat) );
if (!OSMesaMakeCurrent( ctx, buffer, GL_UNSIGNED_BYTE, Width, Height )) {
printf("OSMesaMakeCurrent failed!\n");
return 0;
}
-- glewinit() crashes after this.只是补充一下,osmesa和glew实际上一开始并没有编译。因为glew在最后一行中没有定义GLAPI,而且osmesa不会再次包含gl.h,所以GLAPI仍然是未定义的,并在osmesa.h中导致错误(119)。我通过向GLAPI添加一个extern解决了这个问题,但不确定这是否相关。
发布于 2014-09-11 04:25:17
查看glew.c中glewInit的源代码,如果glewContextInit成功,它将返回GLEW_OK,GLEW_OK被定义为0,因此在Linux系统上,它将始终调用glxewContextInit,这将调用glX函数,而在OSMesa的情况下,这些函数可能无法使用。这将导致段错误(如我所见),如果不对C源代码打补丁并重新编译库,glewInit函数似乎无法处理这种情况。
如果其他人已经解决了这个问题,我会感兴趣的,我已经看到了glew.c源代码的一些修补版本,它们解决了这个问题。目前还不清楚GLEW社区中是否有任何能量来合并针对此用例的更改。
https://stackoverflow.com/questions/23451435
复制相似问题