Android开发之OpenGL绘制2D图形的方法分析
本文实例讲述了android开发之opengl绘制2d图形的方法。分享给大家供大家参考,具体如下:
android为opengl es支持提供了glsurviceview组建,这个组建用于显示3d图形。glsurviceview本身并不提供绘制3的图形的功能,而是由glsurfaceview.renderer来完成了surviceview中3d图形的绘制。
归纳起来,在android中使用opengl es需要3个步骤。
1. 创建glsurviceview组件,使用activity来显示glsurfaceview组件。
2. 为glsurviceview组件创建glsurviceview.renderer
实例,实现glsurviceview.renderer类时需要实现该接口里的3个方法。
(1) abstract void ondrawframe(gl 10 gl):renerer对象调用该方法绘制glsurviceview的当前帧。
(2) abstract void onsurfacechanged(gl 10 gl,int width,int height):当glsurfaceview的大小改变时回调该方法。
(3) abstract void ondrawframe(gl 10 gl,eglconfig config):当glsurfaceview被创建时回调该方法。
3. 调用glsurfaceview组件的setrebderer()
方法指定renderer对象,该renderer对象将会完成glsurfaceview里3d图像的绘制。
从上面的介绍不难看出,实际上绘制3d图像的难点不是如何使用glsurface组件,二是如何实现renderer类。实现render类时需要实现3个方法。这3个方法都有一个gl形参,它就代表了glopenes的“绘制画笔”,我们可以把它想象成swing 2d绘图中的graphics,也可以想象成android 2d绘图中的canvas组件——当我们希望renderer绘制3d图形时,实际上是调用gl10的方法来进行绘制的。
当survice view被创建时,系统会回调renderer对象的onsurfacecreated()方法,该方法将可以对opengl es执行一些无需任何改变的初始化,例如如下初始化代码:
public void onsurfacecreated(gl10 gl,eglconfig config) { //关闭抗抖动 gl.gldisable(gl10.gl_dither); //设置系对透视进行修正 gl.glhint(gl10.gl_perspective_correction_hint, gl10.gl_fastest); gl.glclearcolor(0, 0, 0, 0); //设置阴影平滑模式 gl.glshademodel(gl10.gl_smooth); //启用深度测试 gl.glenable(gl10.gl_depth_test); //设置深度测试的类型 gl.gldepthfunc(gl10.gl_lequal); }
gl10就是opengl es的绘制接口,虽然这里看到的是一个gl10,但实际上它也是gl11的实例,读者可通过(gl instanceof gl11)判断它是否为gl11接口的实例。
上面的方法中用到了gl10的一些初始化方法,关于这些方法的说明如下:
(1) gldisable(int cap)
:该方法用于禁用opengl es某个方面的特性。该方法中第一行代码用于关闭抗抖动,这样可以提高性能。
(2)glhint(int target,int mode)
:该方法用于对opengl es某方面的修正。
(3)clearcolor(float red,float green,float blue,float alpha)
:该方法设置清屏所用的颜色,四个参数分别设置红、绿、蓝、透明度值:0为最小值,1为最大值。例如设置gl.glclearcolor(0,0,0,0);就是用黑色清屏。
(4)glshademodel(int mode)
:该方法用于设置opengl es的阴影模式。此处设为阴影平滑模式。
(5)glenable(int cap)
:该方法与gldisable(int cap)方法相对,用于启用opengl es某方面的特性,此处用于启动opengl es的深度测试,就是让opengl es负责跟踪每个物体在z轴上的深度,这样就可以避免后面的物体遮挡前面的物体。
当surviceview组建的大小发生变化时,系统会回调renderer对象的onsurfacechanged()方法,因此该方法通常用于初始化3d场景。例如如下初始化代码:
public void onsurfacechanged(gl10 gl,int width,int height) { //设置3d视窗的大小和位置 gl.glviewport(0,0,width,height); //将当前矩阵模式设为投影矩阵 gl.glmatrixmode(gl10.gl_projection); //初始化单位矩阵 gl.glloadidentity(); //计算透视视窗的宽度、高度比 float ratio = (float)width/height; //调用此方法设置透视视窗的空间大小 gl.glfrustumf(-ratio,ratio,-1,1,1,10); }
上面的方法用到了gl10的一些初始化方法,关于这些方法的说明如下:
1、 glviewport(int x,int y,int width,int height)
:设置3d视窗的位置与大小。其中前两个参数指定该视窗的位置,后两个参数指定该视窗的宽,高。
2、glmatrixmode(int mode)
:设置视图的矩阵模型。通常可接受gl10.gl_projection、gl10.gl_modelview两个常量值。
当调用glmatrixmode(gl 10.gl_projection);
代码后,指定将屏幕设为透视图,这意味着越远的东西看起来越小;当调用glmatrixmode(gl 10. gl_modelview);
代码后,即将当前矩阵模式设为模式视图矩阵,这意味着任何新的变换都会影响该矩阵中的所有物体。
3、glloadidentity()
:相当于reset()方法,用于初始化单位矩阵。
4、glfrustumf(float left,float right,float bottom,float top,float znear,float zfar)
:用于设置透视投影的空间大小。前两个参数用于设置x轴上的最小坐标值、最大坐标值;中间两个参数用于设置y轴上的最小坐标值、最大坐标值;后两个参数用于设置z轴上的最小坐标值、最大坐标值。
例如我们调用如下代码:
gl.glfrustumf(-0.8,0.8,-1,1,1,10);
这意味着如果有一个二维矩形,它的四个顶点的坐标分别为:(-0.8,1)、(0.8,1)、(0.8,-1),(-0.8,-1),这个矩阵将会占满整个视窗。
glsurfaceview上的所有3d图形都是由renderer的ondrawframe(gl10 gl)
方法绘制出来的,重写该方法时就要把所有3d图形都绘制出来,该方法通常以如下形式开始:
public void ondrawframe(gl10 gl) { //清除屏幕缓存和深度缓存 gl.glclear(gl10.gl_color_buffer_bit|gl10.gl_depth_buffer_bit); ... }
更多关于android相关内容感兴趣的读者可查看本站专题:《android图形与图像处理技巧总结》、《android开发入门与进阶教程》、《android调试技巧与常见问题解决方法汇总》、《android基本组件用法总结》、《android视图view技巧总结》、《android布局layout技巧总结》及《android控件用法总结》
希望本文所述对大家android程序设计有所帮助。
推荐阅读
-
Android开发之OpenGL绘制2D图形的方法分析
-
Android开发笔记之:在ImageView上绘制圆环的实现方法
-
Android开发笔记之:在ImageView上绘制圆环的实现方法
-
Android开发之使用SQLite存储数据的方法分析
-
Android开发之Canvas中利用Path绘制圆形、矩形、椭圆、三角形等基本图形的方法介绍
-
OpenGL ES在Android开发中绘制3D图形的实例详解
-
Android开发之使用SQLite存储数据的方法分析
-
OpenGL ES在Android开发中绘制3D图形的实例详解
-
Android开发之Canvas中利用Path绘制圆形、矩形、椭圆、三角形等基本图形的方法介绍