android OpenGL ES 笔记 4EGL.docx

上传人:b****6 文档编号:6424057 上传时间:2023-01-06 格式:DOCX 页数:11 大小:46.58KB
下载 相关 举报
android OpenGL ES 笔记 4EGL.docx_第1页
第1页 / 共11页
android OpenGL ES 笔记 4EGL.docx_第2页
第2页 / 共11页
android OpenGL ES 笔记 4EGL.docx_第3页
第3页 / 共11页
android OpenGL ES 笔记 4EGL.docx_第4页
第4页 / 共11页
android OpenGL ES 笔记 4EGL.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

android OpenGL ES 笔记 4EGL.docx

《android OpenGL ES 笔记 4EGL.docx》由会员分享,可在线阅读,更多相关《android OpenGL ES 笔记 4EGL.docx(11页珍藏版)》请在冰豆网上搜索。

android OpenGL ES 笔记 4EGL.docx

androidOpenGLES笔记4EGL

EGL是OpenGLES与本地Window系统之间的桥梁。

EGL创建渲染上下文(RenderingContext)和Surface,RenderingContext是OpenGLES的状态机,Surface是OpenGLES绘图的“画布”

Display

Display是OpenGLES应用运行平台的物理显示器的抽象

RenderingContext

OpenGLES状态机,由EGL创建、并与Surface关联

RenderingContext含有OpenGLES的客户端和服务器端状态

RenderingContext存在于客户端的地址空间。

每个线程在同一时刻只能使用1个RenderingContext,每个RenderingContext在同一时刻只能被1个线程使用

Surface

OpenGLES绘图的“画布”。

EGL/OpenGLES有3种Surface:

∙window-用于屏上(onscreen)渲染

∙pbuffer-用于离屏(offscreen)渲染

∙pixmap-离屏渲染,但本地渲染API也可以访问

OpenGL支持2种渲染模式:

∙backbuffered-绘图的colorbuffer由EGL创建和管理,绘图完成后,EGL将后台colorbuffer交换/拷贝到窗口上

∙singlebuffered-其colorbuffer为本地Pixmap,EGL能使用但不维护。

OpenGLES绘图后,像素直接在Surface上呈现

window和pbufferSurface是backbuffered模式,pixmapSurface是singlebuffered模式

Config

用于创建Surface,包含了Surface的各个buffer的创建参数

∙colorbuffer

∙depthbuffer

∙multisamplebuffer

∙stencilbuffer

相互之间的关系概括

要点:

∙与同一Display关联的RenderingContext和Surface,才可以相互关联

∙一个RenderingContext可以向多个Surface绘图,多个RenderingContext可以向同一个Surface绘图

∙每个Surface有其独立的buffers

EGL函数

Display相关

eglInitialize

对每一个Display,都要初始化EGL

eglTerminate

释放EGL相关资源

Config相关

Config用于创建Surface

eglChooseConfig

获取一个Display与指定属性相匹配的Config列表

eglGetConfigs

获取一个Display所支持的所有Config列表

常用Config属性有:

属性

说明

 EGL_RED_SIZE

EGL_GREEN_SIZE

EGL_BLUE_SIZE

EGL_ALPHA_SIZE

 colorbuffer的RGBA分量的颜色深度(位数)

 EGL_BUFFER_SIZE

 colorbuffer的颜色深度(bpp)

EGL_RED/GREEN/BLUE/ALPHA_SIZE之和

 EGL_SURFACE_TYPE

 Surface类型,可选值为:

∙EGL_WINDOW_BIT

∙EGL_PIXMAP_BIT

∙EGL_PBUFFER_BIT

 EGL_DEPTH_SIZE

 depthbuffer中Z的位数

 EGL_SAMPLE_BUFFERS

 multisamplebuffer个数,0或1

 EGL_SAMPLES

 numberofsamplesperpixel

 EGL_STENCIL_SIZE

 stencilbuffer个数

 

 

Surface相关

eglCreateWindowSurface

创建windowSurface(on-screen渲染)

eglDestroySurface

释放Surface相关资源

Context相关

eglCreateContext

指定Display、Config,创建一个RenderingContext

多个RenderingContext可以共享数据,eglCreateContext()有一个参数为与其共享数据的另一个Context

eglDestroyContext

释放Context相关的资源

eglMakeCurrent

将RenderingContext绑定到当前线程,并且绑定RenderingContext与Surface

如果当前线程已经绑定了另一个Context,则原Context将解除绑定。

因此可以以NULL或者EGL_NO_CONTEXT调用eglMakeCurrent来解除线程与当前Context之间的绑定关系

其他函数

eglSwapBuffers

将backbuffer拷贝到窗口

eglGetError

获取最近一次EGL函数的错误代码

EGL是OpenGLES和底层Native平台视窗系统之间的接口。

本章主要讲述OpenGLES的EGLAPI,以及如何用它创建Context和绘制Surface等,并对用于OpenGL的其他视窗API做了比较分析,比如WGL和GLX。

本章中将涵盖如下几个方面:

EGL综述

EGL主要构成(Display,Context,Configuration)

在Brew和WindowsCE上使用EGL

EGL和其他OpenGL视窗系统的比较

EGL介绍

EGL是为OpenGLES提供平台独立性而设计。

在本章中,你将详细地学习每个EGLAPI,并了解使用EGL时候需要注意的平台特性和限制。

OpenGLES为附加功能和可能的平台特性开发提供了扩展机制,但仍然需要一个可以让OpenGLES和本地视窗系统交互且平台无关的层。

OpenGLES本质上是一个图形渲染管线的状态机,而EGL则是用于监控这些状态以及维护Framebuffer和其他渲染Surface的外部层。

图2-1是一个典型的EGL系统布局图。

EGL视窗设计是基于人们熟悉的用于MicrosoftWindows(WGL)和UNIX(GLX)上的OpenGL的Native接口,与后者比较接近。

OpenGLES图形管线的状态被存储于EGL管理的一个Context中。

FrameBuffers和其他绘制Surfaces通过EGLAPI创建、管理和销毁。

EGL同时也控制和提供了对设备显示和可能的设备渲染配置的访问。

EGL数据类型

EGL包含了自己的一组数据类型,同时也提供了对一组平台相关的本地数据类型的支持。

这些Native数据类型定义在EGL系统的头文件中。

一旦你了解这些数据类型之间的不同,使用它们将变得很简单。

多数情况下,为保证可移植性,开发人员将尽可能使用抽象数据类型而避免直接使用系统数据类型。

通过使用定义在EGL中Native类型,可以让你写的EGL代码运行在任意的EGL的实现上。

NativeEGL类型说明如下:

lNativeDisplayType平台显示数据类型,标识你所开发设备的物理屏幕

lNativeWindowType平台窗口数据类型,标识系统窗口

lNativePixmapType可以作为Framebuffer的系统图像(内存)数据类型,该类型只用于离屏渲染

下面的代码是一个NativeWindowType定义的例子。

这只是一个例子,不同平台之间的实现千差万别。

使用native类型的关键作用在于为开发者抽象化这些细节。

QUALCOMM使用IDIB结构定义native类型,如下:

structIDIB{

AEEVTBL(IBitmap)*pvt;//virtualtablepointer

IQueryInterface*pPaletteMap;//cacheforcomputedpalettemappinginfo

byte*pBmp;//pointertotoprow

uint32*pRGB;//palette

NativeColorncTransparent;//32-bitnativecolorvalue

uint16cx;//numberofpixelsinwidth

uint16cy;//numberofpixelsinheight

int16nPitch;//offsetfromonerowtothenext

uint16cntRGB;//numberofpaletteentries

uint8nDepth;//sizeofpixelinbits

uint8nColorScheme;//IDIB_COLORSCHEME_...(ie.5-6-5)

uint8reserved[6];

};

接下来的小节中,我们将深入更多EGL数据类型细节。

标准EGL数据类型如表2.1所示。

表2.1EGL数据类型

数据类型值

EGLBooleanEGL_TRUE=1,EGL_FALSE=0

EGLintint数据类型

EGLDisplay系统显示ID或句柄

EGLConfigSurface的EGL配置

EGLSurface系统窗口或framebuffer句柄

EGLContextOpenGLES图形上下文

NativeDisplayTypeNative系统显示类型

NativeWindowTypeNative系统窗口缓存类型

NativePixmapTypeNative系统framebuffer

EGLDisplays

EGLDisplay是一个关联系统物理屏幕的通用数据类型。

对于PC来说,Display就是显示器的句柄。

不管是嵌入式系统或PC,都可能有多个物理显示设备。

为了使用系统的显示设备,EGL提供了EGLDisplay数据类型,以及一组操作设备显示的API。

下面的函数原型用于获取NativeDisplay:

EGLDisplayeglGetDisplay(NativeDisplayTypedisplay);

其中display参数是native系统的窗口显示ID值。

如果你只是想得到一个系统默认的Display,你可以使用EGL_DEFAULT_DISPLAY参数。

如果系统中没有一个可用的nativedisplayID与给定的display参数匹配,函数将返回EGL_NO_DISPLAY,而没有任何Error状态被设置。

由于设置无效的display值不会有任何错误状态,在你继续操作前请检测返回值。

下面是一个使用EGLAPI获取系统Display的例子:

m_eglDisplay=eglGetDisplay(system.display);

if(m_eglDisplay==EGL_NO_DISPLAY||eglGetError()!

=EGL_SUCCESS))

throwerror_egl_display;

Initialization初始化

和很多视窗API类似,EGL在使用前需要初始化,因此每个EGLDisplay在使用前都需要初始化。

初始化EGLDisplay的同时,你可以得到系统中EGL的实现版本号。

了解当前的版本号在向后兼容性方面是非常有价值的。

嵌入式和移动设备通常是持续的投放到市场上,所以你需要考虑到你的代码将被运行在形形色色的实现上。

通过动态查询EGL版本号,你可以为新旧版本的EGL附加额外的特性或运行环境。

基于平台配置,软件开发可用清楚知道哪些API可用访问,这将会为你的代码提供最大限度的可移植性。

下面是初始化EGL的函数原型:

EGLBooleaneglInitialize(EGLDisplaydpy,EGLint*major,EGLint*minor);

其中dpy应该是一个有效的EGLDisplay。

函数返回时,major和minor将被赋予当前EGL版本号。

比如EGL1.0,major返回1,minor则返回0。

给major和minor传NULL是有效的,如果你不关心版本号。

eglQueryString()函数是另外一个获取版本信息和其他信息的途径。

通过eglQueryString()获取版本信息需要解析版本字符串,所以通过传递一个指针给eglInitializ()函数比较容易获得这个信息。

注意在调用eglQueryString()必须先使用eglInitialize()初始化EGLDisplay,否则将得到EGL_NOT_INITIALIZED错误信息。

下面是获取EGL版本字符串信息的函数原型:

constchar*eglQueryString(EGLDisplaydpy,EGLintname);

参数name可以是EGL_VENDOR,EGL_VERSION,或者EGL_EXTENSIONS。

这个函数最常用来查询有哪些EGL扩展被实现。

所有EGL扩展都是可选的,如果你想使用某个扩展特性,请检查该扩展是否被实现了,而不要想当然假定已经实现了。

如果没有扩展被实现,将返回一个Null字符串,如果给定的name参数无效,则会得到EGL_BAD_PARAMETER.错误信息。

初始化EGL

OpenGLES是一个平台中立的图形库,在它能够工作之前,需要与一个实际的窗口系统关联起来,这与OpenGL是一样的。

但不一样的是,这部份工作有标准,这个标准就是EGL。

而OpenGL时代在不同平台上有不同的机制以关联窗口系统,在Windows上是wgl,在X-Window上是xgl,在AppleOS上是agl等。

EGL的工作方式和部份术语都接近于xgl。

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

Display→Config→Surface

Context

Application→OpenGLCommand

1.获取Display。

Display代表显示器,在有些系统上可以有多个显示器,也就会有多个Display。

获得Display要调用EGLbooleaneglGetDisplay(NativeDisplaydpy),参数一般为EGL_DEFAULT_DISPLAY。

该参数实际的意义是平台实现相关的,在X-Window下是XDisplayID,在MSWindows下是WindowDC。

2.初始化egl。

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

3.选择Config。

所为Config实际指的是FrameBuffer的参数,在MSWindows下对应于PixelFormat,在X-Window下对应Visual。

一般用EGLbooleaneglChooseConfig(EGLDisplaydpy,constEGLint*attr_list,EGLConfig*config,EGLintconfig_size,EGLint*num_config),其中attr_list是以EGL_NONE结束的参数数组,通常以id,value依次存放,对于个别标识性的属性可以只有id,没有value。

另一个办法是用EGLbooleaneglGetConfigs(EGLDisplaydpy,EGLConfig*config,EGLintconfig_size,EGLint*num_config)来获得所有config。

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

可以利用eglGetConfig()中间两个参数为0来查询系统支持的Config总个数。

Config有众多的Attribute,这些Attribute决定FrameBuffer的格式和能力,通过eglGetConfigAttrib()来读取,但不能修改。

4.构造Surface。

Surface实际上就是一个FrameBuffer,通过EGLSurfaceeglCreateWindowSurface(EGLDisplaydpy,EGLConfigconfg,NativeWindowwin,EGLint*cfg_attr)来创建一个可实际显示的Surface。

系统通常还支持另外两种Surface:

PixmapSurface和PBufferSurface,这两种都不是可显示的Surface,PixmapSurface是保存在系统内存中的位图,PBuffer则是保存在显存中的帧。

Surface也有一些attribute,基本上都可以故名思意,EGL_HEIGHTEGL_WIDTHEGL_LARGEST_PBUFFEREGL_TEXTURE_FORMATEGL_TEXTURE_TARGETEGL_MIPMAP_TEXTUREEGL_MIPMAP_LEVEL,通过eglSurfaceAttrib()设置、eglQuerySurface()读取。

5.创建Context。

OpenGL的pipeline从程序的角度看就是一个状态机,有当前的颜色、纹理坐标、变换矩阵、绚染模式等一大堆状态,这些状态作用于程序提交的顶点坐标等图元从而形成帧缓冲内的像素。

在OpenGL的编程接口中,Context就代表这个状态机,程序的主要工作就是向Context提供图元、设置状态,偶尔也从Context里获取一些信息。

用EGLContexteglCreateContext(EGLDisplaydpy,EGLSurfacewrite,EGLSurfaceread,EGLContext*share_list)来创建一个Context。

6.绘制。

应用程序通过OpenGLAPI进行绘制,一帧完成之后,调用eglSwapBuffers(EGLDisplaydpy,EGLContextctx)来显示。

EGLConfigurations

EGLConfigs是一个用来描述EGLsurface配置信息的数据类型。

要获取正确的渲染结果,Surface的格式是非常重要的。

根据平台的不同,surface配置可能会有限制,比如某个设备只支持16位色深显示,或是不支持stencilbuffer,还有其他的功能限制或精度的差异。

下面是获取系统可用的EGL配置信息的函数原型:

EGLBooleaneglGetConfigs(EGLDisplaydpy,EGLConfig*configs,EGLintconfig_size,EGLint*num_config);

参数configs将包含在你的平台上有效的所有EGLframebuffer配置列表。

支持的配置总数将通过num_config返回。

实际返回的configs的配置个数依赖于程序传入的config_size。

如果config_size

如果想获取系统支持的所有配置信息,最好的办法就是先给eglGetConfig传一个NULL的configs参数,num_config将得到系统所支持的配置总数,然后用它来给configs分配合适的内存大小,再用得到的configs来调用eglGetConfig。

下面是如果使用eglGetConfig()函数的例子:

EGLConfig*configs_list;

EGLintnum_configs;

//MainDisplay

m_eglDisplay=eglGetDisplay(EGL_DEFAULT_DISPLAY);

if(m_eglDisplay==EGL_NO_DISPLAY||eglGetError()!

=EGL_SUCCESS)

returnFALSE;

if(eglInitialize(m_eglDisplay,NULL,NULL)==EGL_FALSE||eglGetError()!

=EGL_SUCCESS)

returnFALSE;

//findouthowmanyconfigurationsaresupported

if(eglGetConfigs(m_eglDisplay,NULL,0,&num_configs)==EGL_FALSE||eglGetError()!

=EGL_SUCCESS)

returnFALSE;

configs_list=malloc(num_configs*sizeof(EGLConfig));

if(configs_list==(EGLConfig*)0)

returnFALSE;

//GetConfigurations

if(eglGetConfigs(m_eglDisplay,configs_list,num_configs,&num_configs)==EGL_FALSE||eglGetError()!

=EGL_SUCCESS)

returnFALSE;

由于当前平台的限制,通常只有很少的配置可用。

系统支持的配置通常是利用系统硬件提供最好的性能。

当你移植游戏到多个平台,它们的EGL配置可能会有细微的差别,我们希望作为通用的移植问题来直接处理这些问题。

选择一个EGLConfiguration

基于EGL的属性,你可以定义一个希望从系统获得的配置,它将返回一个最接近你的需求的配置。

选择一个你特有的配置是有点不合适的,因为只是在你的平台上使用有效。

eglChooseConfig()函数将适配一个你所期望的配置,并且尽可能接近一个有效的系统配置。

下面是选择一个EGL配置的函数原型:

EGLBooleaneglChooseConfig(EGLDisplaydpy,constEGLint*attrib_list,

EGLConfig*configs,EGLintconfig_size,EGLint

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1