树莓派3(Raspbian Jessie)无法启用OpenGL ES 2.0的技术求助
解决树莓派3 Raspbian Jessie上OpenGL ES 2.0上下文切换问题
你已经做好了基础配置——启用Full KMS驱动、分配足够GPU内存、安装了必要依赖,但核心问题出在EGL上下文的创建逻辑上,导致程序默认使用了OpenGL ES 1.1的上下文。下面是具体的修复方案:
1. 修复EGL上下文创建参数(最关键)
你已经定义了context_attribs数组来指定要创建OpenGL ES 2.0的上下文,但调用eglCreateContext时并没有传入这个参数!默认情况下EGL会创建最低兼容的上下文(也就是1.1版本)。
修改这一行代码:
// 原代码:未传入版本属性数组,默认创建ES 1.1上下文 eglContext = eglCreateContext(eglDisplay, eglConfig, EGL_NO_CONTEXT, NULL); // 修改为:传入context_attribs明确指定ES 2.0版本 eglContext = eglCreateContext(eglDisplay, eglConfig, EGL_NO_CONTEXT, context_attribs);
同时,添加上下文创建的错误检查,避免静默失败:
if (eglContext == EGL_NO_CONTEXT) { fprintf(stderr, "Failed to create EGL ES 2.0 context: 0x%x\n", eglGetError()); exit(1); }
2. 验证EGL配置的有效性
你的config_attribs已经包含了EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,这是正确的,但可以额外验证选中的配置是否真的支持ES 2.0:
// 在eglChooseConfig执行后添加 EGLint renderableType; eglGetConfigAttrib(eglDisplay, eglConfig, EGL_RENDERABLE_TYPE, &renderableType); if (!(renderableType & EGL_OPENGL_ES2_BIT)) { fprintf(stderr, "Selected EGL config does not support OpenGL ES 2.0\n"); exit(1); }
3. 系统配置二次确认
虽然你提到已经启用Full KMS和分配256MB GPU内存,但可以再检查/boot/config.txt的设置是否生效:
- 确保存在
dtoverlay=vc4-kms-v3d(Full KMS驱动,替代旧的enable_kms配置) - 确保
gpu_mem=256设置正确
修改后需要重启树莓派使配置生效。
4. 编译链接验证
你的编译命令gcc texture.c -o texture -lEGL -lX11 -lGLESv2是正确的,已经链接了对应ES 2.0的libGLESv2.so库,只要避免误链接libGLESv1_CM.so即可。
测试修改后的程序
重新编译运行后,你应该会看到OpenGL version输出变为OpenGL ES 2.0 Mesa 13.0.0,同时glReadPixels的结果也会和写入的数据一致。
内容的提问来源于stack exchange,提问作者konze
相关产品推荐
相关产品推荐

