2013-06-30

Android OpenGL 开发

Android提供OpenGL包,专门用于3D的加速和渲染等。

OpenGL, Open Graphics Library, 是一个专业的图形程序接口,是一个功能强大、调用方便的底层图形库。

OpenGL ES ,基于OpenGL API设计,是OpenGL三维图形API的子集,是专为内嵌和移动设备设计的一个2D/3D轻量图形库。

OpenGL ES 1.0  基于OpenGL 1.3,OpenGL ES 1.1 基于 OpenGL 1.5,OpenGL ES 2.0 基于 OpenGL 2.0。

 

1. Android构建一个3D开发的基本框架

// 导入库

import javax.microedition.khronos.opengles.GL10;

// 实例化OpenGLContext

GL10 gl = (GL10) mOpenGLContext.getGL();

// 在onDraw方法开始

mOpenGLContext.waitNative();

// 在onDraw方法结束

mOpenGLContext.waitGL();

GLSurfaceView包含一个专门用于渲染3D的接口Renderer

// 引入Renderer

import android.opengl.GLSurfaceView.Renderer;

// 创建Renderer接口的一个实现类

public class GLRender implements Renderer

// 在GLRender类中,实现三个抽象方法

public void onDrawFrame(GL10 gl);

// 窗口发生改变

public void onSurfaceChanged(GL10 gl, int width, int height);

// 窗口创建

public void onSurfaceCreated(GL10 gl, EGLConfig config);

// 在onSurfaceCreated方法中初始化

// 修正透视

gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);

// R, G, B, A

gl.glClearColor(0, 0, 0, 0);

// 阴影平滑

gl.glShadeModel(GL10.GL_SMOOTH);

// 设置深度缓存

gl.glClearDepthf(1.0f);

// 启用深度测试

gl.glEnable(GL10.GL_DEPTH_TEST);

// 深度测试类型

gl.glDepthFunc(GL10.GL_LEQUAL);

// 在onSurfaceChanged方法中

// 设置OpenGL场景的大小

gl.glViewport(0, 0, width, height);

// 为屏幕设置透视图,意味着越远的东西看起来越小

// 投影矩阵负责为场景增加透视

gl.glMatrixModel(GL10.GL_PROJECTION);

// 将所选的矩阵状态恢复成原始状态

gl.glLoadIdentity();

// 设置视口的大小

// 前面4个参数确定窗口大小,后面两个参数确定深度的起点和终点

gl.glFrustumf(-ratio, ratio, –1, 1, 1, 10);

// 指明任何新的变化将影响ModelView Matrix

gl.glMatrixModel(GL10.GL_MODELVIEW);

// 恢复成原始状态

gl.glLoadIdentity();

// 在onDrawFrame方法中

// 清除屏幕和深度缓存

gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);

gl.glLoadIdentity();

// 设置Renderer

Renderer render = new GLRender();

GLSurfaceView glView = new GLSurfaceView(this);

glView.setRenderer(render);

setContentView(glView);

 

2. 多边形

在OpenGL中绘制的任何模型都会被分解成三角形、四边形。

OpenGL坐标系:调用glLoadIdentity()之后,当前点移到屏幕中心,x坐标轴从左至右,y坐标轴从下至上,z坐标轴从里往外。

在3D空间中,三角形每个顶点由(x, y, z)组成。

// 平移操作

gl.glTranslatef(-1.5f, 0.0f, –6.0f);

// 开启顶点设置功能

gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);

// 设置顶点数据

gl.glVertexPointer(int size, int type, int stride, Buffer pointer)

gl.glVertexPointer(3, GL10.GL_FIXED, 0, triggerBuffer);

参数1:size, 用于描述顶点的尺寸,(x,y,z)坐标系,所以是3

参数2:type, 描述顶点的类型

参数3:stride, 描述了步长

参数4:pointer, 顶点缓存,即我们创建的顶点数组

// 三角形的三个顶点

private IntBuffer triggerBuffer = IntBuffer.wrap(new int[]{0, one, 0, –one, –one, 0, one, –one, 0});

// 将顶点绘制出来

gl.glDrawArray(int mode, int first, int count)

gl.glDrawArray(GL10.GL_TRIANGLES, 0, 3);

参数1:mode, 描述了绘制的模式

参数2:first, 开始位置

参数3:count, 要绘制的顶点计数

// 重置当前的模拟观察矩阵

gl.glLoadIdentity();

// 左移1.5单位,并移入屏幕6.0

gl.glTranslatef(1.5f, 0.0f, –6.0f);

// 设置和绘制正方形

gl.glVertexPointer(3, GL10.GL_FIXED, 0, quaterBuffer);

gl.glDrawArray(GL10.GL_TRIANGLE_STRIP, 0, 4);

// 取消顶点设置

gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);

通过glEnableClientState方法开启了顶点设置功能,在使用完成之后,需要通过glDisableClientState(GL10.GL_VERTEX_ARRAY);方法关闭/取消顶点设置功能。

 

3. 颜色

学习如何对图形进行着色,两种不同的着色方式,分别是:平滑/光滑着色(Smooth Coloring)和平面/单调着色(Flat Coloring)。

Android OpenGL 开发的更多相关文章

  1. Android OpenGL ES 开发教程 从入门到精通

    感谢,摘自:http://blog.csdn.net/mapdigit/article/details/7526556 Android OpenGL ES 简明开发教程 Android OpenGL ...

  2. EGL接口介绍-----Android OpenGL ES底层开发

    引自:http://www.cnitblog.com/zouzheng/archive/2011/05/30/74326.html EGL 是 OpenGL ES 和底层 Native 平台视窗系统之 ...

  3. Android OpenGL ES 开发(三): OpenGL ES 定义形状

    在上篇文章,我们能够配置好基本的Android OpenGL 使用的环境.但是如果我们不了解OpenGL ES如何定义图像的一些基本知识就使用OpenGL ES进行绘图还是有点棘手的.所以能够在Ope ...

  4. 【Android应用开发】 OpenGL ES -- 透视投影 和 正交投影

    博客地址 : http://blog.csdn.net/shulianghan/article/details/46680803 源代码下载 : http://download.csdn.net/de ...

  5. 【Android 应用开发】OpenGL ES 2.0 -- 制作 3D 彩色旋转三角形 - 顶点着色器 片元着色器 使用详解

    最近开始关注OpenGL ES 2.0 这是真正意义上的理解的第一个3D程序 , 从零开始学习 . 案例下载地址 : http://download.csdn.net/detail/han120201 ...

  6. Android N开发 你需要知道的一切

    title: Android N开发 你需要知道的一切 tags: Android N,Android7.0,Android --- 转载请注明出处:http://www.cnblogs.com/yi ...

  7. 转——Android应用开发性能优化完全分析

    [工匠若水 http://blog.csdn.net/yanbober 转载请注明出处.] 1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关于性能的建议,感觉 ...

  8. Android OpenGL 学习笔记 --开始篇

    转自: http://www.cnblogs.com/TerryBlog/archive/2010/07/09/1774475.html 1.什么是 OpenGL? OpenGL 是个专业的3D程序接 ...

  9. Android程序开发0基础教程(一)

    程序猿学英语就上视觉英语网 Android程序开发0基础教程(一)   平台简单介绍   令人激动的Google手机操作系统平台-Android在2007年11月13日正式公布了,这是一个开放源码的操 ...

随机推荐

  1. 将mnist数据集存储到本地文件

    参考文章: http://www.csuldw.com/2016/02/25/2016-02-25-machine-learning-MNIST-dataset/ import numpy as np ...

  2. 关于图表第三方Charts的一些理解与总结

    最近项目中用到了很多的图表,如柱状图,线状图,饼状图等等.接触到了一个新的第三方Charts,在做图方面确实非常强大,在使用了一段时间后,今天对他进行一个小的总结,也是自己的一点小理解. 关于char ...

  3. 也谈时间管理和GTD

    也谈时间管理和GTD 时间管理 随着事情越来约多发现时间越来越不够用了,但是其实每天时间都是恒定的,并不增也不减,所以感觉时间不够用了总归只是个人主观感觉. 对我个人帮助比较大的是三本书<番茄时 ...

  4. 普通免费QQ客服在PC、手机端解决方案

    注意:以下测试 浏览器在Chrome,手机在iphone6 营销QQ.企业QQ(http://b.qq.com/)跟普通免费QQ(http://shang.qq.com/v3/widget.html) ...

  5. VS2012项目中使用CocoStudio相关文件的设置

    开发环境说明: win7  vs2012  coco2d-x 3.0 alpha1 cocos2d-x 3.0 alpha 1搭配CocoStudio使用,效果更佳.CocoStudio包含了游戏开发 ...

  6. SharePoint 2013 排错之&quot;Code blocks are not allowed in this file&quot;

    今天,设置页面布局的自己定义母版页时,设置完了以后保存,然后预览报错,错误例如以下截图:删掉自己定义母版页的MasterPageFile属性,页面依旧报错:感觉甚是奇怪,由于有版本号控制,还原为最初的 ...

  7. 降压转换器 (Buck)

    降压转换器 (Buck) 切换式降压转换器 (Buck) 能提供高效率.高度弹性.高压降比.高负载能力的降压转换. 多数降压转换器 (Buck) 包含上桥 MOSFET 和同步整流 MOSFET,根据 ...

  8. 将dll文件注入到其他进程中的一种新方法

    http://www.45it.com/windowszh/201212/33946.htm http://www.hx95.cn/Article/OS/201212/65095.html 我们知道将 ...

  9. Simple Addition Permits Voltage Control Of DC-DC Converter's Output

    http://electronicdesign.com/power/simple-addition-permits-voltage-control-dc-dc-converters-output In ...

  10. head first---------facade design pattern

    head first----------外观模式或者门面模式         外观模式又名门面模式:提供了一个统一的接口,用来访问子系统中的一群接口.外观模式定义了一个高层接口,从而让子系统更容易使用 ...