EGL错误0x300c在eglBindAPI时发生了,为何核心已转储?
摘要:博客地址:https:www.cnblogs.comzylyehuo 把只适配老旧单显卡桌面系统的 C++ 模拟器(Matterport3DSimulator),修改为能兼容现代双显卡笔记本(Op
博客地址:https://www.cnblogs.com/zylyehuo/
把只适配老旧单显卡桌面系统的 C++ 模拟器(Matterport3DSimulator),修改为能兼容现代双显卡笔记本(Optimus 架构)的版本。
使用的是带 NVIDIA 和 Intel 双显卡的笔记本,而且连接了外接显示器。在这种环境下,系统的显示环境变量($DISPLAY)处于一种非常复杂的混合状态。
实现效果
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。
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。
EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT | EGL_OPENGL_ES3_BIT,
上下文版本升级
在 eglCreateContext 时,指定 EGL_CONTEXT_CLIENT_VERSION 为 3(即 OpenGL ES 3.0),以支持高级的图像内存对齐功能。
EGL_CONTEXT_CLIENT_VERSION, 3,
颜色通道修正
在 glReadPixels 从显卡读取渲染结果时,将非标准的 GL_BGR 改为标准的 GL_RGB,并在读取后手动调用 cv::cvtColor 将其转换回 OpenCV 需要的 BGR 格式。
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。
cv::cvtColor(rgb, rgb, cv::COLOR_BGR2RGB);
纹理通道修正
将所有 glTexImage2D 调用中的 GL_BGR 枚举全部替换为 GL_RGB。
