`
wjlgryx
  • 浏览: 306671 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论
阅读更多
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 ES。OpenGL ES是一套为手持和嵌入式系统设计的3D引擎API,由Khronos公司维护。在PC领域,一直有两种标准的3D API进行竞争,OpenGL 和 DirectX。一般主流的游戏和显卡都支持这两种渲染方式,DirectX在Windows平台上有很大的优势,但是 OpenGL 具有更好的跨平台性。
由于嵌入式系统和PC相比,一般说来,CPU、内存等都比PC差很多,而且对能耗有着特殊的要求,许多嵌入式设备并没有浮点运算协处理器,针对嵌入式系统的以上特点,Khronos对标准的 OpenGL 系统进行了维护和改动,以期望满足嵌入式设备对3D绘图的要求。
4、 Android OpenGL ES 简介
Android系统使用 OpenGL 的标准接口来支持3D图形功能,android 3D 图形系统也分为 java 框架和本地代码两部分。本地代码主要实现的 OpenGL 接口的库,在 Java 框架层,javax.microedition.khronos.opengles 是 java 标准的 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(GL10 gl)
{
}
public void onSurfaceChanged(GL10 gl, int width, int height)
{}
public void onSurfaceCreated(GL10 gl, EGLConfig config)
{}

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 类在实现了上面的三个重写之后,在程序入口中只需要调用

Renderer render=new ThreeDGl(this);
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        GLSurfaceView gview=new GLSurfaceView(this);
        gview.setRenderer(render);
        setContentView(gview);
    }

即可将我们绘制的图形显示出来。
下面分享一段使用Renderer类绘制的三角形和四边形的代码:

OpenGL 参考代码
package com.terry;

import java.nio.IntBuffer;

import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;

import android.opengl.GLSurfaceView.Renderer;

public class GLRender implements Renderer{

    float rotateTri,rotateQuad;
    int one=0x10000;
   
    //三角形的一个顶点
    private IntBuffer triggerBuffer=IntBuffer.wrap(new int[]{
            0,one,0,     //上顶点
            -one,-one,0,    //左顶点
            one,-one,0    //右下点
    });
   
    //正方形的四个顶点
    private IntBuffer quateBuffer=IntBuffer.wrap(new int[]{
            one,one,0,
            -one,-one,0,
            one,-one,0,
            -one,-one,0
    });
   
   
    private IntBuffer colorBuffer=IntBuffer.wrap(new int[]{
            one,0,0,one,
            0,one,0,one,
            0,0,one,one
    });
   
   
   
    @Override
    public void onDrawFrame(GL10 gl) {
        // TODO Auto-generated method stub
       
        // 清除屏幕和深度缓存
        gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
        // 重置当前的模型观察矩阵
        gl.glLoadIdentity();


        // 左移 1.5 单位,并移入屏幕 6.0
        gl.glTranslatef(-1.5f, 0.0f, -6.0f);
         //设置旋转
        gl.glRotatef(rotateTri, 0.0f, 1.0f, 0.0f);
       
        //设置定点数组
        gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
        //设置颜色数组
        gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
       
        gl.glColorPointer(4, GL10.GL_FIXED, 0, colorBuffer);
        // 设置三角形顶点
        gl.glVertexPointer(3, GL10.GL_FIXED, 0, triggerBuffer);
        //绘制三角形
        gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);
       
        gl.glDisableClientState(GL10.GL_COLOR_ARRAY);
       
        //绘制三角形结束
        gl.glFinish();
       
        /***********************/
        /* 渲染正方形 */
        // 重置当前的模型观察矩阵
        gl.glLoadIdentity();
       
        // 左移 1.5 单位,并移入屏幕 6.0
        gl.glTranslatef(1.5f, 0.0f, -6.0f);
       
        // 设置当前色为蓝色
        gl.glColor4f(0.5f, 0.5f, 1.0f, 1.0f);
        //设置旋转
        gl.glRotatef(rotateQuad, 1.0f, 0.0f, 0.0f);
       
        //设置和绘制正方形
        gl.glVertexPointer(3, GL10.GL_FIXED, 0, quateBuffer);
        gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);
       
        //绘制正方形结束
        gl.glFinish();

        //取消顶点数组
        gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
       
        //改变旋转的角度
        rotateTri += 0.5f;
        rotateQuad -= 0.5f;
    }

    @Override
    public void onSurfaceChanged(GL10 gl, int width, int height) {
        // TODO Auto-generated method stub
       
        float ratio = (float) width / height;
        //设置OpenGL场景的大小
        gl.glViewport(0, 0, width, height);
        //设置投影矩阵
        gl.glMatrixMode(GL10.GL_PROJECTION);
        //重置投影矩阵
        gl.glLoadIdentity();
        // 设置视口的大小
        gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10);
        // 选择模型观察矩阵
        gl.glMatrixMode(GL10.GL_MODELVIEW);   
        // 重置模型观察矩阵
        gl.glLoadIdentity();   
       
    }

    @Override
    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
        // TODO Auto-generated method stub
        // 启用阴影平滑
        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);
    }

}
分享到:
评论

相关推荐

    Android OpenGL ES 简明开发教程

    ### Android OpenGL ES 开发教程详解 #### 概述与历史沿革 OpenGL ES(OpenGL for Embedded Systems)作为OpenGL API的子集,专为移动设备、PDA和游戏主机等嵌入式系统设计,旨在简化3D图形应用的开发流程。自2003...

    Android OpenGl ES绘制圆点与优化圆点锯齿

    在Android平台上,OpenGL ES是一种广泛使用的图形库,用于在移动设备上实现高性能的2D和3D图形渲染。本文将深入探讨如何使用OpenGL ES来绘制圆点,并介绍一种方法来优化圆点边缘的锯齿问题,提升视觉效果。 首先,...

    Android OpenGL 游戏引擎

    Android OpenGL 游戏引擎是基于OpenGL ES的框架,用于简化游戏开发过程,让开发者能够更高效地构建高性能的游戏应用。 一、Android OpenGL ES基础知识 1. **OpenGL ES API**:OpenGL ES 是 OpenGL 的子集,专为...

    android OpenGL绘制立体图形

    android OpenGL技术绘制一个旋转的3d立方体

    Android OpenGL ES 绘制立方体 球体 圆柱 等几何形状

    OpenGL ES 是一种在嵌入式设备上广泛使用的图形库,特别是在Android系统中,它用于创建复杂的3D图形和动画。Android OpenGL ES 提供了一个接口,让开发者能够利用硬件加速的图形处理能力,来绘制出立方体、球体、...

    androidOpenGL实现3d动画

    这是用androidOpenGL 实现的3D 动画 导入工程即可运行。

    android OpenGL 3D骰子

    在Android平台上,OpenGL ES(OpenGL for Embedded Systems)被广泛使用,它是OpenGL的一个精简版,专门针对移动设备和嵌入式系统设计。在这个"android OpenGL 3D骰子"项目中,我们将探讨如何利用OpenGL ES在Android...

    android opengl 立方体 免费

    在Android平台上,OpenGL ES(Embedded Systems的缩写)被广泛应用于游戏开发、3D渲染等场景,它是OpenGL的一个子集,专为移动设备设计。本资源是一个适合初学者的Android OpenGL ES教程,通过构建一个简单的立方体...

    Android OpenGL 教程(1-5)

    Android OpenGL教程是开发者学习如何在Android设备上使用OpenGL ES进行图形编程的重要资源。 本教程系列共分为5个部分,从基础到进阶,逐步讲解OpenGL ES在Android上的应用: 1. GLLesson01:入门基础 这一课主要...

    android opengl原理分析

    ### Android OpenGL原理分析 #### OpenGL概述 OpenGL,全称Open Graphics Library,是一种跨语言、跨平台的应用程序编程接口(API),用于渲染2D、3D矢量图形。它由一系列函数组成,允许开发者通过调用这些函数来...

    android opengl 开发的小游戏

    本项目"android opengl 开发的小游戏"就是一个基于OpenGL ES开发的赛车游戏,名为"Countryside Racing",让我们来深入探讨一下这个项目可能涉及的关键技术和知识点。 1. **OpenGL ES基础**: - **顶点坐标系统**:...

    Android OpenGL的一个简单的例子.zip

    这个"Android OpenGL的一个简单的例子.zip"文件包含了一个基本的Android OpenGL应用实例,帮助开发者了解如何在Android设备上使用OpenGL ES。 首先,我们需要了解OpenGL ES的基本概念。OpenGL ES是OpenGL的精简版,...

    android opengl学习文档

    在Android平台的OpenGL ES开发中,Buffer的使用对于图形性能的优化至关重要。Buffer是内存中的一个连续区域,用于暂存图像数据,如顶点坐标、颜色、纹理坐标等,以便GPU高效读取。 Buffer在OpenGL ES中的使用主要是...

    Android OpenGL纹理的编程框架

    OpenGL是计算机图形学中的一个强大的库,用于在各种平台,包括Android,上创建3D和2D图形。在Android中,OpenGL ES(Embedded Systems的版本)被广泛使用,特别是对于游戏开发和复杂图形渲染。本篇文章将深入探讨...

    android opengl 贝塞尔曲线

    一个在android opengl 上实现的 贝塞尔曲线

    android openGl es2.0以画线的模式画成一个矩形 只有4条边中间透明

    android openGl es2.0以画线的模式画成一个矩形 只有4条边中间透明

    Android OpenGL 教程(6-10)

    这个系列的教程,"Android OpenGL 教程(6-10)",是从经典的Nehe OpenGL教程移植到Android平台的,旨在帮助开发者理解和掌握Android上的OpenGL ES编程。 Lesson 6: "深度缓冲(Depth Buffer)" 深度缓冲是OpenGL中...

    android OPenGL基础范例一

    在Android平台上,OpenGL ES(OpenGL for Embedded Systems)是其对应的版本,专为移动设备和嵌入式系统设计,它在Android系统中广泛用于游戏、图形应用和其他需要高性能图形处理的场景。 在“android OpenGL基础...

    Android OpenGL 示例程序

    Android OpenGL 3D开发,示例程序,简单实用

Global site tag (gtag.js) - Google Analytics