OpenGL ES入门Word文档格式.docx
- 文档编号:15806755
- 上传时间:2022-11-16
- 格式:DOCX
- 页数:17
- 大小:24.06KB
OpenGL ES入门Word文档格式.docx
《OpenGL ES入门Word文档格式.docx》由会员分享,可在线阅读,更多相关《OpenGL ES入门Word文档格式.docx(17页珍藏版)》请在冰豆网上搜索。
什么是OpenGLES
OpenGLES是一套适用于手持嵌入式设备的3DAPI。
比如手机、PDA、汽车、航空等等上面都可以使用到OpenGLES。
OpenGLES是免授权费的、跨平台的、功能完善的2D和3D图形应用程序接口API,它是桌面OpenGL的子集,是从OpenGL裁剪定制而来的。
由于手持设备的相关局限性,OpenGLES相对于OpenGL不可避免的进行了相关的精简。
去除了OpenGL中比如glBegin/glEnd,四边形(GL_QUADS)、多边形(GL_POLYGONS)等复杂图元等许多非绝对必要的特性。
但是OpenGL方面的很多知识,OpenGLES都是可以借鉴的。
OpenGLES其实是一个状态机(Statemachine),它保存一种状态直至其改变。
每个状态都有本身默认的缺省值,可以通过相关的查询和设置函数进行相关的查询和设置。
大多数的OpenGLES的应用都采用的是相同的操作顺序,这一系列的处理阶段被称作OpenGLES的渲染管线(pipeline)。
二、OpenGLES的处理流程
2.1固定渲染管线流程:
1)PrimitiveProcessing:
这一步是图元运算过程,所谓图元,其实就是一个点集。
在OpenGLES中,所有的物体,几何元素最终都是以顶点的形式表述的。
一般来说,这些顶点将会产生三角形、直线或点。
它做的工作就是将顶点提供给顶点处理器进行处理。
顶点的数据包括顶点的位置(空间坐标)、大小、颜色、顶点的法向量(用于光照计算)、纹理坐标(可能有多个)等等。
2)TransformandLighting:
这一步是转换和光照过程。
其中Transform是通过模型、视图、投影变换矩阵,将所有的顶点坐标变换成人眼坐标系下的一致坐标。
变换矩阵同样会改变物体的顶点法向量。
如果激活了纹理,还可以进行纹理坐标转换,以及自动纹理坐标的生产。
Lighting处理的就是光照部分,它会利用光源、材质、转换后的顶点位置和法向量计算每个顶点的颜色值。
3)PrimitiveAssembly:
图元装配过程。
管线中这个流程是对所有的点数据进行点线面等基础图元的组装。
这个过程会对所有的图元进行剪切和筛选。
对于不在视区空间中的部分进行剪切,对于不可见的面进行筛选。
4)Resterizar:
光栅化。
光栅化的过程就是对所有的经过PrimitiveAssembly图元转换成屏幕上可以显示的二维Fragment(片元)。
片元和将要显示的像素一一对应。
5)TextureEnvironment:
纹理处理。
利用纹理坐标来进行纹理的相关处理。
6)ColourSum:
颜色叠加。
根据纹理颜色等相关属性确定最终的顶点颜色。
7)Fog:
雾。
雾化处理。
8)AlphaTest:
Alpha测试。
判断某些片元是否抛弃。
比如可以规定Alpha小于0.2的片元就需要抛弃。
9)DepthStencil:
深度测试和模板测试。
深度测试需要一个深度缓冲区,是在后面的会被在前的遮盖,需要抛弃。
模板测试需要一个模板缓冲区,也就是模板缓冲区中为每个像素保存了一个“模板值”,当像素需要进行模板测试时,将设定的模板参考值与该像素的“模板值”进行比较,符合条件的通过测试,不符合条件的则被丢弃,不进行绘制。
条件的设置与Alpha测试中的条件设置相似。
但注意Alpha测试中是用浮点数来进行比较,而模板测试则是用整数来进行比较。
10)ColorBufferblend:
跟颜色缓冲区进行混合。
最终生成的片元颜色需要跟颜色缓冲区中本来的进行混合(也可以理解成为跟背景混合),以生成最终的颜色。
11)Dither:
抖动。
在可用颜色数量较少的系统中,可能需要对颜色值进行抖动,在适当损失颜色质量的情况下增加可使用的颜色数量。
12)FrameBuffer:
最终结果就写进了FrameBuffer。
一个流程就算结束了。
2.2可编程渲染管线流程
对比固定渲染管线流程图和可编程渲染管线流程图,可以看出来,大部分的流程都是一样的,只是可编程将固定中的几个功能合并了,新增了两个新的流程,VertexShader和FragmentShader。
也就是着色器(shader)
作为OpenGLES2.0的一部分,着色器允许应用程序显式地指定处理顶点和片断时候所执行的操作。
Shaderlanguage简介:
编写OpenGLES程序使用的着色器类似于使用基于编译器的语言(比如C语言)编写程序。
我们需要用编译器来分析程序,检查它所存在的错误,并把它转换成为目标代码。
接着,在链接阶段,链接器把一组目标文件组合在一起,形成一个可执行的程序。
着色器的创建流程如下:
对于每个着色器对象:
1.创建一个着色器对象。
2.把着色器源代码编译为目标代码。
3.验证这个着色器已经成功通过编译。
然后,为了把多个着色器对象链接到一个着色器程序中,需要:
1.创建一个着色器程序。
2.把适当的着色器对象连接到这个着色器程序中。
3.链接着色器程序。
4.验证着色器程序链接成功。
5.使用着色器进行顶点或片段处理。
1)VertexShader:
包含了固定渲染管线中的Transformandlighting的所有操作。
2)FragmentShader:
包含了固定渲染管线中的纹理处理、颜色叠加、雾、alpha测试等内容。
具体着色器语言和两个着色器的使用,可见后续的sample分析。
三、EGL简介
OpenGL实现跨平台的功能,在不同的操作系统上需要不同的类似适配层的内容,比如在Windows操作系统上需要WGL。
同样的,OpenGLES是一个平台中立的图形库,在它能够工作前,需要与一个实际的窗口关联起来,但是,与OpenGL不一样的是,OpenGL是每个窗口系统需要一个与之对应的适配层,Windows需要WGL,X-Window需要xgl,MacOS需要agl。
而OpenGLES的这层,是统一的一个标准。
这个标准就是EGL。
(一)初识EGL
EGL是介于RenderAPI(比如OpenGLES和OpenVG)和本地基础系统的一套接口。
里面涉及了OpenGLES和OpenVG的一些相关描述,所以需要和OpenGLES和OpenVG文档一起阅读。
EGL使用OpenGLES的命名习惯来命名函数入口和宏定义。
具体的接口和相关宏定义可以参见egl.h。
(二)EGL的使用
1.获取Display:
Display代表的是显示器,有的系统上有多个显示器,也就会有多个display。
获得Display需要调用EGLDisplayeglGetDisplay(EGLNativeDisplayTypedisplay_id);
,参数一般为EGL_DEFAULT_DISPLAY。
该参数的实际意义是平台相关的,比如在windows平台上,一般返回的就是DC。
沃Phone上就是TDC。
2.初始化egl:
获得了Display后,调用EGLBooleaneglInitialize(EGLDisplaydpy,EGLint*major,EGLint*minor);
该函数会进行一些相关的内部初始化工作。
我们可以通过这个函数获得egl的版本号。
3.选择Config:
Config实际就是FrameBuffer的参数,在Windows下对应于PixelFormat,在X-Window下对应Visual。
可以用函数EGLBooleaneglChooseConfig(EGLDisplaydpy,constEGLint*attrib_list,EGLConfig*configs,EGLintconfig_size,EGLint*num_config);
,其中attrib_list是以EGL_NONE结束的参数数组,通常以id,value依次存放,对于个别标识性的属性可以只有id,没有value。
另一个办法是用EGLBooleaneglGetConfigs(EGLDisplaydpy,EGLConfig*configs,EGLintconfig_size,EGLint*num_config);
来获得所有config。
这两个函数都会返回不多于config_size个Config,结果保存在configs[]中,系统的总Config个数保存在num_config中。
可以利用eglGetConfig()中间两个参数为0来查询系统支持的Config总个数。
Config有众多的Attribute,这些Attribute决定FrameBuffer的格式和能力,通过eglGetConfigAttrib()来读取,但不能修改。
4.构造Surface:
有了Config,就可以开始构造Surface了。
Surface实际上就是一个FrameBuffer。
通过函数EGLSurfaceeglCreateWindowSurface(EGLDisplaydpy,EGLConfigconfig,EGLNativeWindowTypewin,constEGLint*attrib_list)可以创建一个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:
OpenGLES的pipeline从程序的角度看就是一个状态机,有当前的颜色、纹理坐标、变换矩阵、渲染模式等一大堆状态,这些状态作用于程序提交的顶点坐标等图元从而形成帧缓冲内的像素。
在OpenGLES的编程接口中,Context就代表这个状态机,程序的主要工作就是向Context提供图元、设置状态,偶尔也从Context里获取一些信息。
用EGLContexteglCreateContext(EGLDisplaydpy,EGLSurfacewrite,EGLSurfaceread,EGLContext*sha
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- OpenGL ES入门 ES 入门