美文网首页
EGL的基本使用流程

EGL的基本使用流程

作者: 吉吉的纸飞机 | 来源:发表于2022-10-30 10:28 被阅读0次

    转载 https://blog.csdn.net/weixin_35127779/article/details/86540173

    一、相关概念:

    1.OpenGL是一套绘图函数的标准,OpenGL ES是OpenGL中针对嵌入式系统的一套函数子集。

    2.EGL:通俗上讲,OpenGL是一个操作[GPU]的API,它通过驱动向GPU发送相关指令,控制图形渲染管线状态机的运行状态。但OpenGL需要本地视窗系统进行交互,这就需要一个中间控制层,最好与平台无关。EGL——因此被独立的设计出来,它作为OpenGL ES和本地窗口的桥梁。 EGL 是 OpenGL ES(嵌入式)和本地 平台视窗系统之间的接口。

    3.GLUT:是基本的窗口界面,是独立于gl和glu的,如果不喜欢用glut可以用MFC和Win32窗口等代替,但是glut是跨平台的,这就保证了我们编出的程序是跨平台的,如果用MFC或者Win32只能在windows操作系统上使用。选择OpenGL的一个很大原因就是因为它的跨平台性,所以我们可以尽量的使用glut库。

    3.glut

    二、EGL使用流程

    1.标准 EGL 数据类型如下所示:

    EGLBoolean ——EGL_TRUE =1, EGL_FALSE=0
    EGLint ——int 数据类型
    EGLDisplay ——系统显示 ID 或句柄,可以理解为一个前端的显示窗口
    EGLConfig ——Surface的EGL配置,可以理解为绘制目标framebuffer的配置属性
    EGLSurface ——系统窗口或 frame buffer 句柄 ,可以理解为一个后端的渲染目标窗口。
    EGLContext ——OpenGL ES 图形上下文,它代表了OpenGL[状态机] 如果没有它,OpenGL指令就没有执行的环境。
    

    下面几个类型比较复杂,通过例子可以更深入的理解。这里要说明的是这几个类型在不同平台其实现是不同的,EGL只提供抽象标准。

    NativeDisplayType——本地系统显示类型,标识你所开发设备的物理屏幕
    NativeWindowType ——本地系统窗口缓存类型,标识系统窗口
    NativePixmapType ——本地系统 frame buffer,可以作为 Framebuffer 的系统图像(内存)数据类型,该类型只用于离屏渲染.
    

    2 OpenGL ES的初始化过程(EGL初始化)如下图所示意:

    Display → Config → Surface
    ↑
    Context
    ↑
    Application → OpenGL Command
    
    2.1. 获取Display。

    获得Display要调用 eglGetDisplay,参数一般为 EGL_DEFAULT_DISPLAY 。

    EGLboolean eglGetDisplay(NativeDisplay dpy)
    
    2.2. 初始化egl。

    调用 eglInitialize,该函数会进行一些内部初始化工作,并传回EGL版本号(major.minor)。

    EGLboolean eglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor)
    
    2.3. 选择Config。

    Config实际指的是FrameBuffer的参数,

    一般用 eglChooseConfig 其中attr_list是以EGL_NONE结束的参数数组,通常以id,value依次存放,对于个别标识性的属性可以只有 id,没有value。

    EGLboolean eglChooseConfig(EGLDisplay dpy, const EGLint * attr_list, EGLConfig * config, EGLint config_size, EGLint *num_config)
    

    另一个办法是用 eglGetConfigs 来获得所有config。

    EGLboolean eglGetConfigs(EGLDisplay dpy, EGLConfig * config, EGLint config_size, EGLint *num_config) 
    

    这两个函数都会返回不多于config_size个Config,结果保存在config[]中,系统的总Config个数保存 在num_config中。

    可以利用eglGetConfig()中间两个参数为0来查询系统支持的Config总个数。
    Config有众多的Attribute,这些Attribute决定FrameBuffer的格式和能力,通过 eglGetConfigAttrib () 来读取,但不能修改。

    2.4 构造Surface。

    Surface实际上就是一个FrameBuffer,也就是渲染目的地,通过 eglCreateWindowSurface 来创建一个可实际显示的Surface。

    EGLSurface eglCreateWindowSurface(EGLDisplay dpy, EGLConfig confg, NativeWindow win, EGLint *cfg_attr)
    

    系统通常还支持另外两种Surface:PixmapSurface和PBufferSurface,这两种都不是可显示的Surface,PixmapSurface是保存在系统内存中的位图,PBuffer则是保存在显存中的帧。

    对于这两种surfaceAndroid系统中,支持PBufferSurface。
    Surface也有一些attribute,基本上都可以故名思意,

    EGL_HEIGHT EGL_WIDTH EGL_LARGEST_PBUFFER EGL_TEXTURE_FORMAT EGL_TEXTURE_TARGET EGL_MIPMAP_TEXTURE EGL_MIPMAP_LEVEL,
    

    通过eglSurfaceAttrib()设置、eglQuerySurface()读取。

    2.5 创建Context。

    OpenGL ES的pipeline从程序的角度看就是一个状态机,有当前的颜色、纹理坐标、变换矩阵、绚染模式等一大堆状态,这些状态作用于OpenGL 程序提交的顶点坐标等图元从而形成帧缓冲内的像素。在OpenGL的编程接口中,Context就代表这个状态机,OpenGL API程序的主要工作就是向Context提供图元、设置状态,偶尔也从Context里获取一些信息。
    可以用

    EGLContext eglCreateContext(EGLDisplay dpy, EGLSurface write, EGLSurface read, EGLContext * share_list)
    

    来创建一个Context。

    2.6EGL变量之间的绑定
    boolean eglMakeCurrent(EGLDisplay display, EGLSurface draw, EGLSurface read, EGLContext context)
    

    该接口将申请到的display,draw(surface)和 context进行了绑定。也就是说,在context下的OpenGLAPI指令将draw(surface)作为其渲染最终目的地。而display作为draw(surface)的前端显示。调用后,当前线程使用的EGLContex为context。

    2.7. 绘制。

    应用程序通过OpenGL API进行绘制,一帧完成之后,调用 eglSwapBuffers 来显示。

    eglSwapBuffers(EGLDisplay dpy, EGLContext ctx)
    

    相关文章

      网友评论

          本文标题:EGL的基本使用流程

          本文链接:https://www.haomeiwen.com/subject/rwwktdtx.html