OpenGL ES 简单教程

什么是OpenGL ES?

OpenGL ES (为OpenGL for Embedded System的缩写)为适用于嵌入式系统的一个免费二维和三维图形库。

为桌面版本OpenGL 的一个子集。

OpenGL ES 定义了一个在移动平台上能够支持OpenGL最基本功能的精简标准,以适应如手机,PDA或其它消费者移动终端的显示系统。

Khronos Group 定义和管理了OpenGL ES标准。

OpenGL 与 OpenGL ES的关系OpenGL ES 是基于桌面版本OpenGL 的:

OpenGL ES 1.0基于OpenGL 1.3 , 在2003年发布OpenGL ES 1.1 基于OpenGL 1.5 ,在2004年发布OpenGL ES 2.0基于OpenGL2.0, 在2007年发布OpenGL 2.0 向下兼容OpenGL 1.5 而 OpenGL ES 2.0 和OpenGL ES 1.x 不兼容,是两种完全不同的实现。

OpenGL ES管道(Pipeline)OpenGL ES 1.x 的工序是固定的,称为Fix-Function Pipeline,可以想象一个带有很多控制开关的机器,尽管加工的工序是固定的,但是可以通过打开或关闭开关来设置参数或者打开关闭某些功能。 OpenGL ES 2.0 允许提供编程来控制一些重要的工序,一些“繁琐”的工序比如栅格化等仍然是固定的。(这些开关被就是state,注意应该尽量少的改变state,以免影 响性能)

管道“工序”大致可以分为 Transformation Stage 和 Rasterization Stage两大步。OpenGL ES 支持的基本图形为 点Point, 线Line, 和三角形Triangle ,其它所有复制图形都是通过这几种基本几何图形组合而成。在发出绘图指令后,会对顶点(Vertices)数组进行指定的坐标变换或光照处理。顶点处理完成后,通过Rasterizer 来生成像素信息,称为”Fragments“ 。对于Fragment 在经过Texture Processing, Color Sum ,Fog 等处理并将最终处理结果存放在内存中(称为FrameBuffer)。OpenGL 2.0可以通过编程来修改上述红色的部分的步骤,称为Programmable Shader.

OpenGL ES API 命名习惯

定义的常量都以GL_为前缀。比如GL10.GL_COLOR_BUFFER_BITOpenGL ES 指令以gl开头 ,比如gl.glClearColor某些OpenGL指令以3f 或4f结尾,3和4代表参数的个数,f代表参数类型为浮点数,如gl.glColor4f ,i,x 代表 int如 gl.glColor4x对应以v结尾的OpenGL ES 指令,代表参数类型为一个矢量(Vector) ,如 glTexEnvfv所有8-bit整数对应到byte 类型,16-bit 对应到short类型,32-bit整数(包括GLFixed)对应到int类型,而所有32-bit 浮点数对应到float 类型。GL_TRUE,GL_FALSE 对应到boolean类型C字符串((char*)) 对应到Java 的 UTF-8 字符串。

创建简单的opengl es实例基本几何图形定义OpenGL ES 支持绘制的基本几何图形分为三类:点,线段,三角形。也就是说OpenGL ES 只能绘制这三种基本几何图形。任何复杂的2D或是3D图形都是通过这三种几何图形构造而成的。 OpenGL ES提供了两类方法来绘制一个空间几何图形:

public abstract void(intmode, int first, int count) 使用VetexBuffer 来绘制,顶点的顺序由vertexBuffer中的顺序指定。public abstract void(int mode, int count, int type, Buffer indices) ,可以重新定义顶点的顺序,顶点的顺序由indices Buffer 指定。

mode列表:GL_POINTS绘制独立的点、GL_LINE_STRIP绘制一条线段、GL_LINE_LOOP绘制一条封闭线段(首位相连)、GL_LINES绘制多条线段、GL_TRIANGLES绘制多个三角形(两两不相邻)、GL_TRIANGLE_STRIP绘制多个三角形(两两相邻)、GL_TRIANGLE_FAN以一个点为顶点绘制多个相邻的三角形对应顶点除了可以为其定义坐标外,还可以指定颜色,材质,法线(用于光照处理)等。 glEnableClientState 和 glDisableClientState 可以控制的pipeline开关可以有:GL_COLOR_ARRAY (颜色) ,GL_NORMAL_ARRAY (法线), GL_TEXTURE_COORD_ARRAY (材质), GL_VERTEX_ARRAY(顶点), GL_POINT_SIZE_ARRAY_OES等。 对应的传入颜色,顶点,材质,法线的方法如下: glColorPointer(int size,int type,int stride,Buffer pointer) glVertexPointer(int size, int type, int stride, Buffer pointer) glTexCoordPointer(int size, int type, int stride, Buffer pointer) glNormalPointer(int type, int stride, Buffer pointer)OpenGL ES 内部存放图形数据的Buffer有COLOR ,DEPTH (深度信息)等,在绘制图形只前一般需要清空COLOR 和 DEPTH Buffer。三维坐标系及坐标变换初步OpenGL ES图形库最终的结果是在二维平面上显示3D物体,这个过程可以分成三个部分:

坐标变换,坐标变换通过使用变换矩阵来描述,因此学习3D绘图需要了解一些空间几何,矩阵运算的知识。三维坐标通常使用齐次坐标来定义。变换矩阵操作可以分为视角(Viewing),模型(Modeling)和投影(Projection)操作,这些操作可以有选择,平移,缩放,正侧投影,透视投影等。由于最终的3D模型需要在一个矩形窗口中显示,因此在这个窗口之外的部分需要裁剪掉以提高绘图效率,对应3D图形,裁剪是将处在剪切面之外的部分扔掉。在最终绘制到显示器(2D屏幕),需要建立起变换后的坐标和屏幕像素之间的对应关系,这通常称为“视窗”坐标变换(Viewport) transformation.

如果我们使用照相机拍照的过程做类比,可以更好的理解3D 坐标变换的过程。

拍照时第一步是架起三角架并把相机的镜头指向需要拍摄的场景,对应到3D 变换为viewing transformation (平移或是选择Camera )然后摄影师可能需要调整被拍场景中某个物体的角度,位置,比如摄影师给架好三角架后给你拍照时,可以要让你调整站立姿势或是位置。对应到3D绘制就是Modeling transformation (调整所绘模型的位置,角度或是缩放比例)。之后摄影师可以需要调整镜头取景(拉近或是拍摄远景),相机取景框所能拍摄的场景会随镜头的伸缩而变换,对应到3D绘图则为Projection transformation(裁剪投影场景)。按 下快门后,对于数码相机可以直接在屏幕上显示当前拍摄的照片,一般可以充满整个屏幕(相当于将坐标做规范化处理NDC),此时你可以使用缩放放 大功能显示照片的部分。对应到3D绘图相当于viewport transformation (可以对最终的图像缩放显示等)快乐要懂得分享,才能加倍的快乐

OpenGL ES 简单教程

相关文章:

你感兴趣的文章:

标签云: