转自:http://www.cnblogs.com/TerryBlog/archive/2010/07/09/1774475.html

1、什么是 OpenGL?

  OpenGL是个专业的3D程序接口,是一个功能强大,调用方便的底层3D图形库。OpenGL 的前身是 SGI 公司为其图形工作站开的 IRIS GL。IRIS GL 是一个工业标准的3D图形软件接口,功能虽然强大但是移植性不好,于是 SGI 公司便在 IRIS GL 的基础上开发OpenGL 。具体详细的介绍请点击这里。

2、OpenGL 的发展历程

  1992年7月 发布了OpenGL 1.0版本,并与微软共同推出 Windows NT 版本的OpenGL

  1995年OpenGL 1.1版本面市,加入了新功能,并引入了纹理特性等等。

  一直到 2009年8月Khronos小组发布了OpenGL3.2,这是一年以来OpenGL进行的第三次重要升级。

具体特点及功能、OpenGL现状、发展历程、OpenGL规范、编程入门请点击这里。

3、OpenGL ES 简介

Android 3D引擎采用的是OpenGL ESOpenGL ES是一套为手持和嵌入式系统设计的3D引擎API,由Khronos公司维护。在PC领域,一直有两种标准的3D API进行竞争,OpenGLDirectX。一般主流的游戏和显卡都支持这两种渲染方式,DirectXWindows平台上有很大的优势,但是OpenGL具有更好的跨平台性。

由于嵌入式系统和PC相比,一般说来,CPU、内存等都比PC差很多,而且对能耗有着特殊的要求,许多嵌入式设备并没有浮点运算协处理器,针对嵌入式系统的以上特点,Khronos对标准的OpenGL系统进行了维护和改动,以期望满足嵌入式设备对3D绘图的要求。

4、Android OpenGL ES简介

Android系统使用OpenGL的标准接口来支持3D图形功能,android 3D图形系统也分为java框架和本地代码两部分。本地代码主要实现的OpenGL接口的库,在Java框架层,javax.microedition.khronos.openglesjava标准的OpenGL包,android.opengl包提供了OpenGL系统和Android GUI系统之间的联系。

5、Android 支持 OpenGL 列表

  • 1、GL
  • 2、GL 10
  • 3、GL 10 EXT
  • 4、GL 11
  • 5、GL 11 EXT
  • 6、GL 11 ExtensionPack

我们将使用 GL10 这个类开始接触OpenGL,探索3D 领域。

6、一步一步实现自己的 Renderer 类

在 Android 中我们使用 GLSurfaceView 来显示OpenGL视图,该类位于 android.opengl 包里面。它提供了一个专门用于渲染3D 的接口 Renderer 。接下来我们就来一步步构建自己的 Renderer 类。

  • 1、为 Renderer 类赶回命名空间
    import android.opengl.GLSurfaceView.Renderer;

  • 2、新建一个类来实现 Renderer 接口,代码如下:
    public class ThreeDGl implements Renderer
    {
    }

  • 3、如上代码所写,程序实现了 Renderer 类,则必须重写以下方法
    public void onDrawFrame(GL10gl)
    {
    }
    public void onSurfaceChanged(GL10gl, int width, int height)
    {}
    public void onSurfaceCreated(GL10gl,EGLConfigconfig)
    {}

  • 4、当窗口被创建时需要调用 onSurfaceCreate ,我们可以在这里对OpenGL做一些初始化工作,例如:
    // 启用阴影平滑
    gl.glShadeModel(GL10.GL_SMOOTH);

    // 黑色背景
    gl.glClearColor( 0 , 0 , 0 , 0 );

    // 设置深度缓存
    gl.glClearDepthf( 1.0f );
    // 启用深度测试
    gl.glEnable(GL10.GL_DEPTH_TEST);
    // 所作深度测试的类型
    gl.glDepthFunc(GL10.GL_LEQUAL);

    // 告诉系统对透视进行修正
    gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT,GL10.GL_FASTEST);

    glHint 用于告诉OpenGL我们希望进行最好的透视修正,这会轻微地影响性能,但会使得透视图更好看。
    glClearColor 设置清除屏幕时所用的颜色,色彩值的范围从 0.0f~1.0f 大小从暗到这的过程。
    glShadeModel 用于启用阴影平滑度。阴影平滑通过多边形精细地混合色彩,并对外部光进行平滑。
    glDepthFunc 为将深度缓存设想为屏幕后面的层,它不断地对物体进入屏幕内部的深度进行跟踪。
    glEnable 启用深度测试。
  • 5、当窗口大小发生改变时系统将调用 onSurfaceChange 方法,可以在该方法中设置OpenGL场景大小 ,代码如下:
    // 设置OpenGL场景的大小
    gl.glViewport( 0 , 0 ,width,height);

  • 6、场景画出来了,接下来我们就要实现场景里面的内容,比如:设置它的透视图,让它有种越远的东西看起来越小的感觉,代码如下:
    // 设置投影矩阵
    gl.glMatrixMode(GL10.GL_PROJECTION);
    // 重置投影矩阵
    gl.glLoadIdentity();
    // 设置视口的大小
    gl.glFrustumf( - ratio,ratio, - 1 , 1 , 1 , 10 );
    // 选择模型观察矩阵
    gl.glMatrixMode(GL10.GL_MODELVIEW);
    // 重置模型观察矩阵
    gl.glLoadIdentity();

    gl.glMatrixMode(GL10.GL_PROJECTION); 指明接下来的代码将影响 projection matrix (投影矩阵),投影矩阵负责为场景增加透视度。
    gl.glLoadIdentity(); 此方法相当于我们手机的重置功能,它将所选择的矩阵状态恢复成原始状态,调用glLoadIdentity(); 之后为场景设置透视图。
    gl.glMatrixMode(GL10.GL_MODELVIEW);指明任何新的变换将会影响 modelview matrix (模型观察矩阵)。
    gl.glFrustumf(-ratio,ratio,-1,1,1,10);此方法,前面4个参数用于确定窗口的大小,而后面两个参数分别是在场景中所能绘制深度的起点和终点。
  • 7、了解了上面两个重写方法的作用和功能之后,第三个方法 onDrawFrame 从字面上理解就知道此方法做绘制图操作的。嗯,没错。在绘图之前,需要将屏幕清除成前面所指定的颜色,清除尝试缓存并且重置场景,然后就可以绘图了, 代码如下:
    // 清除屏幕和深度缓存
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
    // 重置当前的模型观察矩阵
    gl.glLoadIdentity();

  • 8、Renderer 类在实现了上面的三个重写之后,在程序入口中只需要调用
    Rendererrender = new ThreeDGl( this );
    /** Calledwhentheactivityisfirstcreated. */
    @Override
    public void onCreate(BundlesavedInstanceState){
    super .onCreate(savedInstanceState);
    GLSurfaceViewgview
    = new GLSurfaceView( this );
    gview.setRenderer(render);
    setContentView(gview);
    }

    即可将我们绘制的图形显示出来。

下面分享一段使用Renderer类绘制的三角形和四边形的代码:

更多相关文章

  1. Android使用代码实现左右半圆的按钮背景
  2. Android(安卓)cupcake源代码获取和编译 for Ubuntu 9.04
  3. android有用代码片段(一)
  4. Android(安卓)上的 Scala, 实战之路(二)——Hello World即遭不测
  5. Android(安卓)从一个App跳转到另一个App
  6. 用 Handler 轻松实现专属Android定时器
  7. Android5.1.1-APK签名校验分析和修改源码绕过签名校验
  8. Android项目Tab类型主界面大总结 Fragment+TabPageIndicator+Vie
  9. android NDK开发中,用Cygwin调试本地代码时报错“Another debug s

随机推荐

  1. Android新浪微博登陆和获取个人信息
  2. 2015最新的 导航条《actionbar》给大家分
  3. Android和C#基于UDP的实时图像传输
  4. Android判断网络状态方法详解
  5. 第十天android:寻找UI
  6. android 进程间的内存分配
  7. Android的消息提示框,ImageView,进度条
  8. android AudioRecorder简单心得
  9. Android 模拟器下载、编译及调试
  10. 捕获android中的Home key