c++ - glewInit() 在创建 osmesa(屏幕外台面)上下文后崩溃(段错误)

标签 c++ opengl glew mesa

我正在尝试在远程计算集群上运行 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 因段错误而崩溃。然而,运行 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 的情况下可能不会准备启用。这将导致段错误(如我所见),不幸的是,如果不修补 C 源代码并重新编译库,glewInit 函数似乎无法处理这种情况。

如果其他人已经解决了这个问题,我会很感兴趣,我已经看到了 glew.c 源代码的一些补丁版本可以解决这个问题。目前尚不清楚 GLEW 社区是否有精力合并解决此用例的更改。

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

相关文章:

c++ - 为什么使用 exit() 被认为是不好的?

c++ - 在 Ubuntu 中学习 OpenGL

c++ - glewInit() 时 OpenGL 错误 GL_INVALID_ENUM (0x0500)

c - strstr 有这个重载吗?

opengl - 在 OpenGL 中使用 gluPerspective

c++ - 链接 GLEW 和其他人,_glViewport 是唯一 Unresolved

qt - 为 Qt + OpenGL + GLUT + GLEW 应用程序创建安装程序

c++ - BOOST_AUTO_TEST_SUITE_END() 行出现异常错误

c++ - 根据 C++ ISO 标准,什么是多次通过保证?

安卓 NDK : How to replace AAsset to work with files from external Storage for FFmpeg decoding