OpenGL开发-开始篇
OpenGLES简介
Android3D引擎采用的是OpenGLES。OpenGLES是一套为手持和嵌入式系统设计的3D引擎API,由Khronos公司维护。在PC领域,一直有两种标准的3DAPI进行竞争,OpenGL和DirectX。一般主流的游戏和显卡都支持这两种渲染方式,DirectX在Windows平台上有很大的优势,但是OpenGL具有更好的跨平台性。
由于嵌入式系统和PC相比,一般说来,CPU、内存等都比PC差很多,而且对能耗有着特殊的要求,许多嵌入式设备并没有浮点运算协处理器,针对嵌入式系统的以上特点,Khronos对标准的OpenGL系统进行了维护和改动,以期望满足嵌入式设备对3D绘图的要求。
AndroidOpenGLES简介Android系统使用OpenGL的标准接口来支持3D图形功能,android3D图形系统也分为java框架和本地代码两部分。本地代码主要实现的OpenGL接口的库,在Java框架层,javax.microedition.khronos.opengles是java标准的OpenGL包,android.opengl包提供了OpenGL系统和AndroidGUI系统之间的联系。
在Android中我们使用GLSurfaceView来显示OpenGL视图,该类位于android.opengl包里面。
这个类的作用:
(1)在GlSurfaceView类中建立了OpenGLES和View系统之间的联系;
(2)提供了可以使OpenGLES工作在Activity的生命周期中的功能;
(3)更容易的选择合适的像素格式的帧缓存;
(4)创建和管理一个非主线程的单独的渲染线程,实现平滑的动画效果。
(5)提供方便的debugging工具类跟踪OpenGlAPI的调用,并检查错误。
GLSurfaceView提供了一个专门用于渲染3D的接口Renderer。Renderer的作用:
一:在使用opengl前,需要对opengl作一些初始化的工作。对于一些在渲染循环过程中不经常改变的属性应该放在渲染类Render中的函数onSurfaceCreated中:
(1)glShadeModel:选择阴影模式flat(GL10.GL_FLAT)或者smoothshading(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开始进行画图,显示效果