从这篇文章开始,接下来会连载一系列的OpenGL相关博文,好好探讨如何在Android中进行OpenGL开发。

OpenGL的全称是“Open Graphics Library”,意思是开放图形库,它定义了一个跨语言、跨平台的图形图像程序接口。对于Android开发者来说,OpenGL就是用来绘制三维图形的技术手段,当然OpenGL并不仅限于展示静止的三维图形,也能用来播放运动着的三维动画。不管是三维图形还是三维动画,都是力求在二维的手机屏幕上面展现模拟的真实世界场景,这个OpenGL的应用方向说到底,可不就是时下大热的虚拟现实么?

看起来OpenGL是很高大上的样子,其实Android系统早已集成了相关的API,只要开发者按照函数要求依次调用,就能一步一步在手机屏幕上画出各式各样的三维物体了。不过对于初次接触OpenGL的开发者来说,三维绘图的概念可能过于抽象,所以为了方便读者理解,下面就以Android上的二维图形绘制为参考,亦步亦趋地逐步消化OpenGL的相关知识点。

从前面的学习可以得知,每个Android界面上的控件,其实都是在某个视图上绘制规定的文字(如TextView),或者绘制指定的图像(如ImageView)。而TextView和ImageView都继承自基本视图View,这意味着首先要有一个专门的绘图场所,比如现实生活中的黑板、画板和桌子。然后还要有绘画作品的载体,比如显示生活中黑板的漆面,以及用于国画的宣纸、用于油画的油布等等,在Android系统中,这个绘画载体便是画布Canvas。有了绘图场所和绘画载体,还得有一把绘图工具,不管是勾勒线条还是涂抹颜料都少不了它,如果是写黑板报则有粉笔,如果是画国画则有毛笔,如果是画油画则有油画笔,如果是画Android控件则有画笔Paint。

所以,只要具备了绘图场所、绘画载体、绘图工具,即可挥毫泼墨进行绘画创作啦。正如前面介绍的Android自定义控件那样,有了视图View、画布Canvas、画笔Paint,方能绘制炫彩多姿的各种控件。那么对于OpenGL的三维绘图来说,也同样需要具备这三种要素,分别是GLSurfaceView、GLSurfaceView.Renderer和GL10,其中GLSurfaceView继承自表面视图SurfaceView,对应于二维绘图的View;GLSurfaceView.Renderer是三维图形的渲染器,对应于二维绘图的Canvas;最后一个GL10自然相当于二维绘图的Paint了。有了GLSurfaceView、GLRender和GL10这三驾马车,Android才能实现OpenGL的三维图形渲染功能。

具体到App编码上面,还得将GLSurfaceView、GLSurfaceView.Renderer和GL10这三个类有机结合起来,即通过函数调用关联它们三个小伙伴。首先从布局文件获得GLSurfaceView的控件对象,然后调用该对象的setRenderer方法设置三维渲染器,这个三维渲染器实现了GLSurfaceView.Renderer定义的三个视图函数,分别是onSurfaceCreated、onSurfaceChanged和onDrawFrame,这三个函数的输入参数都包含GL10,也就是说这三个函数都持有画笔对象。如此一来,绘图三要素的GLSurfaceView、GLSurfaceView.Renderer和GL10就互相关联了起来。

可是,Renderer接口定义的onSurfaceCreated、onSurfaceChanged和onDrawFrame三个函数很是陌生,它们之间又有什么区别呢?为方便理解,接下来不妨继续套用Android二维绘图的有关概念,从Android自定义控件的主要流程得知,自定义一个二维控件,主要有以下四个步骤:

1、声明自定义控件的构造函数,可在此进行控件属性初始赋值等初始化操作;

2、重写onMeasure函数,可在此测量控件的宽度和高度;

3、重写onLayout函数,可在此挪动控件的位置;

4、重写onDraw函数,可在此绘制控件的形状、颜色、文字以及图案等等;

于是前面提到Renderer接口定义的三个函数,它们的用途对照说明如下:

1、onSurfaceCreated函数在GLSurfaceView创建时调用,相当于自定义控件的构造函数,一样可在此进行三维绘图的初始化操作;

2、onSurfaceChanged函数在GLSurfaceView创建、恢复与改变时调用,在这里不但要定义三维空间的大小,还要定义三维物体的方位,所以该函数相当于完成了自定义控件的onMeasure和onLayout两个函数的功能;

3、onDrawFrame顾名思义跟自定义控件的onDraw函数差不多,onDraw函数用于绘制二维图形的具体形状,而onDrawFrame函数用于绘制三维图形的具体形状;

下面来个最简单的OpenGL例子,在布局文件中放置一个android.opengl.GLSurfaceView节点,后续的三维绘图动作将在该视图上开展。布局文件内容示例如下:

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical" >

android:id="@+id/glsv_content"

android:layout_width="match_parent"

android:layout_height="match_parent" />

接着在Activity代码中获取这个GLSurfaceView对象,并给它注册一个三维图形的渲染器GLRender,此时自定义的渲染器GLRender必须重载onSurfaceCreated、onSurfaceChanged和onDrawFrame这三个函数。下面是对应的Activity代码框架例子:@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_gl_cub);

GLSurfaceView glsv_content = (GLSurfaceView) findViewById(R.id.glsv_content);

// 注册渲染器

glsv_content.setRenderer(new GLRender());

}

private class GLRender implements GLSurfaceView.Renderer {

@Override

public void onSurfaceCreated(GL10 gl, EGLConfig config) {

// 这里进行三维绘图的初始化操作

}

@Override

public void onSurfaceChanged(GL10 gl, int width, int height) {

// 这里要定义三维空间的大小,还要定义三维物体的方位

}

@Override

public void onDrawFrame(GL10 gl) {

// 这里绘制三维图形的具体形状

}

}

android绘制过程3d图形,Android开发之OpenGL绘制三维图形的流程相关推荐

  1. tablewidget 多行表头_Qt GUI图形图像开发之QT表格控件QTableView,QTableWidget复杂表头(多行表头) 及冻结、固定特定的行的详细方法与实例...

    我们在开发过程中对于表格使用频率还是挺高的,使用QT框架开发时候我们使用QTableView或者QTableWidget创建表格. 其中表格分为 表格头与表格体: 对于简单地表格,我们可以设置表头来满 ...

  2. python日历gui_python GUI库图形界面开发之PyQt5日期时间控件QDateTimeEdit详细使用方法与实例...

    PyQt5日期时间控件QDateTimeEdit介绍 QDateTimeEdit是一个允许用户编辑日期时间的控件,可以使用键盘上的上下键头按钮来增加或减少日期的时间值,QDateTimeEdit通过s ...

  3. qpython3可视图形界面_python GUI库图形界面开发之PyQt5窗口控件QWidget详细使用方法...

    QWidget基本介绍 基础窗口控件QWidget类是所有用户界面对象的基类,所有的窗口或者控件都直接或者间接的继承自QWidget类. 窗口坐标系统 PyQt使用统一的坐标系统来定位窗口控件的位置和 ...

  4. python 动态调整控件大小_python GUI库图形界面开发之PyQt5动态(可拖动控件大小)布局控件QSplitter详细使用方法与实例...

    PyQt5动态(可拖动控件大小)布局控件QSplitter简介 PyQt还提供了特殊的布局管理器QSplitter.它可以动态地拖动子控件之间的边界,算是一个动态的布局管理器,QSplitter允许用 ...

  5. python嵌套html开发gui_python GUI库图形界面开发之PyQt5表单布局控件QFormLayout详细使用方法与实例...

    PyQt5布局控件QFormLayout简介 QFormLayout是label-field式的表单布局,顾明思议,就是实现表单方式的布局,表单是提示用户进行交互的一种模式,主要有两列组成,第一列用于 ...

  6. python menu实例_python GUI库图形界面开发之PyQt5菜单栏控件QMenuBar的详细使用方法与实例...

    PyQt5菜单栏控件QMenuBar介绍 QMenuBar在QMainWindow对象的标题栏下方,水平的QMenuBar被保留显示QMenu对象 QMenuBar类提供了一个可以包含一个或多个QAc ...

  7. pythongui项目实例_python GUI库图形界面开发之PyQt5状态栏控件QStatusBar详细使用方法实例...

    PyQt5状态栏控件QStatusBar简介 MainWindow对象在底部保留有一个水平条,作为状态栏(QstatusBar),用于显示永久或临时的状态信息 QStatusBar类中的常用方法 方法 ...

  8. 三维图形在计算机如何存储,计算机三维图形技术.pdf

    计算机三维图形技术 杨德星 林晓磊 顾承珠 编著 王 颖 主审 内 容 简 介 本书以 A u toCAD 2004 为平台, 详细地介绍 了三维图形的基本 内容.全书分为 14 章, 主 要有 : ...

  9. android 图片横竖判断_Android应用开发之android 判断ImageView当前显示的是哪一张图片...

    本文将带你了解Android应用开发之android   判断ImageView当前显示的是哪一张图片,希望本文对大家学Android有所帮助. 判断ImageView当前显示的是哪一张图片 Java ...

最新文章

  1. 索引原理,查询机制(转)
  2. 电商云里 guided selling 的一些基本概念
  3. hdu 1536(博弈)
  4. oracle-11g-R2监听文件配置
  5. tomcat 启动项目 页面文字乱码_项目通过tomcat部署到服务器,请求数据页面中文乱码问题...
  6. python 数据可视化利器(bokeh、pyecharts)
  7. 计算机中如何取消家长控制用户,电脑怎么设置家长控制? 家长控制功能的使用技巧...
  8. POJ-1149(网络流)
  9. 从零开始搭二维激光SLAM --- 基于ceres的后端优化的代码实现
  10. linux ghost dd,在Linux上用dd命令实现ghost功能
  11. 如何在CHROME里调试前端代码?
  12. appium工作原理
  13. 网吧十大漏洞曝光(转)
  14. 在Web网页里面实现像Excel/WPS条件格式那样根据数据大小自动改变背景颜色(网页数据热力图实现方法)
  15. 2021TIOBE 11月榜单:Python蝉联榜首,PHP前十“岌岌可危”
  16. XMind思维导图使用详解
  17. 2022杭电多校赛第八场
  18. SAP资产折旧-工作量法业务实践和实操
  19. iOS 汉字转换为拼音
  20. 外部系统接口稽核经验谈

热门文章

  1. cherry-pick 解决gerrit 代码的merge conflict问题
  2. Linux系统分区及挂载点
  3. win10进程太多怎么优化_游戏卡顿却不想升级硬件,Win10免费的超频模式你用过吗...
  4. 新浪微博模拟登陆 java
  5. 翻译|R用于研究,Python用于生产
  6. Python压缩包zipfile
  7. js中的this:从执行上下文的角度看this
  8. Maven项目 (JeecgBoot)修改项目名和模块名方法
  9. 小程序的开发流程(二):小程序管理和配置
  10. 2020年10月30日提高组 C 大鱼吃小鱼