what(): EGL error 0x300c at eglBindAPI 已放弃 (核心已转储)

博客地址:https://www.cnblogs.com/zylyehuo/
把只适配老旧单显卡桌面系统的 C++ 模拟器(Matterport3DSimulator),修改为能兼容现代双显卡笔记本(Optimus 架构)的版本。
使用的是带 NVIDIA 和 Intel 双显卡的笔记本,而且连接了外接显示器。在这种环境下,系统的显示环境变量($DISPLAY)处于一种非常复杂的混合状态。

实现效果

bash 复制代码
cd /home/yehuo/VLN_learning/Matterport3DSimulator

./build/mattersim_main

MatterSim.cpp

/home/yehuo/VLN_learning/Matterport3DSimulator/src/lib/MatterSim.cpp
主要的修改都在于从严格的"桌面级 OpenGL"兼容到"嵌入式 OpenGL ES"

API 降级绑定

在初始化时,如果桌面级 EGL_OPENGL_API 绑定失败,让它自动降级使用 EGL_OPENGL_ES_API。

cpp 复制代码
if (eglBindAPI(EGL_OPENGL_API) == EGL_FALSE) {
            std::cerr << "Warning: EGL_OPENGL_API failed. Falling back to EGL_OPENGL_ES_API..." << std::endl;
            eglBindAPI(EGL_OPENGL_ES_API);
        }

配置属性匹配

将 EGL_RENDERABLE_TYPE 从 EGL_OPENGL_BIT 修改为了支持 ES 规范的 EGL_OPENGL_ES2_BIT | EGL_OPENGL_ES3_BIT。

cpp 复制代码
EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT | EGL_OPENGL_ES3_BIT,

上下文版本升级

在 eglCreateContext 时,指定 EGL_CONTEXT_CLIENT_VERSION 为 3(即 OpenGL ES 3.0),以支持高级的图像内存对齐功能。

cpp 复制代码
EGL_CONTEXT_CLIENT_VERSION, 3,

颜色通道修正

在 glReadPixels 从显卡读取渲染结果时,将非标准的 GL_BGR 改为标准的 GL_RGB,并在读取后手动调用 cv::cvtColor 将其转换回 OpenCV 需要的 BGR 格式。

cpp 复制代码
glReadPixels(0, 0, img.cols, img.rows, GL_RGB, GL_UNSIGNED_BYTE, img.data);

NavGraph.cpp

/home/yehuo/VLN_learning/Matterport3DSimulator/src/lib/NavGraph.cpp
图像纹理上传规范化

输入颜色修正

在读取 _skybox_small.jpg 后,立刻使用 cv::cvtColor 将 BGR 转为 RGB。

cpp 复制代码
cv::cvtColor(rgb, rgb, cv::COLOR_BGR2RGB);

纹理通道修正

将所有 glTexImage2D 调用中的 GL_BGR 枚举全部替换为 GL_RGB。

cpp 复制代码
glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB, xpos.rows, xpos.cols, 0, GL_RGB, GL_UNSIGNED_BYTE, xpos.ptr());
    glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGB, xneg.rows, xneg.cols, 0, GL_RGB, GL_UNSIGNED_BYTE, xneg.ptr());
    glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB, ypos.rows, ypos.cols, 0, GL_RGB, GL_UNSIGNED_BYTE, ypos.ptr());
    glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGB, yneg.rows, yneg.cols, 0, GL_RGB, GL_UNSIGNED_BYTE, yneg.ptr());
    glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB, zpos.rows, zpos.cols, 0, GL_RGB, GL_UNSIGNED_BYTE, zpos.ptr());
    glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB, zneg.rows, zneg.cols, 0, GL_RGB, GL_UNSIGNED_BYTE, zneg.ptr());

剔除废弃函数

删除了在现代 OpenGL 中属于非法调用的 glEnable(GL_TEXTURE_CUBE_MAP)。

相关推荐
dtq04247 天前
卫星导航原理6 - 受摄运动和广播星历
导航
夏白分享社14 天前
没有 GPS,也没预建地图:双目+IMU 如何让无人机自主导航?
无人机·定位·导航
传奇开心果编程17 天前
【React Native娓娓道来】第5课 导航与多页面:用 React Navigation 组织页面流
移动开发·导航·编程语言理论·开发范式·编程框架·声明式ui·多页面
dtq042422 天前
卫星导航原理4 - 地球坐标系
导航
dtq042423 天前
卫星导航原理3 - 天球坐标系
导航
奇妙之二进制1 个月前
机器人导航路径规划算法入门(6)Dijkstra(迪杰斯特拉)算法深入解析
算法·导航
feasibility.1 个月前
当“给机器人指路“成为一门数据工程学——SimpleNav 拆解:导航大模型的标准化之争
ai·机器人·无人机·导航·具身智能·vla·vln
thesky1234562 个月前
智能体面试准备(四十三):具身智能体与机器人实操——从 VLA 到 Sim2Real
机器人·导航·操作·具身智能·智能体·vla·视觉语言动作
硬小二3 个月前
什么是SPS,SPI的核心特点和应用总结
硬件·导航
Evand J4 个月前
【论文复现】MATLAB例程,存在测距误差的WSN无锚点分布式自定位,《WSN中存在测距误差的无锚点分布式自定位方法》
开发语言·分布式·matlab·定位·导航·wsn