欢迎来真孝善网,为您提供真孝善正能量书籍故事!

深入探讨OpenGL ES与EGL的eglMakeCurrent机制

时间:11-03 神话故事 提交错误

今天给各位分享深入探讨OpenGL ES与EGL的eglMakeCurrent机制的知识,其中也会对进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

1. EGL 前言2. EGL 绘制流程介绍3.eglMakeCurrent 函数介绍1.eglMakeCurrent 介绍2.eglMakeCurrent 的实现3.eglMakeCurrent 的使用4.关于多个EGLContext 5.共享EGLContext 6.猜你喜欢零-基于OpenGLES的学习路线推荐:OpenGL ES学习目录OpenGL ES基础知识

推荐零基础OpenGL ES学习路线:OpenGL ES学习目录OpenGL ES特效

推荐零基础OpenGL ES学习路线:OpenGL ES学习目录OpenGL ES过渡

推荐零基础OpenGL ES学习路线:OpenGL ES学习目录OpenGL ES函数

推荐零基础OpenGL ES学习路线:OpenGL ES学习目录OpenGL ES GPUImage使用

推荐零基础OpenGL ES学习路线:OpenGL ES学习目录OpenGL ES GLSL编程

一. EGL 前言

EGLNativeDisplayType系统显示类型,识别您正在开发的设备的物理屏幕,DX/OPenGL ES/Metal/Vulkan…。

EGLNativeWindowType系统窗口,渲染显示的窗口句柄

EGLDisplay与EGLNativeDisplayType系统物理屏幕相关的通用数据类型,相当于平台上的WGL/GLX/AGL

EGLSurface渲染区域,相当于OpenGL ES绘图的画布(一块内存空间)。用户想要绘制的信息首先必须绘制到EGLSurface,然后通过EGLDisplay显示

EGLConfigEGLSurface的EGL配置可以理解为绘图目标framebuffer的配置属性

EGLContextOpenGL ES 图形上下文

二. EGL 绘制流程简介

获取EGL Display 对象:eglGetDisplay 初始化与EGLDisplay 的连接:eglInitialize 获取EGLConfig 对象:eglChooseConfig/eglGetConfigs 创建EGLContext 实例:eglCreateContext 创建EGLSurface 实例:eglCreateWindowSurface/eglCreatePbufferSurface 连接EGLContext 和EGLSurface 上下文例如lMakeCurrent 使用OpenGL ESAPI绘制图形:gl_ *切换前缓冲区和后缓冲区显示:eglSwapBuffer 断开并释放与EGLSurface 关联的EGLContext 对象:eglRelease 删除EGLSurface 对象删除EGLContext 对象终止与EGLDisplay 的连接

三.eglMakeCurrent 函数简介

EGLContext 上下文包含了操作所需的所有状态信息,OpenGL ES 必须有一个可用的上下文才能进行绘图。

1.eglMakeCurrent 简介

创建后EGLSurface 和EGLContext ,因为可能有多个EGLSurface 和EGLContext,所以需要通过eglMakeCurrent绑定 EGLSurface 来指定当前上下文/*Description: 创建一个OpenGL ES EGLSurface

*范围:

* display:指定显示的连接

* 绘制:EGL绘制表面

* 阅读:EGL绘图表面

* context:通过eglCreateContext创建的上下文

*

*返回值:成功返回EGL_TRUE,失败返回EGL_FALSE

*/

EGLAPI EGL布尔值EGLAPIENTRY eglMakeCurrent(

EGLDisplay显示,

EGL表面绘制,

EGL表面读取,

EGLContext 上下文);相关错误码:EGL_BAD_MATCH:提供了与窗口属性不匹配的EGLConfig,或者EGLConfig不支持渲染EGL_BAD_DISPLAY

EGL_NOT_INITIALIZED

EGL_BAD_SURFACE

EGL_BAD_CONTEXT

EGL_BAD_MATCH

EGL_BAD_ACCESS

EGL_BAD_NATIVE_PIXMAP

EGL_BAD_NATIVE_WINDOW

EGL_BAD_CURRENT_SURFACE

EGL_BAD_ALLOC

EGL_CONTEXT_LOST

2.eglMakeCurrent 实现

/************************************************ *************************************************/

//@Author: 袁谈编程

//@Blog(个人博客地址): www.codersrc.com

//@File:OpenGL ES EGL eglMakeCurrent

//@Time:2022/08/04 07:30

//@Motto: 不积跬步,无以至千里。不积小流,就成不了大河。节目生活的精彩需要坚持不懈的积累!

/******************************************************** ***** *********************************************/

EGLBoolean eglMakeCurrent( EGLDisplay dpy, EGLSurface 绘制,

EGLSurface 读取,EGLContext ctx)

{

如果(egl_display_t:is_valid(dpy)==EGL_FALSE)

返回setError(EGL_BAD_DISPLAY, EGL_FALSE);

如果(平局){

egl_surface_t* s=(egl_surface_t*)绘制;

if (!s-isValid())

返回setError(EGL_BAD_SURFACE, EGL_FALSE);

if (s-dpy !=dpy)

返回setError(EGL_BAD_DISPLAY, EGL_FALSE);

//TODO: 检查绘图是否与上下文兼容

}

if (读读!=画) {

egl_surface_t* s=(egl_surface_t*)读取;

if (!s-isValid())

返回setError(EGL_BAD_SURFACE, EGL_FALSE);

if (s-dpy !=dpy)

返回setError(EGL_BAD_DISPLAY, EGL_FALSE);

//TODO: 检查读取是否与上下文兼容

}

EGLContext current_ctx=EGL_NO_CONTEXT;

if ((读取==EGL_NO_SURFACE 绘制==EGL_NO_SURFACE) (ctx !=EGL_NO_CONTEXT))

返回setError(EGL_BAD_MATCH, EGL_FALSE);

if ((读取!=EGL_NO_SURFACE || 绘制!=EGL_NO_SURFACE) (ctx==EGL_NO_CONTEXT))

返回setError(EGL_BAD_MATCH, EGL_FALSE);

如果(ctx==EGL_NO_CONTEXT){

//如果我们要分离,我们需要当前上下文

current_ctx=(EGLContext)getGlThreadSpecific();

} 别的{

egl_context_t* c=egl_context_t:context(ctx);

egl_surface_t* d=(egl_surface_t*)绘制;

egl_surface_t* r=(egl_surface_t*)读取;

if ((d d-ctx d-ctx !=ctx) ||

(r r-ctx r-ctx !=ctx)) {

//其中一个表面绑定到另一个线程中的上下文

返回setError(EGL_BAD_ACCESS, EGL_FALSE);

}

}

//调用makeCurrent将gl绑定到当前进程。

ogles_context_t* gl=(ogles_context_t*)ctx;

如果(makeCurrent(gl)==0){

如果(ctx){

egl_context_t* c=egl_context_t:context(ctx);

egl_surface_t* d=(egl_surface_t*)绘制;

egl_surface_t* r=(egl_surface_t*)读取;

if (c-draw) {//断开当前绘制表面绑定

egl_surface_t* s=reinterpret_cast(c-draw);

s-断开连接();

s-ctx=EGL_NO_CONTEXT;

if (s-僵尸)

删除s;

}

if (c-read) {

//FIXME: 也解锁/断开读取表面

}

//将绘制读取绑定到当前上下文。

c-绘制=绘制;

c-读取=读取;

if (c-flags egl_context_t:NEVER_CURRENT) {

c-flags=~egl_context_t:NEVER_CURRENT;

GLint w=0;

GLint h=0;

如果(平局){

w=d-getWidth();

h=d-getHeight();

}

ogles_surfaceport(gl, 0, 0);

ogles_viewport(gl, 0, 0, w, h);

ogles_scissor(gl, 0, 0, w, h);

}

如果(d){

if (d-connect()==EGL_FALSE) {

返回EGL_FALSE;

}

d-ctx=ctx;

d-bindDrawSurface(gl);

}

如果(r){

//FIXME: 也锁定/连接读取表面

r-ctx=ctx;

r-bindReadSurface(gl);

}

} else {//取消绑定

//如果表面已绑定到绑定到该线程的上下文

//将then 标记为未绑定。

如果(当前_ctx){

egl_context_t* c=egl_context_t:context(current_ctx);

egl_surface_t* d=(egl_surface_t*)c-draw;

egl_surface_t* r=(egl_surface_t*)c-读取;

如果(d){

c-绘制=0;

d-断开连接();

d-ctx=EGL_NO_CONTEXT;

if (d-僵尸)

删除d;

}

如果(r){

c-读取=0;

r-ctx=EGL_NO_CONTEXT;

//FIXME: 也解锁/断开读取表面

}

}

}

返回EGL_TRUE;

}

返回setError(EGL_BAD_ACCESS, EGL_FALSE);

}

3.eglMakeCurrent 使用

应用程序可能会出于不同的目的创建多个EGLContext,因此我们需要将特定的EGLContext 与渲染表面关联起来。此过程称为“指定当前上下文”,并使用以下调用将特定EGLContext 与EGLSurface 关联:

/******************************************************** ***** *********************************************/

//@Author: 袁谈编程

//@Blog(个人博客地址): www.codersrc.com

//@File:OpenGL ES EGL eglMakeCurrent

//@Time:2022/08/04 07:30

//@Motto: 不积跬步,无以至千里。不积小流,就成不了大河。节目生活的精彩需要坚持不懈的积累!

/******************************************************** ***** *********************************************/

EGLBoolean 初始化窗口(EGLNativeWindow nativeWindow)

{

const EGLint configAttribs[]={EGL_RENDER_TYPE, EGL_WINDOW_BIT,

EGL_RED_SIZE,8,

EGL_GREEN_SIZE, 8,

EGL_BLUE_SIZE, 8,

EGL_DEPTH_SIZE, 24,

EGL_无};

const EGLint contextAttribs[]={EGL_CONTEXT_CLIENT_VERSION, 3, EGL_NONE};

EGLDisplay 显示=eglGetDisplay(EGL_DEFAULT_DISPLAY)

如果(显示==EGL_NO_DISPLAY)

{

返回EGL_FALSE;

}

EGLint 大调、小调;

if (!eglInitialize(显示、主要、次要))

{

返回EGL_FALSE;

}

EGLConfig 配置;

EGLint numConfigs;

if (!eglChooseConfig(显示, configAttribs, config, 1, numConfigs))

{

返回EGL_FALSE;

}

EGLSurface 窗口=eglCreateWindowSurface(显示、配置、nativeWindow、NULL);

if (窗口==EGL_NO_SURFACE)

{

返回EGL_FALSE;

}

//创建上下文

EGLContext上下文=eglCreateContext(显示,配置,EGL_NO_CONTEXT,contextAttribs);

如果(上下文==EGL_NO_CONTEXT)

{

返回EGL_FALSE;

}

//使用当前上下文进行绑定

if (!eglMakeCurrent(显示、窗口、窗口、上下文))

{

返回EGL_FALSE;

}

返回EGL_TRUE;

}

四.关于多个 EGLContext

在某些情况下,我们想要创建和使用多个EGLContext。这种情况下,我们需要注意以下几种情况:

不能在 2 个线程里绑定同一个EGLContext。不能在 2 个不同的线程里,绑定相同的 EGLSurface 到 2 个不同的EGLContext上。在 2 个不同的线程里,绑定 2 个不同 EGLSurface 到 2 个EGLContext上,取决于使用的 GPU 的具体实现,可能成功,也可能失败。

五.共享 EGLContext

共享EGLContext 此方法在加载阶段很有用。由于上传数据到GPU(尤其是纹理)是一个繁重的操作,如果你想保持稳定的帧率,你应该在另一个线程中上传。

然而,对于上述对多个EGLContext的3种情况的限制,除了第一个EGLContext之外还必须创建第二个EGLContext。此EGLContext 将使用第一个EGLContext 使用的内部状态信息。这两个Context共享Context上下文。

需要注意的是:这****两个 EGLContext 共享的只是内部状态信息,它们两个并不共享调用缓存(每个 EGLContext各自拥有一个调用缓存)。如何创建第二个EGLContext

/*描述:创建OpenGL ES上下文EGLContext

*范围:

* display:指定显示的连接

* 配置:配置EGLConfig

* share_context:允许其他EGLContext共享数据,使用EGL_NO_CONTEXT表示不共享

* attribList:指定操作的属性列表,只能接受一个属性EGL_CONTEXT_CLIENT_VERSION(设置OpenGL ES版本)

*

*返回值:成功返回

回新创建的 EGLContext,失败时返回 EGL_NO_CONTEXT */ EGLContext eglCreateContext( EGLDisplay display, EGLConfig config, EGLContext share_context, EGLint const * attrib_list);注意:第三个参数share_context是最重要的,它就是第一个 Context ,表示共享上下文在第二个线程,不进行任何的绘制,只进行上传数据到 GPU 的操作。所以,给第二个 Context 的 Surface 应该是一个像素缓冲(pixel buffer) Surface。 EGLSurface eglCreatePbufferSurface( EGLDisplay display, EGLConfig config, EGLint const * attrib_list);

六.猜你喜欢

OpenGL ES 简介OpenGL ES 版本介绍OpenGL ES 2.0 和 3.0 区别OpenGL ES 名词解释(一)OpenGL ES 名词解释(二)OpenGL ES GLSL 着色器使用过程OpenGL ES EGL 简介OpenGL ES EGL 名词解释OpenGL ES EGL eglGetDisplayOpenGL ES EGL eglInitializeOpenGL ES EGL eglGetConfigsOpenGL ES EGLeglChooseConfigOpenGL ES EGL eglGetErrorOpenGL ES EGL eglCreateContextOpenGL ES EGL eglCreateWindowSurfaceOpenGL ES EGL eglCreatePbufferSurfaceOpenGL ES EGL eglMakeCurrent本文由博客 - 猿说编程猿说编程发布!

用户评论

丢了爱情i

终于搞清楚了 EglMakeCurrent 这个函数的作用!

    有17位网友表示赞同!

枫无痕

看了教程,恍然大悟,原来这能连接渲染上下文啊!

    有13位网友表示赞同!

|赤;焰﹏゛

学习 OpenGL ES 就得好好理解这个函数!

    有18位网友表示赞同!

余笙南吟

项目中用到 EGL,这个函数好难啃。

    有20位网友表示赞同!

红尘滚滚

想深入了解 OpenGL ES 的渲染流程,这块要认真研究哦

    有19位网友表示赞同!

墨染年华

每次看到 EGL 变量就头痛,感觉代码读起来太绕眼了。

    有12位网友表示赞同!

又落空

感觉这个函数有点像开启一个渲染的“门”,对吗?

    有7位网友表示赞同!

惯例

OpenGL ES 的使用真是一层一层往下 digging!

    有11位网友表示赞同!

服从

想尝试用 EGL 进行一些复杂的视觉效果,这个函数必须得会啊!

    有8位网友表示赞同!

留我一人

这听起来像是图形绘制过程中的重要一步!

    有14位网友表示赞同!

笑傲苍穹

学习 OpenGL,头脑风暴了一下,这个功能好关键哦!

    有7位网友表示赞同!

孤独症

学习 OpenGL 的时候遇到了这个,还挺难理解的!

    有14位网友表示赞同!

长裙绿衣

现在开发移动游戏越来越流行了,对 OpenGL ES 的了解就显得尤为重要!

    有15位网友表示赞同!

oО清风挽发oО

想要实现高性能图形渲染,需要掌握这些基础知识啊!

    有7位网友表示赞同!

高冷低能儿

发现了很多好用的 OpenGL ES 库,不过还是要理解它 underlying 原理!

    有14位网友表示赞同!

墨城烟柳

这个函数是连接渲染上下文和屏幕的桥梁吧?

    有18位网友表示赞同!

惦着脚尖摘太阳

想做点关于 3D 的项目,得先把这块函数弄明白才行!

    有19位网友表示赞同!

哥帅但不是蟋蟀

学习 OpenGL ES 的过程太有意思了!

    有19位网友表示赞同!

像从了良

希望以后能用这个技能实现一些有趣的作品!

    有15位网友表示赞同!

【深入探讨OpenGL ES与EGL的eglMakeCurrent机制】相关文章:

1.蛤蟆讨媳妇【哈尼族民间故事】

2.米颠拜石

3.王羲之临池学书

4.清代敢于创新的“浓墨宰相”——刘墉

5.“巧取豪夺”的由来--米芾逸事

6.荒唐洁癖 惜砚如身(米芾逸事)

7.拜石为兄--米芾逸事

8.郑板桥轶事十则

9.王献之被公主抢亲后的悲惨人生

10.史上真实张三丰:在棺材中竟神奇复活