我正在尝试在远程计算集群上运行 opengl 应用程序。我正在使用 osmesa,因为我打算执行屏幕外软件渲染(无 x11 转发等)。我想使用 glew(让处理着色器和其他与扩展相关的调用更容易),而且我似乎已经构建并链接了 mesa 和 glew。
当我调用 mesa-create-context 时,glewinit 给出了一个 OPENGL 版本不可用的输出,这可能意味着尚未创建上下文。当我调用 glGetString(GL_EXTENSIONS) 时,我没有得到任何输出,这证实了这一点。这也表明 glew 本身运行良好。(其他 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 来解决这个问题,但不确定这是否相关。