MacOS系统下SDL2创建OpenGL 3.1上下文无画面输出且glGetString返回空
问题原因及解决方案
1. 链接库配置错误
你当前使用的-lGL是Linux平台下链接Mesa/OpenGL驱动的参数,macOS平台没有该动态库,系统OpenGL实现以OpenGL.framework框架的形式提供,错误的链接参数导致所有OpenGL函数没有被正确加载,调用glGetString自然返回空指针。
2. OpenGL版本与Profile配置不兼容
macOS的Core Profile模式最低仅支持OpenGL 3.2,你指定的3.1版本Core Profile在macOS下无法创建,要么将版本升级为3.2,要么将Profile改为兼容模式。
修改方案
第一步:调整编译命令
替换原有的编译参数,使用macOS的framework格式链接OpenGL:
clang -O3 gl_sdl.c -lSDL2 -framework OpenGL
第二步:调整上下文配置
如果要使用Core Profile,将原来的版本设置代码修改为:
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);
如果需要保留3.1版本,就把Profile配置改为兼容模式:
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_COMPATIBILITY); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1);
额外优化建议
可以增加上下文创建后的版本校验逻辑,避免实际创建的版本不符合预期:
int major, minor; SDL_GL_GetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, &major); SDL_GL_GetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, &minor); printf("Created OpenGL context: %d.%d\n", major, minor);
修改完成后重新编译运行,就能正常打印OpenGL厂商、渲染器、版本信息,蓝色清屏的渲染效果也会正常显示。
内容的提问来源于stack exchange,提问作者Caspian Ahlberg
相关产品推荐
相关产品推荐

