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);
相关推荐
郝学胜-神的一滴2 天前
中级OpenGL教程 030:gl_FragCoord解锁区域渲染与深度可视化新姿势
c++·unity·游戏引擎·图形渲染·unreal engine·opengl
郝学胜_神的一滴2 天前
Horse3D 游戏引擎研发笔记(五):Ferghana 编辑器——从场景 JSON 到可交互视口
计算机图形学·opengl
一枚懒人8 天前
OpenGL 视频渲染导论:从图形管线到视频处理全览
程序员·opengl
郝学胜-神的一滴14 天前
中级OpenGL教程 026:Assimp库从编译到实战全攻略
c++·unity·游戏引擎·图形渲染·unreal engine·opengl
郝学胜_神的一滴19 天前
中级OpenGL教程 024:Assimp模型加载之Mesh解码玄功
计算机图形学·opengl
郝学胜-神的一滴20 天前
中级OpenGL教程 023:Assimp模型加载全解——从源码到架构的骈文探秘
c++·unity·游戏引擎·cmake·unreal engine·opengl
郝学胜-神的一滴21 天前
中级OpenGL教程 022:探秘三维世界的血脉传承——物体父子关系与矩阵递归奥义
c++·线性代数·unity·矩阵·游戏引擎·unreal engine·opengl
郝学胜_神的一滴23 天前
Horse3D 游戏引擎研发笔记(二):材质系统——从 JSON 配置到 GPU Uniform
游戏开发·opengl
郝学胜-神的一滴1 个月前
[简化版 GAMES 101] 计算机图形学 17:纹理技术从基础原理到多场景实战应用
c++·unity·游戏引擎·图形渲染·three.js·opengl·unreal
郝学胜-神的一滴1 个月前
中级OpenGL教程 013:渲染器类架构设计与逐帧渲染流程详解
开发语言·c++·unity·游戏引擎·图形渲染·opengl·unreal