Android 3D编程
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
// 启用阴影平滑 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_CORRECTIO N_HINT, GL10.GL_FASTEST);
Renderer接口„ „ Renderer是GLSurfaceView 的一个接口interface GLSurfaceView.Renderer 一个普通的绘图接口,渲染器负责调用OpenGL函数 画一帧( 组成动画的单幅图象) 通常,使用Renderer的子类,渲染器将以一个独立 的线程被调用,使渲染性能从UI 线程中分离出来。 通常需要通过UI 线程与渲染器通信,因为UI 线 程是接收输入事件的界面。可以使用标准的Java技术 通跨线程通信,或者可以使用queueEvent( Runnable接口)的便捷方法跨线程通信。
(5)当窗口大小发生改变时系统将调用 onSurfaceChange 方法,可以在该方法中设置 OpenGL 场景大小 ,代码如下: //设置OpenGL场景的大小 gl.glViewport(0, 0, width, height); (6)、场景画出来了,接下来我们就要实现 场景里面的内容,比如:设置它的透视图,让 它有种越远的东西看起来越小的感觉,代码如 下:
glHint 用于告诉 OpenGL 我们希望进行最好的 透视修正,这会轻微地影响性能,但会使得透 视图更好看。 glClearColor 设置清除屏幕时所用的颜色,色 彩值的范围从 0.0f~1.0f 大小从暗到亮的过程 。 glShadeModel 用于启用阴影平滑度。阴影平 滑通过多边形精细地混合色彩,并对外部光进 行平滑。 glDepthFunc 为将深度缓存设想为屏幕后面的 层,它不断地对物体进入屏幕内部的深度进行 跟踪。 glEnable 启用深度测试。
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绘图的要求 。
Android 3D编程
本章内容
opengl
opengl es
1、什么是 OpenGL? OpenGL 是个专业的3D程序接口,是一个 功能强大,调用方便的底层3D图形库。 OpenGL 的前身是 SGI 公司为其图形工作站开 的 IRIS GL。IRIS GL 是一个工业标准的3D图形 软件接口,功能虽然强大但是移植性不好,于 是 SGI 公司便在 IRIS GL 的基础上开发 OpenGL 。它独立于窗口系统和操作系统,以 它为基础开发的应用程序可以十分方便地在各 种平台间移植;OpenGL广泛用于3D游戏; OpenGL使用简便,效率高。
2、OpenGL特点及功能 (1). 建模:OpenGL图形库除了提供基本的点、线、多边形的绘制 函数外,还提供了复杂的三维物体(球、锥、多面体、茶壶等) 以及复杂曲线和曲面绘制函数。 (2). 变换:OpenGL图形库的变换包括基本变换和投影变换。基本 变换有平移、旋转、变比镜像四种变换,投影变换有平行投影( 又称正射投影)和透视投影两种变换。其变换方法有利于减少算 法的运行时间,提高三维图形的显示速度。 (3). 颜色模式设置:OpenGL颜色模式有两种,即RGBA 模式和颜 色索引(Color Index)。在RGBA模式下所有颜色的定义用RGB三 个值来表示,有时也加上Alpha值(表示透明度)。RGB三个分 量值的范围都在0和1之间,它们在最终颜色中所占的比例与它们 的值成正比。如:(1、1、0)表示黄色,(0、0、1)表示蓝 色。颜色索引模式下每个象素的颜色是用颜色索引表中的某个颜 色索引值表示(类似于从调色板中选取颜色)。由于三维图形处 理中要求颜色灵活,而且在阴影,光照,雾化,融合等效果处理 中RGBA的效果要比颜色索引模式好,所以,在编程时大多采用 RGBA模式。
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绘图的要求 。
2、OpenGL特点及功能
(4). 光照和材质设置:OpenGL光有辐射光(Emitted Light )、环 境光(Ambient Light)、漫反射光(Diffuse Light)和镜面光( Specular Light)。材质是用光反射率来表示。场景(Scene )中 物体最终反映到人眼的颜色是光的红绿蓝分量与材质红绿蓝分量 的反射率相乘后形成的颜色。 (5): 纹理映射(Texture Mapping)。利用OpenGL纹理映射功能 可以十分逼真地表达物体表面细节。 (6): 位图显示和图象增强图象功能除了基本的拷贝和像素读写外 ,还提供融合(Blending )、反走样(Antialiasing)和雾(fog )的特殊图象效果处理。以上三条可使被仿真物更具真实感,增 强图形显示的效果。 (7):双缓存动画(Double Buffering)双缓存即前台缓存和后台 缓存,简言之,后台缓存计算场景、生成画面,前台缓存显示后 台缓存已画好的画面。 „ 此外,利用OpenGL还能实现深度暗示(Depth Cue)、运动模糊 (Motion Blur)等特殊效果。从而实现了消隐算法。
5. opengl 3D绘图
„ 1> 在android中首先要取得一个GLSurfaceView 类 的对象.这个对象用来保存画出的图形.画图的具体 操作是在Render中来实现的.通过GLSurfaceView 的setRender 对象来开启一个线程绘制图形. 2> 实现GLSurfaceView.Renderer接口.„ 这个类就是 绘图的主要类, 具体画图是在 GLSurfaceView.Renderer的onDrawFrame方法里 面, 在GLSurfaceView 中会不停的调用这个方法画 图.„ 每次画前如非特别需要都得去清空一次屏幕.
7.例子
„ (1)、导入 Renderer 类 import android.opengl.GLSurfaceView.Renderer; (2)、新建一个类来实现 Renderer 接口,代码如下: import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.opengles.GL10; import android.opengl.GLSurfaceView.Renderer; public class OpenGLRender implements Renderer { @Override public void onSurfaceCreated(GL10 gl, EGLConfig config) { } @Override public void onSurfaceChanged(GL10 gl, int width, int height) { gl.glViewport(0, 0, width, height); } @Override public void onDrawFrame(GL10 gl) { gl.glClearColor(0.4f, 0.6f, 0.2f, 1.0f); gl.glClear(GL10.GL_COLOR_BUFFER_BIT); }
//设置投影矩阵 gl.glMatrixMode(GL10.GL_PROJECTION); //重置投影矩阵 gl.glLoadIdentity(); // 设置视口的大小 gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10); // 选择模型观察矩阵 gl.glMatrixMode(GL10.GL_MODELVIEW); // 重置模型观察矩阵 gl.glLoadIdentity();
}ห้องสมุดไป่ตู้
(3)onSurfaceCreated : 在这个方法中主要用 来设置一些绘制时不常变化的参数,比如背景 色等 onDrawFrame: 定义实际的绘图操作。 onSurfaceChanged: 如果设备支持屏幕横向和 纵向切换,这个方法将发生在横向<->纵向互 换时。此时可以重新设置绘制的纵横比率。 (4)当窗口被创建时需要调用 onSurfaceCreate ,我们可以在这里对 OpenGL 做一些初始化工作,例如:
4、 Android OpenGL ES 简介 Android系统使用 OpenGL 的标准接口来支持 3D图形功能,android 3D 图形系统也分为 java 框架和本地代码两部分。本地代码主要实 现的 OpenGL 接口的库,在 Java 框架层, javax.microedition.khronos.opengles 是 java 标 准的 OpenGL 包,android.opengl包提供了 OpenGL 系统和 Android GUI 系统之间的联系 。Android系统使用OpenGL画3D 时要引入上 面两个包中的类
5. opengl 3D绘图
绘图的过程: „
„ 1> 设置要画图的点, 一般是中心点.( 这个可以 去用openGL中ViewPoint) „ 2> 启用各种数组 „ 3> 关联顶点坐标数组 „ 4> 关联顶点颜色数组 „ 5> 画各种图形. 点/ 线/ 多边形.
6、GLSurfaceView
GLSurfaceView一个SurfaceView实现,它使用了专 „
用的表面显示OpenGL画出的图形, 是图形运行的环境„ GLSurfaceView 是也绘制3D图形的环境,可以把 这个环境加载到android 的界面Activity上去„ GLSurfaceView 派生于View类。 通常,使用GLSurfaceView 的子类,在大多数情况下 ,GLSurfaceView行为是通过调用“set”方法定制的。 „ 例如,通过调用setRenderer( Renderer) 。绘图委派 给一个独立的Renderer对象完成 初始化GLSurfaceView调用setRenderer(Renderer)完 成,„ 调用setRenderer (GLSurfaceView.Renderer) 注册一个GLSurfaceView.Renderer。 ( Renderer做具体的OpenGL画图工作).