我的编程空间,编程开发者的网络收藏夹
学习永远不晚

如何在Android中使用OpenGL绘制一个2D图形

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何在Android中使用OpenGL绘制一个2D图形

今天就跟大家聊聊有关如何在Android中使用OpenGL绘制一个2D图形,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

具体如下:

Android为OpenGL ES支持提供了GLSurviceView组建,这个组建用于显示3D图形。GLSurviceView本身并不提供绘制3的图形的功能,而是由GLSurfaceView.Renderer来完成了SurviceView中3D图形的绘制。

归纳起来,在android中使用OpenGL ES需要3个步骤。

创建GLSurviceView组件,使用Activity来显示GLSurfaceView组件。

为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被创建时回调该方法。

调用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的一些初始化方法,关于这些方法的说明如下:

glViewport(int x,int y,int width,int height):设置3D视窗的位置与大小。其中前两个参数指定该视窗的位置,后两个参数指定该视窗的宽,高。

glMatrixMode(int mode):设置视图的矩阵模型。通常可接受GL10.GL_PROJECTION、GL10.GL_MODELVIEW两个常量值。

当调用glMatrixMode(GL 10.GL_PROJECTION);代码后,指定将屏幕设为透视图,这意味着越远的东西看起来越小;当调用glMatrixMode(GL 10. GL_MODELVIEW);代码后,即将当前矩阵模式设为模式视图矩阵,这意味着任何新的变换都会影响该矩阵中的所有物体。

glLoadIdentity():相当于reset()方法,用于初始化单位矩阵。

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中使用OpenGL绘制一个2D图形有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注编程网行业资讯频道,感谢大家的支持。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

如何在Android中使用OpenGL绘制一个2D图形

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何在Android中使用OpenGL绘制一个2D图形

今天就跟大家聊聊有关如何在Android中使用OpenGL绘制一个2D图形,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。具体如下:Android为OpenGL ES支持提供了GLSu
2023-05-30

如何在Android中使用shape 绘制图形

这篇文章给大家介绍如何在Android中使用shape 绘制图形,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。shape/* * 线行 圆形 矩形/android:shape="line" android:shape=
2023-05-30

使用Canvas如何绘制一个多边形

使用Canvas如何绘制一个多边形?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。function drawPolygonPath(sideNum, radius
2023-06-09

如何在Android中使用achartengine绘制图表

如何在Android中使用achartengine绘制图表?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1. ABarChart.javapackage com
2023-05-30

如何在Android中利用Drawable绘制一个圆角

如何在Android中利用Drawable绘制一个圆角?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1. 创建类RoundCircleDrawable继承Drawablepub
2023-05-30

Android基于OpenGL在GLSurfaceView上绘制三角形及使用投影和相机视图方法示例

本文实例讲述了Android基于OpenGL在GLSurfaceView上绘制三角形及使用投影和相机视图方法。分享给大家供大家参考,具体如下: 定义三角形 OpenGL 允许我们使用三维坐标来定义物体。在绘制三角形前,我们需要定义它各个点的
2022-06-06

Android开发中怎么使用canvas绘制一个统计图

Android开发中怎么使用canvas绘制一个统计图?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。效果如下: 特点:1.使用非常方便,可放在xml布局文件中,然后在代码
2023-05-31

如何在Python中使用folium绘制地图

这期内容当中小编将会给大家带来有关如何在Python中使用folium绘制地图,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一、简介folium 建立在 Python 生态系统的数据应用能力和 Leafl
2023-06-15

.net中如何以纯二进制的形式在内存中绘制一个对象

本文介绍了如何在.NET中以纯二进制形式在内存中绘制对象,涉及以下步骤:分配未托管内存、获取对象二进制表示并复制到内存、释放托管对象、使用未托管内存。要注意对象需可序列化,并且内存大小须足够。示例代码展示了绘制和释放对象的过程。
.net中如何以纯二进制的形式在内存中绘制一个对象
2024-04-02

如何在Python中使用ECharts绘制气泡图

如何在Python中使用ECharts绘制气泡图ECharts是一个基于JavaSript的数据可视化库,它提供了丰富的图表类型,包括柱状图、折线图、饼图等。在ECharts中,气泡图是一种常用的图表类型,它可以通过不同大小的圆点来展示数据
如何在Python中使用ECharts绘制气泡图
2023-12-17

如何在Python中使用ECharts绘制漏斗图

如何在Python中使用ECharts绘制漏斗图引言:ECharts是一个由百度开发的开源图表库,提供了丰富的图表类型和强大的数据可视化能力。漏斗图是其中一种常用的图表类型,用于展示一系列不同阶段的数据,根据数据的不同,漏斗图的宽度逐渐缩小
如何在Python中使用ECharts绘制漏斗图
2023-12-17

如何在Python中使用ECharts绘制热力图

如何在Python中使用ECharts绘制热力图热力图是一种基于颜色深浅来展示数据变化的可视化方式,广泛用于分析热点密度、趋势和相关性分析等场景。在Python中,我们可以使用ECharts库来绘制热力图,并通过具体的代码示例来演示其使用方
如何在Python中使用ECharts绘制热力图
2023-12-17

如何在Python中使用ECharts绘制雷达图

如何在Python中使用ECharts绘制雷达图摘要:雷达图是一种多维数据可视化图表,用于展示各个维度之间的关系和差异程度。本文将介绍使用Python中的ECharts库来绘制雷达图,并提供详细的代码示例。关键词:Python,EChart
如何在Python中使用ECharts绘制雷达图
2023-12-17

如何在Python中使用ECharts绘制堆叠柱状图

在数据可视化领域,堆叠柱状图是一种常见的可视化方式。它将多个数据系列绘制成一个条形,每个条形由多个子项组成,每个子项对应一个数据系列,在同一坐标系下进行展示。这种图表可以用于比较不同类别或数据系列的总大小、每个类别或数据系列的组成比例等。在
如何在Python中使用ECharts绘制堆叠柱状图
2023-12-17

如何在Python中利用Turtle模块绘制一个国旗

本文章向大家介绍如何在Python中利用Turtle模块绘制一个国旗的基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。python是什么意思Python是一种跨平台的、具有解释性、编译性、互动性和面向对象的脚本语言
2023-06-06

如何在Android中使用PopupWindow制作一个自定义弹窗

本篇文章给大家分享的是有关如何在Android中使用PopupWindow制作一个自定义弹窗,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。代码:PopupWindow pw =
2023-05-31

如何在Android中使用SurfaceView制作一个天气动画效果

如何在Android中使用SurfaceView制作一个天气动画效果?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。首先是最终实现的效果图:初识 SurfaceV
2023-05-31

Android开发如何使用自定义View将圆角矩形绘制在Canvas上的方法

这篇文章主要介绍了Android开发如何使用自定义View将圆角矩形绘制在Canvas上的方法,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Android开发使用自定义Vie
2023-05-30

在canvas中使用 drawImage()方法绘制图片不显示如何解决

本篇文章给大家分享的是有关在canvas中使用 drawImage()方法绘制图片不显示如何解决,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1. canvas标签+id
2023-06-09

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录