本文实例讲述了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开发 OpenGL ES绘制3D 图形实例详解
# Android openGl 绘制简单图形的实现示例
# Android编程开发之在Canvas中利用Path绘制基本图形(圆形
# 矩形
# 椭圆
# 三角形等)
# Android编程之canvas绘制各种图形(点
# 直线
# 弧
# 圆
# 文字
# 多边形
# 曲线
# 圆角矩形)
# Android自定义View实现shape图形绘制
# Android开发实现各种图形绘制功能示例
# Android自定义控件绘制基本图形基础入门
# android绘制几何图形的实例代码
# Android shape 绘制图形的实例详解
# Android中常见的图形绘制方式总结
# 设为
# 回调
# 坐标值
# 将会
# 是由
# 这意味着
# 时需
# 的是
# 进阶
# 都有
# 相关内容
# 把它
# 感兴趣
# 我们可以
# 要把
# 给大家
# 就可
# 重写
# 分别为
# 时就
相关文章:
Python多线程使用规范_线程安全解析【教程】
金*站制作公司有哪些,金华教育集团官网?
用v-html解决Vue.js渲染中html标签不被解析的问题
小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?
如何通过西部建站助手安装IIS服务器?
建站中国必看指南:CMS建站系统+手机网站搭建核心技巧解析
如何在万网主机上快速搭建网站?
c# Task.ConfigureAwait(true) 在什么场景下是必须的
如何高效配置IIS服务器搭建网站?
如何用IIS7快速搭建并优化网站站点?
在线制作视频网站免费,都有哪些好的动漫网站?
网站制作软件有哪些,制图软件有哪些?
详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)
建站之星代理如何优化在线客服效率?
网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?
建站VPS能否同时实现高效与安全翻墙?
建站之星安装失败:服务器环境不兼容?
详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)
深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?
三星网站视频制作教程下载,三星w23网页如何全屏?
如何用PHP工具快速搭建高效网站?
专业公司网站制作公司,用什么语言做企业网站比较好?
网站制作话术技巧,网站推广做的好怎么话术?
c# 服务器GC和工作站GC的区别和设置
小建面朝正北,A点实际方位是否存在偏差?
电视网站制作tvbox接口,云海电视怎样自定义添加电视源?
网站制作软件免费下载安装,有哪些免费下载的软件网站?
七夕网站制作视频,七夕大促活动怎么报名?
建站之星备案是否影响网站上线时间?
如何用已有域名快速搭建网站?
ppt制作免费网站有哪些,ppt模板免费下载网站?
郑州企业网站制作公司,郑州招聘网站有哪些?
黑客如何利用漏洞与弱口令入侵网站服务器?
宝盒自助建站智能生成技巧:SEO优化与关键词设置指南
制作网站公司那家好,网络公司是做什么的?
合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?
建站主机是否等同于虚拟主机?
电商平台网站制作流程,电商网站如何制作?
怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?
如何使用Golang安装API文档生成工具_快速生成接口文档
免费视频制作网站,更新又快又好的免费电影网站?
官网建站费用明细查询_企业建站套餐价格及收费标准指南
网站制作的方法有哪些,如何将自己制作的网站发布到网上?
浅析上传头像示例及其注意事项
在线制作视频的网站有哪些,电脑如何制作视频短片?
大连 网站制作,大连天途有线官网?
php能控制zigbee模块吗_php通过串口与cc2530 zigbee通信【介绍】
Android自定义控件实现温度旋转按钮效果
如何高效利用亚马逊云主机搭建企业网站?
唐山网站制作公司有哪些,唐山找工作哪个网站最靠谱?
*请认真填写需求信息,我们会在24小时内与您取得联系。