OpenGL Es渲染相机画面问题记录

问题记录

问题1、错误码(16进制) 0x3002

执行eglMakeCurrent的时候产生了这个问题,这个错误码在openGL内部是 EGL_BAD_ACCESS,经过排查已经发现了问题的原因。

根本原因在于OpenGL的上下文只能被一个线程持有。我的OpenGl的渲染是新开了一个线程之前,我这边初始化openGL的上下文的时候已经执行过eglMakeCurrent导致了openGL的上下文被初始化的线程持有了。

有两个解决方案,第一个方案删除外部的eglMakeCurrent逻辑,将glCreateShader和glCreateProgram的逻辑迁移到渲染线程,第二个方案是外面初始化openGL上下文的shader和program之后执行一遍释放上下文。代码示例如下

scss 复制代码
// 这里绑定上下文
if (!eglMakeCurrent(eglDisplay_, eglSurface_, eglSurface_, eglContext_)) {
    OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_DOMAIN, LOG_TAG, "eglMakeCurrent Error = %{public}x", eglGetError());
    releaseEglDisplay();
    return false;
}

// 创建shader和program
m_program = CreateProgram(VERTEX_SHADER_YUV, FRAGMENT_SHADER_YUV);
if (m_program == 0) {
    OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_DOMAIN, LOG_TAG, "CreateProgram Error");
    releaseEglDisplay();
    return false;
}

// 这里释放上下文
if (!eglMakeCurrent(eglDisplay_, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT)) {
    OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_DOMAIN, LOG_TAG, "eglMakeCurrent unbind Error = 0x{public}x", eglGetError());
    releaseEglDisplay();
    return false;
}

问题二:渲染图片旋转了90度

UV纹理的坐标绘制存在问题,要调整一下UV的坐标

原UV坐标

scss 复制代码
// 修改前
static float fragment[] = {1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f};

// 修改后
static float fragment[] = {
    1.0f, 0.0f, 
    1.0f, 1.0f,  
    0.0f, 0.0f, 
    0.0f, 1.0f,
};

问题三:渲染图片出现了镜像

顶点坐标存在问题

scss 复制代码
// 修改前
    static float ver[] = {1.0f, -1.0f, 0.0f, -1.0f, -1.0f, 0.0f, 1.0f, 1.0f, 0.0f, -1.0f, 1.0f, 0.0f};


    // 修改后
    static float ver[] = {-1.0f, -1.0f, 0.0f,
                      1.0f, -1.0f, 0.0f, 
                      -1.0f, 1.0f, 0.0f,
                      1.0f, 1.0f, 0.0f};

问题四:矩形只渲染了一半

修改关键

scss 复制代码
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); // 是三角带不是三角形

问题五: 错误码(16进制) 0x0502

复制代码
GL_INVALID_OPERATION              0x0502

这个问题出现在我这边的原因是我初始化上下文的时候忘记属性列表了

ini 复制代码
// 修改前
eglContext_ = eglCreateContext(eglDisplay_, eglConfig_, EGL_NO_CONTEXT, nullptr);

// 修改后
const EGLint CONTEXT_ATTRIBS[] = {EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE};
eglContext_ = eglCreateContext(eglDisplay_, eglConfig_, EGL_NO_CONTEXT, CONTEXT_ATTRIBS);
相关推荐
mmsx1 天前
Android 地图十万要素不卡顿:空间网格 + 渐进式加载的移动端实践
android·大数据·opengl
mmsx1 天前
Android 地图几万要素卡成幻灯片?顶点缓冲批上传与显存复用
android·opengl·地图·栅格
郝学胜-神的一滴9 天前
C++11 工程级应用 10:减少拷贝,让容器跑得更快
服务器·开发语言·c++·游戏引擎·opengl
又吹风_Bassy14 天前
WhatsCanvas教程-第九章:窗口呈现与交互
canvas·opengl·skia·2d渲染库·nanovg·whatscanvas·2d图形库
又吹风_Bassy17 天前
WhatsCanvas教程-第三章:画笔 Paint 详解
canvas·opengl·skia·2d渲染库·nanovg·whatscanvas·2d图形库
又吹风_Bassy17 天前
WhatsCanvas教程-第二章:基础图形绘制
canvas·opengl·skia·2d渲染库·nanovg·whatscanvas·2d图形库
郝学胜-神的一滴17 天前
CMake 047:解锁安装阶段自定义操作,告别配置阶段提前执行坑
运维·服务器·c++·游戏引擎·图形渲染·opengl
令狐掌门21 天前
OpenGL是个状态机,如何理解
opengl
郝学胜-神的一滴1 个月前
Horse3D 游戏引擎研发笔记(七):Clydesdale——从流式日志到多输出订阅
c++·qt·unity·游戏引擎·图形渲染·unreal engine·opengl
sara_shengxin1 个月前
OPenGL面剔除
opengl·面剔除