《OpenGL ES应用开发实践指南:Android卷》—— 2.3 定义空气曲棍球桌子的结构

2.3 定义空气曲棍球桌子的结构

在桌子被绘制到屏幕之前,我们需要告诉OpenGL要画什么。开发过程中的第一步是以OpenGL能理解的形式定义一个桌子结构。在OpenGL里,所有东西的结构都是从一个顶点开始。

2.3.1 介绍顶点

简单来说,一个顶点就是一个代表几何对象的拐角的点,这个点有很多附加属性;最重要的属性就是位置,它代表了这个顶点在空间中的定位。

2.3.2 用顶点构建游戏中的桌子

我们曾说过要暂时保持事物简单,那什么是能表达空气曲棍球桌子结构的最基本的图形呢?我们可以使用长方形。既然一个长方形有4个拐角,我们就需要4个顶点。长方形是一个二维物体,因此每个顶点都需要一个位置,这个位置在每个维度上都要有一个坐标。
如果我们要把它画到一张图纸上,我们会得到与图2-2类似的图形。

2.3.3 在代码中定义顶点

让我们继续,并写一些代码存储这些顶点;这些顶点会表示为一个浮点数列表;因为它们定义在二维坐标系里,所以每个顶点要用两个浮点数进行标记:一个标记x轴的位置,另外一个标记y轴的位置。
因为一个顶点有两个分量,所以首先创建一个常量用来记住这一事实;打开AirHockeyRenderer类,并在它的顶端加入如下常量:

我们采用了浮点数的顺序列表定义顶点数据,因此,我们可以用有小数点的十进制数存储这些位置;这个数组通常称为顶点属性(attribute)数组。到目前为止,只有位置属性储存了,但是,我们稍后也会把颜色及其他属性用同样的概念储存起来。

2.3.4 点、直线及三角形

还记得前面曾说过表示曲棍球桌子的最容易的方式是长方形吗?然而,令人感到混乱的一点是:在OpenGL里,只能绘制点、直线以及三角形。
三角形是最基本的几何图形;因为它的结构如此稳定,它随处可见,比如桥梁的结构化构件;它有三条边用来连接它的三个顶点,如果我们拿掉其中一个顶点,剩下的就是一条直线,如果我们再拿掉一个点,就只剩下一个点了。
点和直线可以用于某些效果,但是,只有三角形才能用来构建拥有复杂的对象和纹理的场景。在OpenGL里,我们把单独的点放在一个组里构建出三角形,再告诉OpenGL如何连接这些点。我们想要构建的所有东西都要用点、直线和三角形定义;如果想构建更复杂的图形,例如拱形,那我们就需要用足够的点拟合这样的曲线。
如果不能使用长方形,我们怎么定义空气曲棍球的桌子呢?事实上,我们可以认为桌子是由两个三角形连接在一起的,如图2-3所示。

让我们改变代码以反映这一事实,我们现在使用两个三角形而不是一个长方形:

三角形的卷曲顺序
你可能注意到了,当我们定义三角形的时候,我们总是以逆时针的顺序排列顶点;这称为卷曲顺序(winding order)。因为在任何地方都使用这种一致的卷曲顺序,可以优化性能:使用卷曲顺序可以指出一个三角形属于任何给定物体的前面或者后面,OpenGL可以忽略那些无论如何都无法被看到的后面的三角形。
在12.5节中我们会学到更多内容。
这个数组表示用六个顶点表示两个三角形;第一个三角形由(0, 0)、(9, 14)及(0, 14)连接组成,第二个三角形共用了其中的两个点,它由(0, 0)、(9,0)及(9, 14)构成。
无论何时,如果我们想表示一个OpenGL中的物体,都要考虑如何用点、直线及三角形把它组合出来。

2.3.5 添加中间线和两个木槌

我们几乎要完成所有顶点的定义了;我们只需要为中间线和两个木槌添加一些顶点。最后,会得到与图2-4相似的图形。

我们将用一条直线定义中间线,并用一个点表示每个木槌。在数组的最后添加一个分号,然后加入下面这些新的
顶点:

如你所见,由于这个数组由浮点值组合而成,我们可以使用带小数的十进制坐标。为了让Java编译器工作,需要在每个数的后面加上小写f,它告诉Java编译器把这个数字解释为浮点数(float),而不是双精度浮点数(double);双精度浮点数有大约两倍的精度(这是其名字的由来),如果我们不加f,Java编译器会把它当作精度丢失的转换,会要求增加显式的类型转换(cast)。

时间: 2024-08-30 21:59:28

《OpenGL ES应用开发实践指南:Android卷》—— 2.3 定义空气曲棍球桌子的结构的相关文章

《OpenGL ES应用开发实践指南:Android卷》—— 导读

前 言 Android刚刚经历了一个难以置信的增长周期,全世界的消费者手里有超过7.5亿台设备,并且每天都有一百多万台设备被激活.和Apple一样,在每一台Android手机和平板上也有个集中的市场,称为Google Play.随着这个市场被安装到每台Android设备上,对任何一个梦想着发布自己的游戏或者壁纸的人来说,这都是个前所未有的机会. 在Android上,与Apple的iOS及许多其他移动平台一样,开发者可以使用一个跨平台应用编程接口创建二维或者三维图形,这个接口称为OpenGL:Op

《OpenGL ES应用开发实践指南:Android卷》—— 2.1 为什么选择空气曲棍球

2.1 为什么选择空气曲棍球 空气曲棍球是一个简单.流行的游戏,经常可以在保龄球馆和酒吧里见到它.尽管简单,但非常容易让人上瘾.在Android的应用市场--Google Play里,一些顶级游戏都是基于该游戏或者其他令人愉快的游戏的变种.随着空气曲棍球游戏开发的讲解,我们会学习很多OpenGL概念.我们会学习如何定义和绘制一个可以玩游戏的桌子,以及如何添加一些细节,如颜色.着色器和纹理.我们也会学习如何通过执行触屏事件响应用户操作. 游戏规则要玩空气曲棍球游戏,我们需要一个有两个球门的长方形桌

《OpenGL ES应用开发实践指南:Android卷》—— 2.5 引入OpenGL管道

2.5 引入OpenGL管道 现在,我们已经定义了曲棍球桌子的结构,并且把这些数据复制到了OpenGL可以存取的本地内存:在把曲棍球桌子画到屏幕上之前,它需要在OpenGL的管道(pipeline)中传递,这就需要使用称为着色器(shader)的子例程(见图2-6).这些着色器会告诉图形处理单元(GPU)如何绘制数据.有两种类型的着色器,在绘制任何内容到屏幕之前,需要定义它们.Joe问:什么是字节序字节序(Endianness)是描述一个硬件架构是如何组织位(bit)和字节(byte)的方式,它

《OpenGL ES应用开发实践指南:Android卷》—— 3.4 做最后的拼接

3.4 做最后的拼接 我们在前两章中用了很大篇幅为这个应用打下了很好的基础:我们学习了如何使用属性数组定义一个物体的结构,也学习了如何创建着色器.加载并编译它们,以及把它们链接起来形成一个OpenGL的程序. 现在是时候在这个基础上开始构建并把它们拼接起来了.在下面的几个步骤里,我们就要把这些部分拼在一起,并准备好把第一个版本的空气曲棍球桌子画到屏幕上. 3.4.1 验证OpenGL程序的对象 在开始使用OpenGL的程序之前,我们首先应该验证一下它,看看这个程序对于当前的OpenGL状态是不是

《OpenGL ES应用开发实践指南:Android卷》——第3章 编译着色器及在屏幕上绘图

第3章 编译着色器及在屏幕上绘图 本章会继续上一章开始的工作.作为本章的开发计划,我们首先加载并编译前面定义的着色器,然后把它们链接在一起放在OpenGL的一个程序里.我们接下来就可以用着色器程序在屏幕上绘制空气曲棍球桌子了.打开上一章启动的AirHockey1项目,并从那里开始.

《OpenGL ES应用开发实践指南:Android卷》—— 2.7 小结

2.7 小结 本章用大量篇幅只介绍了如何定义数据,以及沿着OpenGL管道移动数据的着色器.让我们花点儿时间复习一下本章学到的那些关键概念:首先,我们学习了如何定义一个顶点属性数组,并把这个数组复制到本地内存里,以便OpenGL存取它.然后,我们写了一个顶点着色器和一个片段着色器:并了解到一个着色器只是可以运行在GPU上的一个特殊类型的程序.在下一章里,我们会在本章的基础上继续开发:在下一章的结尾处,我们就能看到空气曲棍球桌子了,也将为进一步的练习做好准备.我们将以学习如何读入和编译定义过的着色

《OpenGL ES应用开发实践指南:Android卷》—— 3.5 在屏幕上绘制

3.5 在屏幕上绘制 随着完成这些最后的连接,我们现在就准备好开始在屏幕上绘制了!我们将先画桌子,然后画分隔线和木槌. 3.5.1 绘制桌子 在onDrawFrame()结尾处,让我们在glClear()调用之后加入如下代码: 我们首先通过调用glUniform4f()更新着色器代码中的u_Color的值.与属性不同,uniform的分量没有默认值,因此,如果一个uniform在着色器中被定义为vec4类型,我们需要提供所有四个分量的值.我们想要以画一张白桌子作为开始,因此,我们把红色.绿色和蓝

《OpenGL ES应用开发实践指南:Android卷》—— 3.6 小结

3.6 小结 在最后把第一个版本的空气曲棍球桌子显示之前,我们不得不撰写了很多样例代码,好消息是,我们可以在后面的项目中重用这些代码.让我们花点儿时间回顾一下本章学过的内容:如何创建和编译着色器.顶点着色器和片段着色器总是一起工作,我们也学到了如何把它们链接到一起形成一个OpenGL的程序对象.如何把一个顶点着色器内部的属性变量与顶点属性数组关联起来.最后,我们把所有的内容放在一起,在屏幕上显示一些东西.既然我们已经把所有的知识点串连起来了,现在可能是时候回顾一下本章当时可能感觉不太清楚的部分了

《OpenGL ES应用开发实践指南:Android卷》—— 1.1 安装工具

1.1 安装工具 下面是开发Android OpenGL所需要的基本工具列表: 一台运行Windows.OS X或者Linux的计算机 Java开发包(JDK) Android软件开发包(SDK) 集成开发环境(IDE) 一个手机.平板电脑或者支持OpenGL ES 2.0的模拟器 你需要的第一个工具是一台适合开发的个人计算机:任何较新的计算机都可以,它需要能运行Windows.OS X或者Linux.在这台计算机上,你需要安装Java开发包,可以从Oracle的网站下载:当前,Google指定