`
isiqi
  • 浏览: 16466147 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

Android OpenGL 学习笔记 --开始篇

阅读更多

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小组发布了OpenGL 3.2,这是一年以来OpenGL进行的第三次重要升级。

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

3、OpenGL ES 简介

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

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

4、Android OpenGL ES 简介5、Android 支持 OpenGL 列表

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

  • 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 类赶回命名空间
    <!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->importandroid.opengl.GLSurfaceView.Renderer;
  • 2、新建一个类来实现 Renderer 接口,代码如下:
    <!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->publicclassThreeDGlimplementsRenderer
    {
    }
  • 3、如上代码所写,程序实现了 Renderer 类,则必须重写以下方法
    <!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->publicvoidonDrawFrame(GL10gl)
    {
    }
    publicvoidonSurfaceChanged(GL10gl,intwidth,intheight)
    {}
    publicvoidonSurfaceCreated(GL10gl,EGLConfigconfig)
    {}
  • 4、当窗口被创建时需要调用 onSurfaceCreate ,我们可以在这里对 OpenGL 做一些初始化工作,例如:
    <!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->//启用阴影平滑
    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 场景大小 ,代码如下:
    <!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->//设置OpenGL场景的大小
    gl.glViewport(0,0,width,height);
  • 6、场景画出来了,接下来我们就要实现场景里面的内容,比如:设置它的透视图,让它有种越远的东西看起来越小的感觉,代码如下:
    <!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->//设置投影矩阵
    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 从字面上理解就知道此方法做绘制图操作的。嗯,没错。在绘图之前,需要将屏幕清除成前面所指定的颜色,清除尝试缓存并且重置场景,然后就可以绘图了, 代码如下:
    <!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->//清除屏幕和深度缓存
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT|GL10.GL_DEPTH_BUFFER_BIT);
    //重置当前的模型观察矩阵
    gl.glLoadIdentity();
  • 8、Renderer 类在实现了上面的三个重写之后,在程序入口中只需要调用
    <!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->Rendererrender=newThreeDGl(this);
    /**Calledwhentheactivityisfirstcreated.*/
    @Override
    publicvoidonCreate(BundlesavedInstanceState){
    super.onCreate(savedInstanceState);
    GLSurfaceViewgview
    =newGLSurfaceView(this);
    gview.setRenderer(render);
    setContentView(gview);
    }
    即可将我们绘制的图形显示出来。

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

分享到:
评论

相关推荐

    android OpenGL学习笔记(一)

    在本篇“Android OpenGL 学习笔记(一)”中,我们将探讨如何在Android平台上使用OpenGL ES进行图形渲染。OpenGL ES是OpenGL的一个轻量级版本,专为嵌入式系统设计,包括移动设备如智能手机和平板电脑。这篇笔记将...

    Android OpenglES 学习笔记代码

    package ljh.opengl;是对OpenglES的一些封装。 package ljh.game;是对一些游戏常用的代码的封装 都没写完! 最近改学IOS了 看看什么时候能补充完。

    Android OpenGL ES 2.0学习书籍.rar

    这本书籍“Android 3D游戏开发技术宝典 OpenGL ES2.0学习”深入浅出地介绍了如何利用OpenGL ES 2.0在Android上构建高性能、视觉震撼的游戏和应用程序。 首先,OpenGL ES 2.0相比其前代1.0,引入了重要的变化,最...

    Android开发学习笔记

    ### Android开发学习笔记知识点梳理 #### 一、Android概述与架构 - **定义与发布**:Android是由Google在2007年11月5日宣布的基于Linux平台的开源手机操作系统。它不仅用于智能手机,还广泛应用于平板电脑、可穿戴...

    Android学霸学习笔记

    根据提供的文件内容,这是一份详细的Android学习笔记,涵盖了从基础入门到高级特性的各个知识点。以下是从这些内容中提取的知识点: 1. Android入门基础: - 建立第一个App:介绍如何创建Android项目和执行程序。 ...

    Cocos2D-X开发学习笔记-渲染框架之精灵类的使用示例

    本篇笔记将深入探讨Cocos2D-X中精灵类的使用及其相关知识点。 首先,我们来了解什么是精灵。在游戏开发中,精灵通常指的是包含单一图像或者动画序列的图形对象。Cocos2D-X中的`cc::Sprite`类就是这样的一个对象,它...

    ArcGIS for android学习笔记

    本篇学习笔记主要涵盖了ArcGIS for Android的基础配置和核心组件MapVie的使用。 首先,配置ArcGIS for Android项目需要在`Project`级别的`build.gradle`文件中添加Esri的仓库,确保能获取到所需的库。接着,在`...

    Android OpenGL ES学习笔记之绘制一个立方体-附件资源

    Android OpenGL ES学习笔记之绘制一个立方体-附件资源

    很好的android学习笔记

    【Android学习笔记】 Android是一种基于Linux内核的开源操作系统,主要应用于移动设备,如智能手机和平板电脑。这个“很好的android学习笔记”包含了作者在学习Android开发过程中积累的宝贵经验,旨在帮助初学者或...

    cocos2d-x学习笔记

    《cocos2d-x学习笔记》 在学习cocos2d-x时,了解其核心组件和工作流程至关重要。AppDelegate是cocos2d-x框架中的一个关键类,它扮演着应用程序入口点的角色,处理应用程序的生命周期事件。让我们深入探讨...

    Android应用源码之android 仿真翻页效果-IT计算机-毕业设计.zip

    在Android中,可以使用Canvas和OpenGL ES进行绘制,或者利用现有的库如`PageTurner`或`android-page-curl`等来简化开发过程。 1. **视差滚动**:当用户滑动页面时,不同元素以不同的速度移动,模拟纸张被手指推动的...

    Android学习笔记——Canvas & clipRect

    这篇学习笔记将深入探讨这两个概念及其在实际应用中的使用。 首先,Canvas可以理解为画布,它是Android系统提供的用于在屏幕上绘制图形的对象。在Android中,我们可以通过Canvas来绘制各种形状,如线条、矩形、圆、...

    Cocos2d-x学习笔记

    - 学习渲染流程:Cocos2d-x使用OpenGL作为渲染接口,初学者需要学习OpenGL基础以及Cocos2d-x中的渲染流程和优化技巧。 - 掌握事件处理:游戏中的事件处理是交互的核心,需要学习如何响应用户输入和处理游戏中各种...

Global site tag (gtag.js) - Google Analytics