Android开发与实践-利用OpenGL实现3D图形
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
用于设置OpenGL ES的阴影模式。例如,要设置为平滑模式,可 以使用gl.glShadeModel(GL10.GL_SMOOTH);语句
用于设置3D场景的大小
12.2.2 绘制一个模型
在基本框架构建完成后,我们就可以在该框架的基础上绘制3D模型了。在
OpenGL ES中,任何模型都会被分解为三角形。下面将以绘制一个2D的三角
OpenGL ES 2.x(针对可编程管线硬件)两个版本。OpenGL ES 1.0是以 OpenGL 1.3规范为基础的,OpenGL ES 1.1是以OpenGL 1.5规范为基础的, OpenGL ES 2.0 则是参照OpenGL 2.0规范定义的,它补充和修改了OpenGL ES 1.1标准着色器语言及API,将OpenGL ES 1.1中所有可以用着色器程序 替换的功能全部删除了,这样可以节约移动设备的开销及电力消耗。 说明: OpenGL ES可以应用于很多主流移动平台上,包括Android、Symbian和 iPhone等。 Android为OpenGL提供了相应的支持,它专门为支持OpenGL提供了 android.opengl包。在该包中,GLES10类是为支持OpenGL ES 1.0而提供的; GLES11类是为支持OpenGL ES 1.1而提供的,GLES20类是为支持OpenGL ES 2.0而提供的。其中,OpenGL ES 2.0是从Android 2.2(API Level 8)版 本才开始使用的。 如果你的应用只支持OpenGL ES 2.0,你必须在该项目的 AndroidManifest.xml文件中添加下列设置:
<uses-feature android:glEsVersion="0x00020000" android:required="true" />
12.2 绘制3D图形
12.2.1 构建3D开发的基本框架 12.2.2 绘制一个模型
12.2 绘制3D图形
OpenGL ES一个最常用的功能就是绘制3D图形。要绘制3D图形,大致可 以分为两个步骤,下面分别进行讲解。
例如,创建一个实现GLSurfaceView.Renderer接口的类EmptyRenderer,并 实现onSurfaceCreated()、onDrawFrame()和onSurfaceChanged()方法,为 窗体设置背景颜色,具体代码如下:
import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.opengles.GL10; import android.opengl.GLSurfaceView; public class EmptyRenderer implements GLSurfaceView.Renderer {
示GLSurfaceView的左下角。
(2)在onSurfaceCreated()方法中,应用以下代码启用顶点坐标数组。
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
12.1 OpenGL简介
OpenGL(Open Graphics Library)是由SGI公司于1992年发布的,一 个功能强大、调用方便的底层图形库,它为编程人员提供了统一的操作, 以便充分利用任何制造商提供的硬件。OpenGL的核心实现了视区和光照等 我们熟知的概念,并试图向开发人员隐藏大部分硬件层。
形为例介绍绘制3D模型的基本步骤。
(1)在onSurfaceCreated()方法中,定义顶点坐标数组。例如,要绘制一
个2维的三角形,可以使用以下代码定义顶点坐标数组:
private final IntBuffer mVertexBuffer;
public GLTriangle() {
int one = 65536;
第12章 利用OpenGL实现3D图形
本章要求:
OpenGL的基本概念 构建3D开发的基本框架 绘制3D模型 为3D图形添加纹理贴图效果 为3D图形添加旋转效果 为3D图形添加光照效果 为3D图形添加透明效果
第12章 利用OpenGL实现3D图形
12.1 OpenGL简介 12.2 绘制3D图形 12.3 添加效果 12.4 综合实例——绘制一个不断旋转的 金字塔
描述 用于指定清除屏幕时使用的颜色,4个参数分别用于设置红、绿、 蓝和透明度的值,值的范围是0.0f~1.0f 用于禁用OpenGL ES某个方面的特性。例如,要关闭抗抖动功能, 可以使用gl.glDisable(GL10.GL_DITHER);语句 用于启用OpenGL ES某个方面的特性
用于设置透视视窗的空间大小
mVertexBuffer = vbb.asIntBuffer();
mVertexBuffer.put(vertices);
mVertexBuffer.position(0);
}
说明:
在默认的情况下,OpenGL ES采取的坐标是[0,0,0](X,Y,Z)表示
GLSurfaceView的中心;[1,1,0]表示GLSurer.onResume(); mGLView.onResume(); } @Override protected void onPause() { super.onPause(); mGLView.onPause(); }
(2)创建实现GLSurfaceView.Renderer接口的类。在创建该类时,需要实 现接口中的以下3个方法:
用于对OpenGL ES某个方面进行修正
glLoadIdentity()
glMatrixMode(int mode)
glShadeModel(int mode) glViewport(int x, int y, int width, int height)
用于初始化单位矩阵
用于设置视图的矩阵模式。通常可以使用GL10.GL_MODELVIEW 和GL10.GL_PROJECTION两个常量值
int vertices[] = {
0, one, 0,
//上顶点
-one, -one, 0,
//左下点
one, -one, 0
//右下点
};
ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length * 4);
vbb.order(ByteOrder.nativeOrder());
public void onSurfaceCreated(GL10 gl, EGLConfig config):当GLSurfaceView被创建时回调 该方法。 public void onDrawFrame(GL10 gl):Renderer对象调用该方法绘制GLSurfaceView的当前帧。 public void onSurfaceChanged(GL10 gl, int width, int height):当GLSurfaceView的大小 改变时回调该方法。
由于OpenGL是专门为工作站设计的,它太大了,无法安装在移动设备 上,所以Khronos Group为OpenGL提供了一个子集OpenGL ES(OpenGL for Embedded System)。OpenGL ES是免费的、跨平台的、功能完善的2D/3D图 形库接口API,它专门针对多种嵌入式系统(包括手机、PDA和游戏主机等) 而设计的,提供一种标准方法来描述在图形处理器或主CPU上渲染这些图像 的底层硬件。 说明: Khronos Group是一个图形软硬件行业协会,该协会主要关注图形和多媒体 方向的开放标准。 OpenGL ES去除了OpenGL中的glBegin/glEnd,四边形(GL_QUADS)、多边 形(GL_POLYGONS)等复杂图元等许多非绝对必要的特性。经过多年发展, 目前的OpenGL ES现在主要有OpenGL ES 1.x(针对固定管线硬件)和
12.2.1 构建3D开发的基本框架
构建一个3D开发的基本框架大致可以分为以下几个步骤:
(1)创建一个Activity,并指定该Activity显示的内容是一个指定了
Renderer对象的GLSurfaceView对象。例如,创建一个名称为MainActivity
的Activity,在重写的onCreate()方法中,创建一个GLSurfaceView对象,
表12-1 GL10提供的用于进行初始化的方法
方法 glClearColor(float red, float green, float blue, float alpha)
glDisable(int cap)
glEnable(int cap) glFrustumf(float left, float right, float bottom, float top, float zNear, float zFar) glHint(int target, int mode)
public void onSurfaceCreated(GL10 gl, EGLConfig config) { // 设置窗体的背景颜色 gl.glClearColor(0.7f, 0.7f, 0.9f, 1.0f);
} public void onDrawFrame(GL10 gl) {
// 重设背景颜色 gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); } public void onSurfaceChanged(GL10 gl, int width, int height) { gl.glViewport(0, 0, width, height); } }
对象
mGLView.setRenderer(new CubeRenderer());//为GLSurfaceView指定使用的
Renderer对象
setContentView(mGLView);
//设置Activity显示的内
容为GLSurfaceView对象
}
通常情况下,考虑到当Activity恢复和暂停时,GLSurfaceView对象也恢复
当窗口被创建时,需要调用onSurfaceCreated()方法,进行一些初始 化操作。onSurfaceCreated()方法有一个GL10类型的参数gl,gl相当于 OpenGL ES的画笔。通过它提供的方法不仅可以绘制3D图形,也可以对 OpenGL进行初始化。下面将以表格的形式给出GL10提供的用于进行初始化 的方法,对于GL10提供的用于绘制3D图形的方法将在12.2.2节进行介绍。 GL10提供的用于进行初始化的方法如表12-1所示。
第12章 利用OpenGL实现3D图形
在现在这个网络游戏逐渐盛行的时代,2D游戏已经不能完全满足用户的 需求,3D技术已经被广泛的应用在PC游戏中,3D技术下一步将会肯定向手机 平台发展,而Android系统作为当前最流行的手机操作系统,完全内置3D技 术——OpenGl支持,本章将对如何在Android中利用OpenGL实现3D图形进行 详细讲解。
或者暂停,还要重写Activity的onResume()方法和onPause()方法。例如,
如果一个Activity使用的GLSurfaceView对象为mGLView,那么,可以使用 以下的重写onResume()和onPause()方法的代码:
@Override protected void onResume() {
并为其指定使用的Renderer对象,再将其设置为Activity要显示的内容,
可以使用下面的代码:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
GLSurfaceView mGLView = new GLSurfaceView(this); //创建一个GLSurfaceView
用于设置3D场景的大小
12.2.2 绘制一个模型
在基本框架构建完成后,我们就可以在该框架的基础上绘制3D模型了。在
OpenGL ES中,任何模型都会被分解为三角形。下面将以绘制一个2D的三角
OpenGL ES 2.x(针对可编程管线硬件)两个版本。OpenGL ES 1.0是以 OpenGL 1.3规范为基础的,OpenGL ES 1.1是以OpenGL 1.5规范为基础的, OpenGL ES 2.0 则是参照OpenGL 2.0规范定义的,它补充和修改了OpenGL ES 1.1标准着色器语言及API,将OpenGL ES 1.1中所有可以用着色器程序 替换的功能全部删除了,这样可以节约移动设备的开销及电力消耗。 说明: OpenGL ES可以应用于很多主流移动平台上,包括Android、Symbian和 iPhone等。 Android为OpenGL提供了相应的支持,它专门为支持OpenGL提供了 android.opengl包。在该包中,GLES10类是为支持OpenGL ES 1.0而提供的; GLES11类是为支持OpenGL ES 1.1而提供的,GLES20类是为支持OpenGL ES 2.0而提供的。其中,OpenGL ES 2.0是从Android 2.2(API Level 8)版 本才开始使用的。 如果你的应用只支持OpenGL ES 2.0,你必须在该项目的 AndroidManifest.xml文件中添加下列设置:
<uses-feature android:glEsVersion="0x00020000" android:required="true" />
12.2 绘制3D图形
12.2.1 构建3D开发的基本框架 12.2.2 绘制一个模型
12.2 绘制3D图形
OpenGL ES一个最常用的功能就是绘制3D图形。要绘制3D图形,大致可 以分为两个步骤,下面分别进行讲解。
例如,创建一个实现GLSurfaceView.Renderer接口的类EmptyRenderer,并 实现onSurfaceCreated()、onDrawFrame()和onSurfaceChanged()方法,为 窗体设置背景颜色,具体代码如下:
import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.opengles.GL10; import android.opengl.GLSurfaceView; public class EmptyRenderer implements GLSurfaceView.Renderer {
示GLSurfaceView的左下角。
(2)在onSurfaceCreated()方法中,应用以下代码启用顶点坐标数组。
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
12.1 OpenGL简介
OpenGL(Open Graphics Library)是由SGI公司于1992年发布的,一 个功能强大、调用方便的底层图形库,它为编程人员提供了统一的操作, 以便充分利用任何制造商提供的硬件。OpenGL的核心实现了视区和光照等 我们熟知的概念,并试图向开发人员隐藏大部分硬件层。
形为例介绍绘制3D模型的基本步骤。
(1)在onSurfaceCreated()方法中,定义顶点坐标数组。例如,要绘制一
个2维的三角形,可以使用以下代码定义顶点坐标数组:
private final IntBuffer mVertexBuffer;
public GLTriangle() {
int one = 65536;
第12章 利用OpenGL实现3D图形
本章要求:
OpenGL的基本概念 构建3D开发的基本框架 绘制3D模型 为3D图形添加纹理贴图效果 为3D图形添加旋转效果 为3D图形添加光照效果 为3D图形添加透明效果
第12章 利用OpenGL实现3D图形
12.1 OpenGL简介 12.2 绘制3D图形 12.3 添加效果 12.4 综合实例——绘制一个不断旋转的 金字塔
描述 用于指定清除屏幕时使用的颜色,4个参数分别用于设置红、绿、 蓝和透明度的值,值的范围是0.0f~1.0f 用于禁用OpenGL ES某个方面的特性。例如,要关闭抗抖动功能, 可以使用gl.glDisable(GL10.GL_DITHER);语句 用于启用OpenGL ES某个方面的特性
用于设置透视视窗的空间大小
mVertexBuffer = vbb.asIntBuffer();
mVertexBuffer.put(vertices);
mVertexBuffer.position(0);
}
说明:
在默认的情况下,OpenGL ES采取的坐标是[0,0,0](X,Y,Z)表示
GLSurfaceView的中心;[1,1,0]表示GLSurer.onResume(); mGLView.onResume(); } @Override protected void onPause() { super.onPause(); mGLView.onPause(); }
(2)创建实现GLSurfaceView.Renderer接口的类。在创建该类时,需要实 现接口中的以下3个方法:
用于对OpenGL ES某个方面进行修正
glLoadIdentity()
glMatrixMode(int mode)
glShadeModel(int mode) glViewport(int x, int y, int width, int height)
用于初始化单位矩阵
用于设置视图的矩阵模式。通常可以使用GL10.GL_MODELVIEW 和GL10.GL_PROJECTION两个常量值
int vertices[] = {
0, one, 0,
//上顶点
-one, -one, 0,
//左下点
one, -one, 0
//右下点
};
ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length * 4);
vbb.order(ByteOrder.nativeOrder());
public void onSurfaceCreated(GL10 gl, EGLConfig config):当GLSurfaceView被创建时回调 该方法。 public void onDrawFrame(GL10 gl):Renderer对象调用该方法绘制GLSurfaceView的当前帧。 public void onSurfaceChanged(GL10 gl, int width, int height):当GLSurfaceView的大小 改变时回调该方法。
由于OpenGL是专门为工作站设计的,它太大了,无法安装在移动设备 上,所以Khronos Group为OpenGL提供了一个子集OpenGL ES(OpenGL for Embedded System)。OpenGL ES是免费的、跨平台的、功能完善的2D/3D图 形库接口API,它专门针对多种嵌入式系统(包括手机、PDA和游戏主机等) 而设计的,提供一种标准方法来描述在图形处理器或主CPU上渲染这些图像 的底层硬件。 说明: Khronos Group是一个图形软硬件行业协会,该协会主要关注图形和多媒体 方向的开放标准。 OpenGL ES去除了OpenGL中的glBegin/glEnd,四边形(GL_QUADS)、多边 形(GL_POLYGONS)等复杂图元等许多非绝对必要的特性。经过多年发展, 目前的OpenGL ES现在主要有OpenGL ES 1.x(针对固定管线硬件)和
12.2.1 构建3D开发的基本框架
构建一个3D开发的基本框架大致可以分为以下几个步骤:
(1)创建一个Activity,并指定该Activity显示的内容是一个指定了
Renderer对象的GLSurfaceView对象。例如,创建一个名称为MainActivity
的Activity,在重写的onCreate()方法中,创建一个GLSurfaceView对象,
表12-1 GL10提供的用于进行初始化的方法
方法 glClearColor(float red, float green, float blue, float alpha)
glDisable(int cap)
glEnable(int cap) glFrustumf(float left, float right, float bottom, float top, float zNear, float zFar) glHint(int target, int mode)
public void onSurfaceCreated(GL10 gl, EGLConfig config) { // 设置窗体的背景颜色 gl.glClearColor(0.7f, 0.7f, 0.9f, 1.0f);
} public void onDrawFrame(GL10 gl) {
// 重设背景颜色 gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); } public void onSurfaceChanged(GL10 gl, int width, int height) { gl.glViewport(0, 0, width, height); } }
对象
mGLView.setRenderer(new CubeRenderer());//为GLSurfaceView指定使用的
Renderer对象
setContentView(mGLView);
//设置Activity显示的内
容为GLSurfaceView对象
}
通常情况下,考虑到当Activity恢复和暂停时,GLSurfaceView对象也恢复
当窗口被创建时,需要调用onSurfaceCreated()方法,进行一些初始 化操作。onSurfaceCreated()方法有一个GL10类型的参数gl,gl相当于 OpenGL ES的画笔。通过它提供的方法不仅可以绘制3D图形,也可以对 OpenGL进行初始化。下面将以表格的形式给出GL10提供的用于进行初始化 的方法,对于GL10提供的用于绘制3D图形的方法将在12.2.2节进行介绍。 GL10提供的用于进行初始化的方法如表12-1所示。
第12章 利用OpenGL实现3D图形
在现在这个网络游戏逐渐盛行的时代,2D游戏已经不能完全满足用户的 需求,3D技术已经被广泛的应用在PC游戏中,3D技术下一步将会肯定向手机 平台发展,而Android系统作为当前最流行的手机操作系统,完全内置3D技 术——OpenGl支持,本章将对如何在Android中利用OpenGL实现3D图形进行 详细讲解。
或者暂停,还要重写Activity的onResume()方法和onPause()方法。例如,
如果一个Activity使用的GLSurfaceView对象为mGLView,那么,可以使用 以下的重写onResume()和onPause()方法的代码:
@Override protected void onResume() {
并为其指定使用的Renderer对象,再将其设置为Activity要显示的内容,
可以使用下面的代码:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
GLSurfaceView mGLView = new GLSurfaceView(this); //创建一个GLSurfaceView