Android开发之OpenGL绘制2D图形的方法分析

发布时间 - 2026-01-11 03:06:43    点击率:

本文实例讲述了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中常见的图形绘制方式总结  # 设为  # 回调  # 坐标值  # 将会  # 是由  # 这意味着  # 时需  # 的是  # 进阶  # 都有  # 相关内容  # 把它  # 感兴趣  # 我们可以  # 要把  # 给大家  # 就可  # 重写  # 分别为  # 时就 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何实现用户注册和登录?(Auth脚手架指南)  如何快速搭建二级域名独立网站?  如何快速搭建高效香港服务器网站?  如何破解联通资金短缺导致的基站建设难题?  JavaScript常见的五种数组去重的方式  如何彻底删除建站之星生成的Banner?  教你用AI润色文章,让你的文字表达更专业  Laravel API资源类怎么用_Laravel API Resource数据转换  logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?  如何实现建站之星域名转发设置?  Laravel如何实现数据导出到CSV文件_Laravel原生流式输出大数据量CSV【方案】  如何在 Pandas 中基于一列条件计算另一列的分组均值  如何在IIS中配置站点IP、端口及主机头?  香港服务器建站指南:外贸独立站搭建与跨境电商配置流程  Laravel 419 page expired怎么解决_Laravel CSRF令牌过期处理  Laravel如何使用Laravel Vite编译前端_Laravel10以上版本前端静态资源管理【教程】  如何撰写建站申请书?关键要点有哪些?  成都网站制作公司哪家好,四川省职工服务网是做什么用?  javascript中数组(Array)对象和字符串(String)对象的常用方法总结  Laravel广播系统如何实现实时通信_Laravel Reverb与WebSockets实战教程  电商网站制作价格怎么算,网上拍卖流程以及规则?  Laravel Docker环境搭建教程_Laravel Sail使用指南  Android中AutoCompleteTextView自动提示  香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南  详解阿里云nginx服务器多站点的配置  Laravel如何配置和使用队列处理异步任务_Laravel队列驱动与任务分发实例  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  Laravel如何使用Seeder填充数据_Laravel模型工厂Factory批量生成测试数据【方法】  WordPress 子目录安装中正确处理脚本路径的完整指南  简历在线制作网站免费版,如何创建个人简历?  利用vue写todolist单页应用  C#如何调用原生C++ COM对象详解  Laravel Artisan命令怎么自定义_创建自己的Laravel命令行工具完全指南  昵图网官方站入口 昵图网素材图库官网入口  电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?  laravel怎么配置和使用PHP-FPM来优化性能_laravel PHP-FPM配置与性能优化方法  Laravel distinct去重查询_Laravel Eloquent去重方法  Laravel怎么定时执行任务_Laravel任务调度器Schedule配置与Cron设置【教程】  Angular 表单中正确绑定输入值以确保提交与验证正常工作  Laravel怎么在Blade中安全地输出原始HTML内容  教学论文网站制作软件有哪些,写论文用什么软件 ?  Laravel如何保护应用免受CSRF攻击?(原理和示例)  Laravel怎么为数据库表字段添加索引以优化查询  🚀拖拽式CMS建站能否实现高效与个性化并存?  网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?  Laravel Eloquent:优雅地将关联模型字段扁平化到主模型中  如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?  google浏览器怎么清理缓存_谷歌浏览器清除缓存加速详细步骤  PHP怎么接收前端传的文件路径_处理文件路径参数接收方法【汇总】  如何在 Telegram Web View(iOS)中防止键盘遮挡底部输入框