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);
相关推荐
郝学胜-神的一滴1 天前
中级OpenGL教程 005:为球体&平面注入法线灵魂
c++·unity·图形渲染·three.js·opengl·unreal
潇湘散客3 天前
CAX软件插件化设计实现牛刀小试
c++·算法·图形学·opengl
潇湘散客3 天前
CAX软件插件化设计实战:从框架到3D基础功能落地
c++·图形学·opengl
:mnong4 天前
附图报价系统设计分析6
人工智能·opengl·cad·python3.11·opencascade
郝学胜-神的一滴4 天前
[简化版 GAMES 101] 计算机图形学 08:三角形光栅化上
c++·unity·游戏引擎·godot·图形渲染·opengl·unreal
梵尔纳多5 天前
OpenGL 实例化
c++·图形渲染·opengl
郝学胜-神的一滴8 天前
中级OpenGL教程 004:为几何体注入法线灵魂
c++·unity·游戏引擎·godot·图形渲染·opengl·unreal
爱看书的小沐10 天前
【小沐学WebGIS】基于Cesium.JS与jsbsim联动三维飞行仿真(OpenGL、Cesium.js、Three.js)
c++·qt·three.js·opengl·cesium·jsbsim
♡すぎ♡10 天前
ShaderLab:可互动水面(基于RenderTexture,实时生成动态扰动)
计算机图形学·贴图·opengl·着色器