EGL 学习

来源:互联网 发布:sql语句教程 编辑:程序博客网 时间:2024/05/17 05:02

转自:http://blog.sina.com.cn/s/blog_602f87700100h4jh.html


在近2年的工作中,Sam会遇到3D方面的一些概念,如OpenGL ES,EGL等。但因为不需要实际去做,所以也仅仅是大概了解。现在需要写一个底层,将并将EGL包含在内,所以需要学习之。本文中部分内容是网络中摘录。

 

0.概念:

1. OpenGL ES:

OpenGL ES是针对内存紧张的系统定义的一套非常有用的OpenGL子集。

 

2. WGL,GLX,AGL,EGL:

OpenGL在使用时,需要与一个实际的窗口系统关联起来。在不同平台上有不同的机制以关联窗口系统,在Windows上是WGL,在Linux上是GLX,在AppleOS上是AGL等

EGL则是OpenGL ES在嵌入式平台上(WGL,GLX,AGL)的等价物。

 

EGL假设OS会提供窗口系统,但EGL与平台无关,并不局限于任何特定的窗口系统,所有用到本地窗口系统的地方都用屏蔽指针来处理。(Sam认为,这就是它易于移植的关键)

 

 

1. EGL使用:

OpenGLES是一个平台无关的图形库,如上所述,在它能够工作之前,需要与一个实际的窗口系统关联起来。这部分工作依赖于EGL。下面具体谈他们如何开始工作:

 

OpenGL ES的初始化过程如下图所示意:

Display → Config → Surface                        ↑                      Context                        ↑Application → OpenGL Command

 

 

1.1.获取Display:
Display代表显示器,在有些系统上可以有多个显示器,也就会有多个Display。(Sam觉得这个观点有点牵强,Sam觉得Display理解为显存Framebuffer比较合适一些)。获得Display要调用EGLbooleaneglGetDisplay(NativeDisplay dpy),参数一般为EGL_DEFAULT_DISPLAY 。该参数实际的意义是平台实现相关的,在X-Window下是XDisplay ID,在MSWindows下是Window DC。EGL(Boardcom)为NativeDisplayType。

Sam: 所以在不同平台开发时,第一件需要确认的就是:这个平台上的display概念是的实现是什么?

 

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

 

1.3. Config的选择:

Config指的是FrameBuffer的参数,在Windows下对应于PixelFormat,在X-Window下对应Visual。在EGL(Boardcom)下也指PixelFormat.一般用

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

参数1:dpy: display.

参数2:attr_list: 使用这个参数,来选中符合的config.

参数3:config: 将符合的config,放到这里。

参数4:想要选中符合的config的最大个数。

参数5:真正选中的符合的config的个数。

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

 

另一个办法是用:

EGLboolean eglGetConfigs(EGLDisplay dpy, EGLConfig * config,EGLint config_size, EGLint *num_config) 来获得所有config。

参数1:dpy, display.

参数2:输出参数,会在其中放置config.

参数3:config_size: 取config的个数。

参数4:num_config: 当参数2为空时,返回全部config个数。当参数2不为空时,返回读取config的个数。

 

这两个函数都会返回不多于config_size个Config,结果保存在config[]中,系统的总Config个数保存在num_config中。可以利用eglGetConfig()中间两个参数为0来查询系统支持的Config总个数。
Config有众多的Attribute,这些Attribute决定FrameBuffer的格式和能力,通过eglGetConfigAttrib()来读取,但不能修改。

 

1.4. 构造Surface:
Surface实际上就是一个FrameBuffer,通过 EGLSurfaceeglCreateWindowSurface(EGLDisplay dpy, EGLConfig confg,NativeWindow win, EGLint *cfg_attr)来创建一个可实际显示的Surface。系统通常还支持另外两种Surface:PixmapSurface和PBufferSurface,这两种都不是可显示的Surface,PixmapSurface是保存在系统内存中的位图,PBuffer则是保存在显存中的帧。
Surface也有一些attribute,基本上都可以故名思意, EGL_HEIGHT EGL_WIDTHEGL_LARGEST_PBUFFER EGL_TEXTURE_FORMAT EGL_TEXTURE_TARGETEGL_MIPMAP_TEXTUREEGL_MIPMAP_LEVEL,通过eglSurfaceAttrib()设置、eglQuerySurface()读取。

 

1.5. 创建Context:
OpenGL的pipeline从程序的角度看就是一个状态机,有当前的颜色、纹理坐标、变换矩阵、绚染模式等一大堆状态,这些状态作用于程序提交的顶点坐标等图元从而形成帧缓冲内的像素。在OpenGL的编程接口中,Context就代表这个状态机,程序的主要工作就是向Context提供图元、设置状态,偶尔也从Context里获取一些信息。
用EGLContext eglCreateContext(EGLDisplay dpy, EGLSurface write,EGLSurface read, EGLContext * share_list)来创建一个Context。

 

1.6. 绘制:
应用程序通过OpenGL API进行绘制,一帧完成之后,调用eglSwapBuffers(EGLDisplay dpy,EGLContext ctx)来显示。 

 

0 0
原创粉丝点击