Android官方开发文档Training系列课程中文版:OpenGL绘图之环境配置

原文地址:http://android.xsoftlab.net/training/graphics/opengl/index.html

引言

Android framework层为创建绚丽的功能性UI提供了大量的标准工具。然而,如果想要以更多方式来控制屏幕的绘制,或者在三维图形中绘制,那么就需要使用其它工具了。Android framework所提供的OpenGL ES API为我们提供了一系列的工具,这些工具可以用来显示一些高端大气、天马行空的图形,只要你能想得到,那么它就可以做得到。此外,它还得益于很多设备所提供的GPU加速功能。

这节课会讨论OpenGL的开发基础:包括设置环境、绘制对象、移动绘制元素及响应触摸事件。

在接下来的示例代码中使用了OpenGL ES 2.0 API,该版本在当前的Android设备上推荐使用。有关更多OpenGL ES的版本信息,请参见OpenGL开发指南。

Note: 注意不要将OpenGL ES 1.x API与OpenGL ES 2.0 API相混淆!这两个版本的API之间不可交换使用,如果要使用的话,那么只有一个结果,就是悲剧。

构建OpenGL ES的相关环境

为了能在Android应用中使用OpenGL ES,必须给OpenGL ES要绘制的图形区域创建一个View容器。其中一种实现方法就是实现GLSurfaceView及GLSurfaceView.Renderer。其中GLSurfaceView是在OpenGL中绘制图形的View容器。GLSurfaceView.Renderer用于控制应该在刚才的View中绘制什么。有关更多这些类的信息,请参见OpenGL ES开发指南。

GLSurfaceView是将OpenGL ES整合到应用中的唯一途径。对于全屏或者接近全屏的图形View,GLSurfaceView是最合适的选择。开发者如果需要将OpenGL ES整合到一小块区域上,应该使用TextureView。除此之外还可以使用SurfaceView,不过这可能需要相当多的代码才能实现。

这节课将会展示以最省的代码来实现GLSurfaceView及GLSurfaceView.Renderer。

在清单文件中声明OpenGL ES的使用

为了可以使用OpenGL ES 2.0 API,需要在清单文件中添加如下声明:

<uses-feature android:glEsVersion="0x00020000" android:required="true" />

如果应用用到了纹理压缩的功能,那么还需要声明应用所使用到的压缩格式,这样的话,应用只能被安装在支持的设备上。

<supports-gl-texture android:name="GL_OES_compressed_ETC1_RGB8_texture" />
<supports-gl-texture android:name="GL_OES_compressed_paletted_texture" />

有关更多纹理压缩格式的相关信息,请参见OpenGL开发指南。

为OpenGL ES创建一个Activity

与普通的应用相同,OpenGL ES也同样需要用户界面。主要的不同在于普通的应用只需要将布局放入Activity就可以。在使用OpenGL ES的应用中,除了使用普通的TextView这类基本控件之外,还需要添加GLSurfaceView。

下面这段代码展示了使用GLSurfaceView的最基本实现:

public class OpenGLES20Activity extends Activity {private GLSurfaceView mGLView;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// Create a GLSurfaceView instance and set it// as the ContentView for this Activity.mGLView = new MyGLSurfaceView(this);setContentView(mGLView);}
}

Note: OpenGL ES 2.0需要在Android 2.2及以上的版本上才能运行,请确保应用程序的最低版本在此之上。

构建GLSurfaceView对象

GLSurfaceView是一块特殊的区域,它可以用户绘制OpenGL ES图形。它本身不需要做太多事情。实际上,图形的绘制是由GLSurfaceView.Renderer来控制的。事实上,你可能想要试着不去继承这个类,而是直接创建一个原生的GLSurfaceView实例,不要这么去做。你需要继承这个类来捕获触摸事件,相关信息在Responding to Touch Events课程中有涉及到。

本质上GLSurfaceView的代码是很少的,所以为了快速去实现它,常见的做法是在使用这个对象的Activity中创建一个内部类:

class MyGLSurfaceView extends GLSurfaceView {private final MyGLRenderer mRenderer;public MyGLSurfaceView(Context context){super(context);// Create an OpenGL ES 2.0 contextsetEGLContextClientVersion(2);mRenderer = new MyGLRenderer();// Set the Renderer for drawing on the GLSurfaceViewsetRenderer(mRenderer);}
}

对GLSurfaceView的其它附加选项就是设置其渲染模式:

// Render the view only when there is a change in the drawing data
setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);

这个选项阻止了GLSurfaceView框架的重新绘制,直到requestRender()方法被调用。这可以提高应用的效率。

构建渲染器类

类GLSurfaceView.Renderer是真正有意思的地方。这个类可以控制在GLSurfaceView上所绘制的事物。它内部有3个方法,这3个方法由Android系统调用,用于计算如何在GLSurfaceView上进行绘制:

  • onSurfaceCreated()在设置OpenGL ES环境的时候调用一次。
  • onDrawFrame() view的每次绘制都会调用。
  • onSurfaceChanged() 在view的结构发生改变的时候进行调用,比如设备的屏幕方向发生了变化。

下面是OpenGL ES渲染器的最基本实现,这里只是在GLSurfaceView简单绘制了一个黑色的背景:

public class MyGLRenderer implements GLSurfaceView.Renderer {public void onSurfaceCreated(GL10 unused, EGLConfig config) {// Set the background frame colorGLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);}public void onDrawFrame(GL10 unused) {// Redraw background colorGLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);}public void onSurfaceChanged(GL10 unused, int width, int height) {GLES20.glViewport(0, 0, width, height);}
}

上面就是要做的所有工作了。上面的代码使用OpenGL绘制了一个黑色的背景。虽然这些代码并没有做什么有意思的事情,但是通过创建这些类,你就可以为通过OpenGL绘制图形打下了基础。

Note: 你可能会怀疑,在使用OpengGL ES 2.0 API时,为什么这些方法都会有个名叫GL10的参数。这些在2.0 API中重复使用到的签名方法是为了保持Android framework的代码简便。

如果你对OpenGL ES API很熟悉,你现在就可以设置OpenGL ES的环境并着手绘制图形了。无论如何,如果你想获取更多有关OpenGL的入门帮助,可以查看下节上部分的一些小提示。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/479111.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

中文常用停用词表(哈工大停用词表、百度停用词表

中文常用停用词表&#xff08;哈工大停用词表、百度停用词表等&#xff1a;https://github.com/goto456/stopwords

论文浅尝 | AAAI2020 - 基于规则的知识图谱组合表征学习

论文笔记整理&#xff1a;康矫健&#xff0c;浙江大学计算机科学与技术系&#xff0c;硕士研究生。论文链接&#xff1a;https://arxiv.org/pdf/1911.08935.pdf发表会议&#xff1a;AAAI 2020Motivation现有的KG Embedding方法大部分仅关注每个三元组的结构化信息有部分的工作把…

26岁!年入100万,两周把 Github 项目推向全球榜首,他是怎么做的?

今天要为大家介绍一位很厉害的朋友 —— 小浩。九零后&#xff0c;20 年年收入近百万。 大家不需要质疑他的收入&#xff0c;在他没做公众号的时候&#xff0c;我知道收入已有五六十。而公众号&#xff0c;只是疫情期间他因无聊而产出的结果&#xff0c;那结果怎么样呢&#xf…

美团餐饮娱乐知识图谱——美团大脑揭秘

前言 “ I’m sorry. I can’t do that, Dave.” 这是经典科幻电影《2001: A Space Odyssey》里HAL 9000机器人说的一句话&#xff0c;浓缩了人类对终极人工智能的憧憬。让机器学会说这样简单一句话&#xff0c;需要机器具备情感认知、自我认识以及对世界的认识&#xff0c;来辅…

Android官方开发文档Training系列课程中文版:OpenGL绘图之图形定义

原文地址&#xff1a;http://android.xsoftlab.net/training/graphics/opengl/shapes.html 使用OpenGL绘制图形的第一步就是要定义一个图形。如果不清楚OpenGL如何绘制自定义图形的相关基础知识时&#xff0c;那么使用OpenGL一定要仔细。 这节课将会简单讲述OpenGl ES的坐标系…

LeetCode 765. 情侣牵手(贪心)

1. 题目 N 对情侣坐在连续排列的 2N 个座位上&#xff0c;想要牵到对方的手。 计算最少交换座位的次数&#xff0c;以便每对情侣可以并肩坐在一起。 一次交换可选择任意两人&#xff0c;让他们站起来交换座位。 人和座位用 0 到 2N-1 的整数表示&#xff0c;情侣们按顺序编号…

Python 捕获异常

Python捕获异常 一.常见异常 1.语法错误:SyntaxError:invalid syntax (1)案例: (1)解决方法: ①查看代码有没有红色波浪线 ②熟悉python基本语法 2.变量名不存在:NameError:name b is not defined (1)案例: (2)解决方法: ①检查对应的变量名是否有定义并赋值,是否写错了变量名…

论文浅尝 | WWW2020 - 知识图谱中的实体摘要:算法、评价和应用 (PPT)

本文转载自公众号&#xff1a;专知。知识图谱封装了实体和关系。知识图谱的简洁表示格式和图的特性使得许多新的Web应用程序得以创建&#xff0c;并增强了现有的应用性能。然而&#xff0c;在一个知识图谱中&#xff0c;描述一个实体的几十个或几百个事实可能会超出一个典型用户…

一条互联网广告多少钱?

文 | 申探社本文已获作者授权&#xff0c;禁止二次转载一. 导读互联网广告中的出价模式发展经历了许多变迁。从一开始的CPM&#xff0c;到CPC出价模式&#xff0c;随着Facebook的oCPX (如oCPM/oCPC) 成为了网红&#xff0c;之后的双出价&#xff0c;激活且付费&#xff0c;Face…

LeetCode 100. 相同的树(二叉树遍历)

1. 题目 给定两个二叉树&#xff0c;编写一个函数来检验它们是否相同。 如果两个树在结构上相同&#xff0c;并且节点具有相同的值&#xff0c;则认为它们是相同的。 2. 解题 2.1 递归 class Solution { public:bool isSameTree(TreeNode* p, TreeNode* q) {if(!p &&am…

Android官方开发文档Training系列课程中文版:OpenGL绘图之图形绘制

原文地址&#xff1a;http://android.xsoftlab.net/training/graphics/opengl/draw.html 如果你还不清楚如何定义图形及坐标系统&#xff0c;请移步&#xff1a;Android官方开发文档Training系列课程中文版&#xff1a;OpenGL绘图之图形定义。 在定义了图形之后&#xff0c;你…

Python之极验滑动验证码的识别(教程+案例)+识别豆瓣登录滑动验证码(附源码)

Python之极验滑动验证码的识别&#xff08;教程案例&#xff09; def get_tracks(distance, rate0.6, t0.2, v0):"""将distance分割成小段的距离:param distance: 总距离:param rate: 加速减速的临界比例:param a1: 加速度:param a2: 减速度:param t: 单位时间…

论文浅尝 | ICLR 2020 - 一文全览知识图谱研究

本文转载自公众号&#xff1a;AI科技评论 作者 | Michael Galkin编译 | 贾伟ICLR 2020 正在进行&#xff0c;但总结笔记却相继出炉。我们曾对 ICLR 2020 上的趋势进行介绍&#xff0c;本文考虑的主题为知识图谱。作者做波恩大学2018级博士生 Michael Galkin&#xff0c;研究方…

Android官方开发文档Training系列课程中文版:OpenGL绘图之应用投影与相机视图

原文地址&#xff1a;http://android.xsoftlab.net/training/graphics/opengl/projection.html##transform 在OpenGL ES环境中&#xff0c;投影相机View可以将所绘制的图形模拟成现实中所看到的物理性状。这种物理模拟是通过改变对象的数字坐标实现的&#xff1a; 投影 - 这基…

算法工程师怎样提升业务理解能力?

文 | 桔了个仔知乎本文已获作者授权&#xff0c;禁止二次转载我刚转做金融风控时&#xff0c;觉得自己写代码多年了&#xff0c;对金融风控的业务不上心&#xff0c;公司让我做什么我就用自认为及其优雅的编码方式解决&#xff0c;但对为什么要做这个事&#xff0c;做了对业务上…

强化学习在美团“猜你喜欢”的实践

1 概述 “猜你喜欢”是美团流量最大的推荐展位&#xff0c;位于首页最下方&#xff0c;产品形态为信息流&#xff0c;承担了帮助用户完成意图转化、发现兴趣、并向美团点评各个业务方导流的责任。经过多年迭代&#xff0c;目前“猜你喜欢”基线策略的排序模型是业界领先的流式更…

维多利亚的秘密 2005-2018年视频合集

维多利亚的秘密 2005-2018年视频合集&#xff1a;https://www.bilibili.com/video/BV18A411v7Wp?p14

论文浅尝 | CoRR - 面向复杂知识问答的框架语义解析方法

论文笔记整理&#xff1a;谭亦鸣&#xff0c;东南大学博士。来源&#xff1a;CoRR abs/2003.13956 (2020)链接&#xff1a;https://arxiv.org/pdf/2003.13956.pdfKBQA任务中的语义解析目标是将自然语言问题转化为标准查询&#xff0c;而后用于构建知识库查询。现有的方法主要依…

全栈深度学习第1期:如何启动一个机器学习项目?

一 起 追 剧 鸭 &#xff01;简介Berkeley全栈深度学习追剧计划是由夕小瑶的卖萌屋发起的优质公开课打卡项目&#xff0c;通过微信群为同期追剧的小伙伴提供交流平台。关于该计划的详请见这里。1. Berkeley深度学习追剧群目前已有1000小伙伴加入&#xff0c;公众号后台回复口令…

超详细中文注释的GPT2新闻标题生成项目

超详细中文注释的GPT2新闻标题生成项目&#xff1a;https://zhuanlan.zhihu.com/p/338171330 笔者开源了一个带有超详细中文注释的GPT2新闻标题生成项目。该项目参考了GPT2-Chinese、GPT2-chitchat、CDial-GPT、GPT2等多个GPT2开源项目&#xff08;感谢大佬们的开源&#xff09…