在android系统中有GlSurfaceView类来提供OpenGL ES开发。

下面说一下这个类的作用:
(1)在GlSurfaceView类中建立了OpenGL ES 和 View系统之间的联系;
(2)提供了可以使OpenGL ES 工作在 Activity的生命周期中的功能;
(3)更容易的选择合适的像素格式的帧缓存;
(4)创建和管理一个非主线程的单独的渲染线程,实现平滑的动画效果。
(5)提供方便的debugging工具类跟踪OpenGl API的调用,并检查错误。

通过调用类GlSurfaceView中的函数public void setRenderer(GLSurfaceView.Renderer renderer),可以建立一个OpenGL ES应用程序。

文章下面是关于Render类中函数的作用,以及函数内部具体实现的代码讲解

一: 在使用opengl前,需要对opengl作一些初始化的工作。对于一些在渲染循环过程中不经常改变的属性应该放在 渲染类Render中的函数onSurfaceCreated中:

(1)glShadeModel : 选择阴影模式 flat( GL10.GL_FLAT) 或者 smooth shading ( GL10.GL_SMOOTH )

GL10.GL_FLAT : 平面阴影模式,对点、直线、多边形采用一种颜色进行绘制,整个图元的颜色就是它任何一点的颜色。
GL10.GL_SMOOTH: 平滑阴影模式,用多种颜色进行绘制,每个顶点有单独的颜色,Opengl为顶点填充合适的颜色,使相邻的颜色值非常接近,然后向其他顶点平滑均匀插值过度颜色,出现过度的渐变效果。

OpenGL图元需要进行明暗处理,处理得模式可以为平面明暗模式或光滑(Gouraud着色)明暗模式。光滑明暗模式时,多边形各个内部点的颜色是根据各顶点指定的颜色来插值得到的,这意味着两个顶点之间的颜色是从一顶点的颜色渐变到另一顶点的颜色。对于平面明暗模式,整个图元区域的颜色就是最后一个顶点指定的颜色。但要注意,如果激活了光照,计算到的顶点颜色都是光照后的结果颜色,若光照关闭,计算到的颜色就是指定顶点时的当前颜色。

(2)glClearColor :设置清除屏幕时所用的颜色

(3)glClearDepth函数设置深度缓冲区的,它的含义就在OpenGL窗口绘制的图形深入到屏幕中的程度,深度的意义就是在三维空间中的z坐标的数值,z取0时表示在平面上,你就看不到窗口中的图形了,所以负值越小,越远离窗口平面向里,说明窗口中的图形离我们观察者的距离变远了;

(4)glEnable(GL_DEPTH_TEST): 用来开启更新深度缓冲区的功能,也就是,如果通过比较后深度值发生变化了,会进行更新深度缓冲区的操作

(5)glDepthFunc:设置更新深度缓存的条件。只有调用gl.glEnable(GL10.GL_DEPTH_TEST)函数,即启用深度缓存的情况下,这个函数才能使用。

函数的参数func,即指定什么条件下更新深度值:
GL_LESS:深度更小的情况下,更新深度缓存进行渲染。
GL_EQUAL:深度相同情况下,更新深度缓存进行渲染。
GL_LEQUAL:深度更小或者相同,更新深度缓存进行渲染。

(6)glHint:在OpenGL中,许多细节的实现算法有所不同。这样,可以调用函数glHint()对图像质量和绘制速度之间的权衡作一些控制,但并非所有的实现都采用它。

参数target指定控制行为,接受GL_FOG_HINT , GL_GENERATE_MIPMAP_HINT , GL_LINE_SMOOTH_HINT , GL_PERSPECTIVE_CORRECTION_HINT, 和 GL_POINT_SMOOTH_HINT等常量。
参数mode指定期望的行为。接受GL_FASTEST(即给出最有效的选择)、GL_NICEST(即给出最高质量的选择)、GL_DONT_CARE(即没有选择)等常量。


二: 如果你的手持设备支持横屏和竖屏的切换,在切换过程中,你需要调用函数onSurfaceChanged来设置新的比率。

(1)glMatrixMode:设置矩阵的类型,有三个模式 GL_PROJECTION 投影, GL_MODELVIEW 模型视图, GL_TEXTURE 纹理.

投影矩阵:设置这个矩阵后就开始进行投影相关的操作,也就是将物体映射到2D空间上。设置投影矩阵并且重置用户坐标后,接下来就可以写和透视相关的操作,即创建视景体。例如glFrustum()或gluPerspective(),它们生成的矩阵会与当前的矩阵相互作用,生成透视的效果;或者调用glOrtho创建正交平行矩阵,和当前的矩阵作用,生成平投影的效果。
模型矩阵:设置这个矩阵用于旋转、移动、缩放场景中的物体。
纹理矩阵:纹理也是一个矩阵,需要修改纹理的时候,需要通过glMatrixMode切换到纹理矩阵才能修改。

(2)glViewport:设置场景

glFrustum、gluPerspective、glOrtho函数只是负责使用什么样的视景体来截取图像,并不负责使用某种规则把图像呈现在屏幕上。
glViewport负责把视景体截取的图像按照怎样的高和宽显示到屏幕上。

(3)glLoadIdentity:重置当前指定的矩阵为单位矩阵,类似复位的操作。



注释: 纹理就是位图,图片上的纹理就是花纹或者图案。纹理映射将图片作为纹理贴在一个矩形上。


三:前面两个函数的功能为Opengl的操作进行铺垫,而函数onDrawFrame开始进行画图,显示效果

代码来自网站:http://insanitydesign.com/wp/projects/nehe-android-ports/