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

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

如果你还不清楚如何定义图形及坐标系统,请移步:Android官方开发文档Training系列课程中文版:OpenGL绘图之图形定义。

在定义了图形之后,你接下来需要做的就是将它绘制到屏幕上。不过使用OpenGL ES 2.0 API来绘制这个图形所需要的代码量可能要比想象中的多一些,这是因为API为图形渲染管道提供了大量的控制细节。

这节课会展示如何绘制上节课所定义的图形。

初始化图形

在开始任何绘制之前,你必须先初始化并加载这个图形。除非是在执行的过程中图形的结构发生了改变。这个时候你应该在渲染器的onSurfaceCreated()方法中去初始化它们,这样可以使内存和进程的效率提升。

public class MyGLRenderer implements GLSurfaceView.Renderer {...private Triangle mTriangle;private Square   mSquare;public void onSurfaceCreated(GL10 unused, EGLConfig config) {...// initialize a trianglemTriangle = new Triangle();// initialize a squaremSquare = new Square();}...
}

绘制图形

绘制自定义图形需要大量的代码,因为你必须给图形渲染管道提供大量的渲染细节。尤其是下面这些必须定义:

  • Vertex Shader - 图形顶点的渲染.
  • Fragment Shader - 图形表面的颜色或纹理的渲染。
  • Program - 一个含有多个渲染器的OpenGL ES对象,可以用它来绘制一个或者多个图形。

你需要至少一个顶点渲染器来绘制图形,并需要一个表面渲染器来为图形着色。这些渲染器首先必须是可执行的,然后才能将其添加到OpenGL ES程序中,这时才能被用来绘制图形。下面定义了一个最基本的可以用来绘制图形的渲染器:

public class Triangle {private final String vertexShaderCode ="attribute vec4 vPosition;" +"void main() {" +"  gl_Position = vPosition;" +"}";private final String fragmentShaderCode ="precision mediump float;" +"uniform vec4 vColor;" +"void main() {" +"  gl_FragColor = vColor;" +"}";...
}

渲染器包含了OpenGL渲染语言代码,这些代码必须先在OpenGL ES环境中编译通过。为了编译这些代码,需要在渲染器类中创建一个功能方法:

public static int loadShader(int type, String shaderCode){// create a vertex shader type (GLES20.GL_VERTEX_SHADER)// or a fragment shader type (GLES20.GL_FRAGMENT_SHADER)int shader = GLES20.glCreateShader(type);// add the source code to the shader and compile itGLES20.glShaderSource(shader, shaderCode);GLES20.glCompileShader(shader);return shader;
}

为了可以绘制图形,必须先编译这些渲染器代码,然后再将其添加到OpenGL程序中,最后再链接到程序中。需要将这些工作放入绘制对象的构造方法中,所以这些工作只用做一次。

Note: OpenGL ES的编译与链接过程需要消耗较高的CPU资源与时间,所以你应该避免这些工作做多次。如果在程序运行之前不知道渲染器的代码,应该确保这部分的构建代码只会执行一次,并需要将其缓存下来以便稍后使用。

public class Triangle() {...private final int mProgram;public Triangle() {...int vertexShader = MyGLRenderer.loadShader(GLES20.GL_VERTEX_SHADER,vertexShaderCode);int fragmentShader = MyGLRenderer.loadShader(GLES20.GL_FRAGMENT_SHADER,fragmentShaderCode);// create empty OpenGL ES ProgrammProgram = GLES20.glCreateProgram();// add the vertex shader to programGLES20.glAttachShader(mProgram, vertexShader);// add the fragment shader to programGLES20.glAttachShader(mProgram, fragmentShader);// creates OpenGL ES program executablesGLES20.glLinkProgram(mProgram);}
}

这时就可以真正的开始绘制了。图形的绘制需要提供若干的参数来告诉渲染管道想要绘制什么及如何绘制。因为绘制选项可以定义多种多样的图形形式,所以可以自定义一个拥有独立绘制逻辑的类来绘制各种图形。

创建一个draw()方法开始绘制这个图形。这部分代码将会为顶点渲染器设置位置数据,并为表面渲染器设置颜色数据。然后开始执行绘制功能。

private int mPositionHandle;
private int mColorHandle;
private final int vertexCount = triangleCoords.length / COORDS_PER_VERTEX;
private final int vertexStride = COORDS_PER_VERTEX * 4; // 4 bytes per vertex
public void draw() {// Add program to OpenGL ES environmentGLES20.glUseProgram(mProgram);// get handle to vertex shader's vPosition membermPositionHandle = GLES20.glGetAttribLocation(mProgram, "vPosition");// Enable a handle to the triangle verticesGLES20.glEnableVertexAttribArray(mPositionHandle);// Prepare the triangle coordinate dataGLES20.glVertexAttribPointer(mPositionHandle, COORDS_PER_VERTEX,GLES20.GL_FLOAT, false,vertexStride, vertexBuffer);// get handle to fragment shader's vColor membermColorHandle = GLES20.glGetUniformLocation(mProgram, "vColor");// Set color for drawing the triangleGLES20.glUniform4fv(mColorHandle, 1, color, 0);// Draw the triangleGLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, vertexCount);// Disable vertex arrayGLES20.glDisableVertexAttribArray(mPositionHandle);
}

一旦完成以上所有的代码,最后只需要调用一下draw()方法就可以开始绘制了:

public void onDrawFrame(GL10 unused) {...mTriangle.draw();
}

当程序启动之后,设备上就会出现以下图形:

上面的示例代码还有几个问题:首先,它不会给人留下什么深刻的印象。其次,当屏幕旋转的时候,这个三角形会有一点被压扁的感觉。这是因为在旋转的时候,代码中所定义的顶点的相对位置被压缩了。这些问题将会在下节课得到解决。

最后,这三角形是固定不变的,这会有些让人有些不爽的感觉。在Adding Motion的课程中将会使这个图形可以随着手势旋转而旋转,还可以通过渲染管道做到其它更多有意思的事情。

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

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

相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

构建时预渲染:网页首帧优化实践

前言 自JavaScript诞生以来,前端技术发展非常迅速。移动端白屏优化是前端界面体验的一个重要优化方向,Web 前端诞生了 SSR 、CSR、预渲染等技术。在美团支付的前端技术体系里,通过预渲染提升网页首帧优化,从而优化了白屏问题&…

论文浅尝 | 利用指针生成网络的知识图谱自然语言生成

论文笔记整理:谭亦鸣,东南大学博士,研究方向为知识图谱问答。来源:Neurocomputing 382: 174-187 (2020)链接:https://www.sciencedirect.com/science/article/abs/pii/S0925231219316820?via%3Dihub指针生成网络在自然…

学术工业界大佬联合打造:ML产品落地流程指南

文 | 白鹡鸰给小铁比了个心编 | 小轶给白鸟鸟比了个赞卖萌屋原创出品,本文禁止转载前言现在已经有了许多现成的ML开发部署工具,所以想要完成一个ML产品并不困难。但在实际开发过程中,人多手杂,免不了一顿兵荒马乱。相比之下&#…

基于GAN的个性化短标题生成在1688平台的实践应用

原文链接:https://developer.aliyun.com/article/770631 基于GAN的个性化短标题生成在1688平台的实践应用 在电商情境下,卖家为了吸引买家兴趣,也为了提高商品被搜索引擎检索命中的概率,通常趋向于写过于冗长的商品标题。如何从过…

LeetCode 16. 最接近的三数之和(固定左端+滑动窗口)

1. 题目 给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。 例如,给定数组 nums [-1,2,1,-4], 和 …

领域应用 | 2020 年中国知识图谱行业分析报告

本文转载自公众号:艾瑞咨询。 核心摘要:人工智能本质是解决生产力升级的问题,人类生产力可以归类为知识生产力和劳动生产力,人工智能走入产业后,可以分为感知智能、认知智能和行为智能,后两者更与生产力相…

Category 特性在 iOS 组件化中的应用与管控

背景 iOS Category功能简介 Category 是 Objective-C 2.0之后添加的语言特性。 Category 就是对装饰模式的一种具体实现。它的主要作用是在不改变原有类的前提下,动态地给这个类添加一些方法。在 Objective-C(iOS 的开发语言,下文用 OC 代替&…

OpenAI亲谈:我们眼中的GPT-3、大规模语言模型的局限性与出路在哪

编译 | 陈彩娴、青暮编辑 | 陈大鑫近日,OpenAI政策研究主管Miles Brundage在推特上分享了一篇新论文,论文内容是对一个GPT-3研讨会的总结。2020年10月14日,来自OpenAI、斯坦福大学HAI研究所等机构的研究人员召集在一起,讨论围绕GP…

Android官方开发文档Training系列课程中文版:OpenGL绘图之响应触摸事件

原文地址:http://android.xsoftlab.net/training/graphics/opengl/touch.html 使图形按照程序设计的轨迹旋转对OpenGL来说还是不能发挥出它应有的实力。但要是能使用户可以直接控制图形的旋转,这才是OpenGL的真正目的。它真正的关键所在就是使程序可以交…

LeetCode 26. 删除排序数组中的重复项

1. 题目 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。 来源:力扣&…

论文浅尝 | Data Intelligence - 多篇语义资源论文

本文转载自公众号:DI数据智能 。 编者按:Data Intelligence最新发表一组语义资源论文,包括世界著名语义网技术专家荷兰阿姆斯特丹自由大学计算机科学系Frank van Harmelen教授团队的Constructing and Cleaning Identity Graphs in the LOD C…

人物志 | 美团首席科学家夏华夏:不断突破边界的程序人生

“成长没有什么秘笈,就是坚持不断地一点点突破自己的边界就好。” 这是美团首席科学家、无人配送部总经理夏华夏在刚刚过去的“1024 程序员节”时送给技术同行的一句话。 这也是夏华夏自己的人生写照:从没摸过计算机的山东高考状元到清华计算机系的学霸&…