标签:画图 surface 镜面反射 定义 height dir int sla 相关
什么是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管道(Pipeline)OpenGL ES 1.x 的工序是固定的。称为Fix-Function Pipeline,能够想象一个带有非常多控制开关的机器。虽然加工的工序是固定的。可是能够通过打开或关闭开关来设置參数或者打开关闭某些功能。 OpenGL ES 2.0 同意提供编程来控制一些重要的工序。一些“繁琐”的工序比方栅格化等仍然是固定的。(这些开关被就是state,注意应该尽量少的改变state。以免影 响性能)
OpenGL ES API 命名习惯
创建简单的opengl es实例http://developer.Android.com/resources/tutorials/opengl/opengl-es10.html基本几何图形定义OpenGL ES 支持绘制的基本几何图形分为三类:点。线段。三角形。
也就是说OpenGL ES 仅仅能绘制这三种基本几何图形。不论什么复杂的2D或是3D图形都是通过这三种几何图形构造而成的。 OpenGL ES提供了两类方法来绘制一个空间几何图形:
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 transformation (平移,选择相机)和Modeling transformation(平移,选择模型)能够合并起来看,仅仅是应为向左移动相机,和相机不同将模型右移的效果是等效的。 在OpenGL ES 中。
通用的矩阵变换指令 这里介绍相应指定的坐标系(比方viewmodel, projection或是viewport) Android OpenGL ES支持的一些矩阵运算及操作。
矩阵本身能够支持加减乘除,对角线全为1的4X4 矩阵成为单位矩阵Identity Matrix 。
方法public abstract void glTranslatef (float x, float y, float z) 用于坐标平移变换。 方法public abstract void glRotatef(float angle, float x, float y, float z)用来实现选择坐标变换,单位为角度。
(x,y,z)定义旋转的參照矢量方向。
多次旋转的顺序很重要。
方法public abstract void glScalef (float x, float y, float z)用于缩放变换。
在进行平移。旋转,缩放变换时,全部的变换都是针对当前的矩阵(与当前矩阵相乘)。假设须要将当前矩阵回复最初的无变换的矩阵,能够使用单位矩阵(无平移,缩放。旋转)。 public abstract void glLoadIdentity()。 在栈中保存当前矩阵和从栈中恢复所存矩阵,能够使用public abstract void glPushMatrix() 和public abstract void glPopMatrix()。 在进行坐标变换的一个好习惯是在变换前使用glPushMatrix保存当前矩阵,完毕坐标变换操作后,再调用glPopMatrix恢复原先的矩阵设置。Viewing和Modeling(MODELVIEW) 变换 ndroid OpenGL ES 的GLU包有一个辅助函数gluLookAt提供一个更直观的方法来设置modelview 变换矩阵: void gluLookAt(GL10 gl, float eyeX, float eyeY, float eyeZ, float centerX, float centerY, float centerZ, float upX, float upY, float upZ)
投影变换Projection
投影变换则相应于调整相机镜头远近来取景。 以下代码设置当前Matrix模式为Projection投影矩阵: gl.glMatrixMode(GL_PROJECTION); gl.glLoadIdentity(); OpenGL ES能够使用两种不同的投影变换:透视投影(Perspective Projection)和正側投影(Orthographic Projection)。Android OpenGL ES提供了一个辅助方法gluPerspective()能够更简单的来定义一个透视投影变换: GLU.gluPerspective(GL10 gl, float fovy, float aspect, float zNear, float zFar)
就是后面距离原点的距离
正側投影(Orthographic Projection) 正側投影,它的视锥为一长方体,特点是物体的大小不随到观測点的距离而变化,投影后能够保持物体之间的距离和夹角。
定义3D模型的前面和后面以下代码设置逆时针方法为面的“前面”:gl.glFrontFace(GL10.GL_CCW); 打开 忽略“后面”设置:gl.glEnable(GL10.GL_CULL_FACE);然后明白指明“忽略“哪个面的代码例如以下: gl.glCullFace(GL10.GL_BACK); FrameBuffer、Depth BufferOpenGL ES 中的FrameBuffer 指的是存储像素的内存空间。相应一个二维图像。假设屏幕分辨率为1280X1024 ,假设屏幕支持24位真彩色 (RGB),则存储这个屏幕区域的内存至少须要1024X1280X3个字节。此外假设须要支持透明度(Alpha),则一个像素须要4个字节。 在终于OpenGL ES写入这些Buffer时,OpenGL ES提供一些Mask 函数能够控制Color Buffer 中RGBA通道,是否同意写入Depth Buffer 等,这些Mask 函数能够打开或是关闭某个通道,仅仅有通道打开后,相应的分量才会写入指定Buffer,比方你能够关闭红色通道。这样最后写道Color Buffer中就不含有红色。
OpenGL ES 中Depth Buffer 保存了像素与观測点之间的距离信息,在绘制3D图形时,将仅仅绘制可见的面而不去绘制隐藏的面。这个过程叫”Hidden surface removal” ,採用的算法为”The depth buffer algorithm”。The depth buffer algorithm 在OpenGL ES 3D绘制的过程中这个算法是自己主动被採用的,可是了解这个算法有助于理解OpenGL ES 部分API的使用。 以下给出了OpenGL ES中与Depth Buffer相关的几个方法:
OpenGL光照模型 为了能看出3D效果。给场景中加入光源。
假设没有光照,绘出的球看上去和一个二维平面上圆没什么区别 OpenGL 光照模型中终于的光照效果能够分为四个组成部分:Emitted(光源), ambient(环境光),diffuse(漫射光)和specular(镜面反射光),终于结果由这四种光叠加而成。
specular : 一般指物体被光源直射的高亮区域,也能够成为镜面反射区。如金属。specular依赖于光源的方向,法线的方向和视角的方向。 设置光照效果Set LightingOpenGL ES API怎样使用光照效果:
OpenGL ES光源能够分为
三维平面的法线是垂直于该平面的三维向量。曲面在某点P处的法线为垂直于该点切平面的向量 打开法线数组gl.glEnableClientState(GL10.GL_NORMAL_ARRAY); 和设置颜色类似,有两个方法能够为平面设置法线,一是public void glNormal3f(float nx,float ny,float nz) 这种方法为兴许全部平面设置相同的方向,直到又一次设置新的法线为止。 为某个顶点设置法线:public void glNormalPointer(int type,int stride, Buffer pointer)
同一时候能够打开缩放法线设置gl.glEnable(GL10.GL_RESCALE_NORMAL); 设置物体材料光学属性设置物体表面材料(Material)的反光属性(颜色和材质)的方法例如以下: gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_AMBIENT, ambient, 0); gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_DIFFUSE, diffuse, 0); gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_SPECULAR, specular, 0); gl.glEnable(GL10.GL_COLOR_MATERIAL); 此外,方法glLightModleXX给出了光照模型的參数 public void glLightModelf(int pname,float param) public void glLightModelfv(int pname,float[] params,int offset) public void glLightModelfv(int pname,FloatBuffer params)
而另外和传统 OpenGL 在开发上差异较大的部分,包含了:
在 OpenGL ES 2.0 裡也没有 OpenGL 的 matrix stack,程式开发人员必需要自行计算投影矩阵以及各物件的 transform matrix,再传到 shader 裡做计算;尽管在 GPU 端的程式是有矩阵计算的功能。可是在 CPU 端就需要自己实作矩阵计算的基本演算法了。
在 OpenGL ES 裡没有 glBegin() / glEnd() 这样的 immediate mode 的函式,vertex 资料必须用 buffer object 或 vertex array 来处理。
取消了 GL_QUADS / GL_POLYGONS 这两种 primitive 类型。
vertex 的全部资讯(包括本身的位置、颜色、normal 等等)都变成以抽象的 vertex attrib 来处理,须要自行定义并在 vertex shader 裡计算。
Lighting、material 也都是以抽象的形式,以 uniform 变数形式传进 shader 并自行计算。
这些仅仅是一些比較大的差异,其它另一些地方也都不一样,就不在这边列举了。而实际上,以这些部份来看,OpenGL ES 2.0 在概念上与其说是接近 OpenGL 2.0,事实上更接近 OpenGL 3.x 的 Core profile 了~所以基本上以 OpenGL 3.0 的概念来写 OpenGL ES 2.0 的程式,应该会更为适合;仅仅是 OpenGL ES 2.0 的功能又比 OpenGL 3.x 少了些就是了。
标签:画图 surface 镜面反射 定义 height dir int sla 相关
原文地址:http://www.cnblogs.com/wzjhoutai/p/6736827.html