我正在尝试在远程计算群集上运行opengl应用程序。我正在使用osmesa,因为我打算执行屏幕外的软件渲染(不进行x11转发等)。我想使用glew(使生活更轻松地处理着色器和其他与扩展相关的调用),而且我似乎已经建立并链接了台面和glew。

当我调用mesa-create-context时,glewinit给出了OPENGL版本不可用的输出,这可能意味着尚未创建上下文。当我调用glGetString(GL_EXTENSIONS)时,我没有得到任何输出,这证实了这一点。这也表明,毛刺单独起作用。 (其他glew命令,例如glew版本等也可以使用)。

现在,当我(如下所示)添加mesa-make-context-current函数时,glewinit会因段错误而崩溃。但是,现在运行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来解决此问题,但不确定是否与此相关。

最佳答案

在glew.c中查看glewInit的源代码,如果glewContextInit成功,它将返回GLEW_OK,将GLEW_OK定义为0,因此在Linux系统上,它将始终调用glxewContextInit,后者调用glX函数,在OSMesa的情况下可能无法使用。 。这将导致段错误(如我所见),不幸的是,glewInit函数无法在不修补C源代码和重新编译库的情况下处理这种情况。

如果其他人已经解决了这个问题,我将很感兴趣,我已经看到了glew.c源的一些修补版本,可以解决此问题。尚不清楚GLEW社区中是否有任何能量可以合并解决该用例的更改。

关于c++ - 创建osmesa(屏幕外mesa)上下文后,glewInit()崩溃(segfault),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23451435/

10-11 21:00