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 开发的更多相关文章
-
Android OpenGL ES 开发教程 从入门到精通
感谢,摘自:http://blog.csdn.net/mapdigit/article/details/7526556 Android OpenGL ES 简明开发教程 Android OpenGL ...
-
EGL接口介绍-----Android OpenGL ES底层开发
引自:http://www.cnitblog.com/zouzheng/archive/2011/05/30/74326.html EGL 是 OpenGL ES 和底层 Native 平台视窗系统之 ...
-
Android OpenGL ES 开发(三): OpenGL ES 定义形状
在上篇文章,我们能够配置好基本的Android OpenGL 使用的环境.但是如果我们不了解OpenGL ES如何定义图像的一些基本知识就使用OpenGL ES进行绘图还是有点棘手的.所以能够在Ope ...
-
【Android应用开发】 OpenGL ES -- 透视投影 和 正交投影
博客地址 : http://blog.csdn.net/shulianghan/article/details/46680803 源代码下载 : http://download.csdn.net/de ...
-
【Android 应用开发】OpenGL ES 2.0 -- 制作 3D 彩色旋转三角形 - 顶点着色器 片元着色器 使用详解
最近开始关注OpenGL ES 2.0 这是真正意义上的理解的第一个3D程序 , 从零开始学习 . 案例下载地址 : http://download.csdn.net/detail/han120201 ...
-
Android N开发 你需要知道的一切
title: Android N开发 你需要知道的一切 tags: Android N,Android7.0,Android --- 转载请注明出处:http://www.cnblogs.com/yi ...
-
转——Android应用开发性能优化完全分析
[工匠若水 http://blog.csdn.net/yanbober 转载请注明出处.] 1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关于性能的建议,感觉 ...
-
Android OpenGL 学习笔记 --开始篇
转自: http://www.cnblogs.com/TerryBlog/archive/2010/07/09/1774475.html 1.什么是 OpenGL? OpenGL 是个专业的3D程序接 ...
-
Android程序开发0基础教程(一)
程序猿学英语就上视觉英语网 Android程序开发0基础教程(一) 平台简单介绍 令人激动的Google手机操作系统平台-Android在2007年11月13日正式公布了,这是一个开放源码的操 ...
随机推荐
-
C Primer Plus_第三章_数据和C_复习题与编程练习
Review long代替int类型变量的原因是什么? 在您的系统中,long可以容纳比int更大的数:如果您确实需要处理更大的值,那么使用一种在所有系统上都保证至少是32位的类型会使程序的可移植性更 ...
-
CSS2简写代码(优化)
[1]如果CSS属性值为0,那么你不必为其添加单位(如:px/em): 下面是你可能的写法: padding: 10px 5px 0px 0px; 但是你可能这样写: padding: 10px 5p ...
-
关于TCP/IP协议栈
1. TCP/IP协议栈 与OSI参考模型不同,TCP/IP协议栈共有4层,其中网络接口层对应OSI中的物理层和数据链路层,应用层对应OSI中的应用层.表示层和会话层. 在网络接口层的主要协议有:AR ...
-
菜鸟聊JavaScript中this
菜鸟聊this this在JavaScript中是一个比较头疼的问题,我现在以一枚菜鸟的观点结合代码简单的谈下JavaScript中的this指向问题. 1.例子1 function a() { va ...
-
June. 26th 2018, Week 26th. Tuesday
No affection but interests can be found in the world of animals. 在动物的世界里,只有利益,没有感情. From Animal Worl ...
-
Java面向对象 第4节 类的多态性
一.多态的概念 在面向对象语言中,多态是指在一棵继承树中的类中可以有多个同名但不同方法体及不同形参的方法.通常有两种途径实现多态:方法的重载和覆盖. 多态性允许以统一的风格处理已存在的变量及相关的类. ...
-
JDK1.8 HashMap 扩容 对链表(长度小于默认的8)处理时重新定位的过程
关于HashMap的扩容过程,请参考源码或百度. 我想记录的是1.8 HashMap扩容是对链表中节点的Hash计算分析. 对术语先明确一下: hash计算指的确定节点在table[index]中的链 ...
-
hadoop sqoop的常用名命令
1 列出所有的ambari数据库中所有的表 Sqoop list-tables -connect jdbc:mysql://localhost:3306/ambari -username ambar ...
-
产品排序(2015 年北大自招夏令营) (与栈相关的区间DP)
题面: \(solution:\) 又是一道\(DP\)的好题啊!状态并不明显,需要仔细分析,而且还结合了栈的特性! 做这一类题,只要出题人有点理想,一定会在栈的性质上做点文章,所以我们尽量围绕栈的性 ...
-
php中mvc框架总结1(7)
1.代码结构的划分: 目前的目录结构: /站点根目录 /application/应用程序目录 Model/模型目录 View/视图目录 Back/后台 front/ test/测试平台 Control ...