
开发高端游戏时,在美感和功能之间找到一个理想平衡点并非易事,而这恰好是本书要解决的问题。如果你具有深厚的C/C++编程背景,并且了解计算机图形基础知识,将发现这本极具价值的书籍涵盖了快速创建一款完整游戏需要的所有知识。OpenGL ES 2.0游戏与图形编程——适用于iOS和Android》由成功的游戏引擎开发人员Romain Marucchi-Foino撰写,涉及游戏开发的所有方面;如加载复杂几何图形和纹理,处理GLSL材质、声音、摄像头和剪辑,物理、路径发现和AI,后期处理效果,实时光照和阴影,以及使用骨骼动画等。运用从本书学到的知识,你将能快速构建出自己的高级游戏。
前 言
欢迎使用本书。本书并不是一本常见的“OpenGL Hello Triangle”书籍—— 也就是说并不会详细解释“为什么”(你可以从Google上找到相关的原因),而重点介绍“如何做”。将会详细地介绍在编写游戏和图形程序时应该做什么,不应该做什么。
本书包括了50多个不同的教程(其中还包括了一些完整的游戏框架),并且采用了一种简单实用的新颖方法重点介绍需要学习的内容,从而确保完成教程后可以创建一款游戏。
我们将学习使用丰富的3D图像创建完整游戏所需的所有元素。如果正在寻找一种好的教学方法来帮助你快速创建梦想中的游戏,那么本书正是你所需要的。
本书读者对象
首先,本书并不是一本入门级图书,而是一本中等层次的书籍,本书假设你已经熟悉线性代数(矩阵、向量和四元数),具有深厚的C/C++编程背景,至少接触过基础的OpenGL或者OpenGL ES,以及知道计算机图形的基本工作方式。
如果已经掌握了这些必需的知识,并且想在游戏和图形编程方面取得闪电般的进步,那么本书正是你所需要的。本书主要是为那些想要学习核心知识以便创建功能完备的游戏并在App Store和Android Market上进行售卖的人所撰写的。
本书主要内容
从根本上讲,本书包括了创建一个完整的游戏所需的所有知识。你将学习创建游戏所涉及的各个方面,如加载3D几何体和纹理,如何处理材质、着色器、声音、摄像头、剪切、物理、AI、路径发现和骨骼动画等。
在学完本书后,你将能使用所学的知识并组合所完成的不同教程以创建自己的高级游戏。
本书组织结构
本书的组织结构是所有的章节都彼此关联。每一章都会逐步向读者演示如何掌握所需的技术,以便能够处理和理解下一章的内容。
接下来是所有章的列表,以及每一章所介绍的内容:
● 第1章“入门”——我们将学习如何构建开发环境,下载本书的SDK,导入并重新编译教程以及如何处理全书将要使用的模板项目。
● 第2章“设置图形投影”—— 由于已经拥有了一个正在运行的模板,因此我们将学习如何构建所需的投影矩阵,以便能够处理2D、2.5D或3D。此外还将学习如何在屏幕上绘制简单几何图形以及如何处理摄像头矩阵。
● 第3章“处理复杂几何图形”—— 我们将通过创建一个Wavefront OBJ查看器来学习如何从磁盘加载复杂几何图形。还将学习如何加载和创建纹理,如何处理基本光照以及响应触摸事件。
● 第4章“构建场景”—— 该章将对第3章学到的知识进行扩展,将解释如何处理更复杂的场景。我们将学习绘图序列以及如何创建可重用的着色器。
● 第5章“优化”—— 该章将介绍可用来优化绘图性能的相关技术。我们将学习纹理压缩和着色器优化的基础知识,学习如何将三角形转换为三角形带以及其他用来获取更佳FPS的提示和技巧。
● 第6章“实时物理”—— 由于在该章之前我们已经学习了如何正确地处理场景,因此该章将介绍如何使用Bullet向场景添加实时物理行为。我们将首先学习如何创建物理世界和物理实体。然后学习如何在代码中使用不同的技术,以便在碰撞回调中或者根据两个或更多个物理实体之间的接触点添加相关逻辑。
● 第7章“摄像头”—— 该章将重点介绍摄像头。我们将首先学习构建视锥平面,并能从摄像头的角度确定场景中每个对象的可见性。然后学习如何实现多种不同类型的摄像头,包括带有碰撞的完整第一人称和第三人称摄像头(你可以在自己的应用程序中使用这些摄像头)。
● 第8章“路径发现”—— 人工智能(AI)和路径发现功能在游戏中通常扮演重要角色,而这恰好是本章将要介绍的内容。我们将学习如何使用Recast和Detour库构建导航网格以及让实体在场景中自动移动。该章还将演示如何使用True Type Font生成字体纹理以及如何在屏幕上绘制动态文本。
● 第9章“音频及其他极佳的游戏编程资料”—— 该章主要介绍如何使用OpenAL来播放音频。我们将学习如何加载OGG Vorbis声音文件以及如何实时地从内存中以流的方式读出这些文件或者静态地将它们存储到音频存储器中。此外,还将学习如何创建3D定位和环境声源,如何使用加速计以及如何实现纹理动画和创建其他多种效果。
● 第10章“高级光照”—— 该章将介绍如何应用动态光照,这可能是游戏和图形编程中最难掌握的内容。在该章,我们将创建多种不同类型的灯(从定向灯到聚光灯),并学习如何实时处理这些灯。
● 第11章“高级FX”—— 该章主要介绍一些特殊效果。我们将学习如何创建全屏的后处理效果、投影纹理和实时阴影,以及如何处理粒子。
● 第12章“骨骼动画”—— 最后的内容并不一定是最不重要的内容。在该章,我们将学习如何使用MD5文件格式处理骨骼动画。该章将首先介绍如何加载和绘制附加到骨骼的网格。然后介绍如何加载动作文件以及如何使用不同类型的混合方法来混合这些动作。
你将会发现,本书并不只是介绍相关理论,还会演示如何将每章所学到的知识应用到实际游戏方案中。
如你所见,本书介绍了在日常游戏或3D应用程序中需要使用的有用知识。如果掌握了本书中的所有内容,就可以很快地开始编写实际的游戏和图形程序。
使用本书所需条件
如果打算为iOS系统开发应用程序,那么需要一台可以支持iOS SDK最新版本的Mac(如果想了解更多的信息,请访问http://developer.apple.com)。由于iOS SDK提供了iPhone/iPod Touch和iPad模拟器(可用开发和测试应用程序),因此iDevice是可选的。该模拟器与本书所包含的内容是完全兼容的。
如果打算为Android开发应用程序,那么需要一台带有Android SDK所支持的操作系统的Mac或PC(更多信息请访问http://developer.android.com)。同时,还需要一台支持OpenGL ES 2.0的Android设备,因为Android SDK绑定的模拟器仅支持OpenGL ES 1.0。
此外,本书使用Blender作为3D建模软件(因为该软件是免费和开源的)。所以,为了测试、调试和重新输出本书SDK中使用的所有测试场景,请从http://blender.org获取该软件的一份副本。
SDK源代码
可从www.wrox.com下载本书中所使用的官方SDK(被压缩为一个.zip文件)。该SDK包含了本书中所介绍的所有教程的最终结果。同时,还包含了SDK的全部源代码以及教程中使用的所有原始资产,因此你可以访问书中的2D/3D场景,并且可以重新编译它们。也可以访问http://www.tupwk.com.cn/downpage,输入本书中文书名或ISBN,下载本书源代码。
此外,我个人还在GFX 3D Engine(一款免费且开源的迷你3D游戏和图形引擎,我们将在本书中使用该引擎,如图0-1所示)的官方网站上提供了本书的SDK(使用了GIT版本的控制系统),可从http://gfx.sio2interactive.com下载该引擎。
图0-1 GFX 3D Engine
读者可以随时从GFX 3D Engine网站找到本书SDK的最新版本(针对上一个版本的bug进行了修复),因为对于我来说,在该网站上可以更加容易地使用版本控制来更新源代码。而对于www.wrox.com上的官方SDK来说,更新速度则相对较慢,因为官方SDK版本是由发布者提供的,如果愿意,可以耐心地等待官方SDK的发布。
此外值得一提的是,在GFX 3D Engine网站上(http://gfx.sio2interactive.com),你可以找到针对本书SDK的支持论坛以及GFX 3D Engine的最新版本。该网站还提供了其他的与3D游戏和图形相关联的演示、教程和其他材料,并且都与本书的SDK完全兼容。
勘误表
尽管我们已经尽了各种努力来保证文章或代码中不出现错误,但是错误总是难免的,如果你在本书中找到了错误,例如拼写错误或代码错误,请告诉我们,我们将非常感激。通过勘误表,可以让其他读者避免受挫,当然,这还有助于提供更高质量的信息。
要在网站上找到本书的勘误表,可以登录http://www.wrox.com,通过Search工具或书名列表查找本书,然后在本书的细目页面上,单击Book Errata链接。在这个页面上可以查看Wrox编辑已提交和粘贴的所有勘误项。完整的图书列表还包括每本书的勘误表,网址是www.wrox.com/misc-pages/booklist.shtml。
如果在Book Errata页面上没有看到你找出的错误,请进入www.worx.com/contact/ techsupport.shtml,填写表单,发电子邮件,我们就会检查你的信息,如果是正确的,就在本书的勘误表中粘贴一个消息,我们将在本书的后续版本中采用。
另外,如果有任何意见和建议,也可以给wkservice@vip.163.com发电子邮件。
p2p.wrox.com
P2P邮件列表是为作者和读者之间的讨论而建立的。读者可以在p2p.wrox.com上加入P2P论坛。该论坛是一个基于Web的系统,用于传送与Wrox图书相关的信息和相关技术,与其他读者和技术用户交流。该论坛提供了订阅功能,当论坛上有新帖子时,会给你发送你选择的主题。Wrox作者、编辑和其他业界专家和读者都会在这个论坛上进行讨论。
在http://p2p.wrox.com上有许多不同的论坛,帮助读者阅读本书,在读者开发自己的应用程序时,也可以从这个论坛中获益。要加入这个论坛,必须执行下面的步骤:
(1) 进入p2p.wrox.com,单击Register链接。
(2) 阅读其内容,单击Agree按钮。
(3) 提供加入论坛所需的信息及愿意提供的可选信息,单击Submit按钮。
(4) 然后就可以收到一封电子邮件,其中的信息描述了如何验证账户,完成加入过程。
加入论坛后,就可以发送新信息,回应其他用户的帖子。可以随时在Web上阅读信息。如果希望某个论坛给自己发送新信息,可以在论坛列表中单击该论坛对应的Subscribe to this Forum图标。
对于如何使用Wrox P2P的更多信息,可阅读P2P FAQ,了解论坛软件的工作原理,以及许多针对P2P和Wrox图书的常见问题解答。要阅读FAQ,可以单击任意P2P页面上的FAQ链接。
目 录
第1章 入门 1
1.1 软件需求 1
1.1.1 针对iOS开发人员 1
1.1.2 针对Android开发人员 2
1.2 下载本书的SDK 3
1.3 导入项目 4
1.3.1 针对iOS开发人员 5
1.3.2 针对Android开发人员 5
1.4 模板 6
1.5 小结 7
第2章 设置图形投影 9
2.1 三种基本的投影类型 9
2.2 正射2D投影 11
2.2.1 程序和项目初始化 12
2.2.2 顶点和片段着色器 14
2.2.3 链接着色器程序 16
2.2.4 绘图代码 18
2.3 正交投影 23
2.4 透视投影 26
2.5 小结 27
第3章 处理复杂几何图形 29
3.1 Wavefront文件格式 29
3.1.1 cube.obj 30
3.1.2 cube.mtl 31
3.2 准备OBJ浏览器代码 31
3.3 加载OBJ 32
3.4 构建着色器 35
3.4.1 顶点着色器 35
3.4.2 片段着色器 36
3.4.3 顶点缓冲区对象 36
3.4.4 存储顶点数据 36
3.4.5 构建顶点数据数组(VBO) 38
3.4.6 构建元素数组VBO 39
3.5 构建VAO 40
3.6 渲染Momo 42
3.7 处理Touche事件 44
3.8 逐顶点光照 45
3.8.1 顶点着色器的光照计算 46
3.8.2 修改片段着色器 47
3.8.3 更多uniform变量 48
3.9 对Momo进行美化 49
3.9.1 加载纹理 49
3.9.2 调整顶点数据 50
3.9.3 向顶点着色器添加UV
支持 52
3.9.4 向片段着色器添加纹理支持 52
3.9.5 绑定纹理 53
3.10 小结 54
第4章 构建场景 55
4.1 处理多个对象 55
4.2 代码结构 56
4.3 加载和绘制场景 57
4.4 着色器代码 61
4.5 不同的对象类型 62
4.6 绘制顺序 62
4.7 修复场景 63
4.7.1 Uber Shader 63
4.7.2 使用Uber Shader 64
4.7.3 渲染循环对象分类 67
4.7.4 双面 69
4.8 逐像素光照 71
4.8.1 使顶点着色器更加丰富 71
4.8.2 获取使用了更多Uber的片段着色器 72
4.8.3 封装实现代码 74
4.9 小结 77
第5章 优化 79
5.1 基本应用程序 79
5.2 从三角形到三角形带 80
5.3 构建三角形带 81
5.4 纹理优化 82
5.5 添加16位纹理转换 83
5.6 PVR纹理压缩 84
5.7 仿造细节 85
5.7.1 凸凹贴图的实现 85
5.7.2 精度限定符优化 86
5.7.3 法线贴图光照计算 88
5.7.4 添加反射 90
5.8 几何图形和着色器LOD 91
5.9 纹理地图集 91
5.10 在软件中管理状态 92
5.11 自动着色器优化 93
5.12 小结 94
第6章 实时物理 95
6.1 物理对象类型 95
6.2 物理形状 96
6.3 使用Bullet 97
6.4 Hello Physics 97
6.5 碰撞回调、触发器和接触点 102
6.5.1 Contact-Added回调 103
6.5.2 Near回调 105
6.5.3 接触点 106
6.6 2D物理 107
6.6.1 更多形状! 108
6.6.2 构建物理对象 111
6.6.3 摄像头跟踪 112
6.6.4 用户交互 114
6.6.5 游戏逻辑 114
6.7 3D物理 118
6.7.1 Bullet文件格式 118
6.7.2 3D弹珠游戏 119
6.8 小结 125
第7章 摄像头 127
7.1 一触即发 128
7.2 摄像头视锥 130
7.2.1 视锥构建方式 131
7.2.2 视锥剪切的实现 132
7.2.3 更多剪切函数 133
7.3 摄像头飞行模式 134
7.4 带有碰撞检测的第一人称
摄像头 139
7.5 3D摄像头跟踪 141
7.6 带有碰撞的第三人称摄像头 143
7.7 小结 148
第8章 路径发现 149
8.1 Recast和Detour 149
8.2 导航 150
8.3 创建导航网格 151
8.4 3D物理拾取 153
8.5 玩家的自动驱动 157
8.6 使路径点可见 159
8.7 游戏“如果能就抓住我!” 161
8.8 了解你的敌人 164
8.9 游戏状态逻辑 165
8.10 小结 168
第9章 音频及其他极佳的游戏编程资料 171
9.1 OpenAL 172
9.2 OGG Vorbis 173
9.3 Hello World OpenAL样式 173
9.4 初始化OpenAL 174
9.5 播放静态内存声音 174
9.6 定位声源 176
9.7 钢琴游戏 177
9.7.1 加载静态的流式声音 178
9.7.2 颜色提取 182
9.7.3 钢琴游戏逻辑 185
9.7.4 最后的调整 188
9.8 滚球游戏 190
9.8.1 GFX着色器 191
9.8.2 链接定位声源 192
9.8.3 加速计驱动摄像头 196
9.8.4 廉价的FX 199
9.8.5 游戏逻辑和调整 200
9.9 小结 206
第10章 高级光照 207
10.1 灯的类型 207
10.2 使用光源 208
10.2.1 定向灯着色器 211
10.2.2 使用Struct作为Uniform 214
10.3 点灯 217
10.3.1 点光源着色器代码 218
10.3.2 光的衰减 221
10.3.3 带有衰减代码的点光源 222
10.3.4 衰减Uniform变量 223
10.3.5 球体点光源 224
10.3.6 调整点光源代码 225
10.3.7 聚光灯 227
10.3.8 聚光灯着色器代码 229
10.4 多个光源 231
10.5 使着色器程序动态化 234
10.6 小结 235
第11章 高级FX 237
11.1 渲染到纹理 238
11.2 后处理效果 238
11.2.1 第一渲染通道 241
11.2.2 第二渲染通道 242
11.2.3 全屏通道和模糊着色器 243
11.3 投影纹理 246
11.4 投影着色器 249
11.5 投影实时阴影 250
11.6 使用深度纹理投射阴影 254
11.7 关于帧缓冲对象的其他内容 255
11.8 粒子 255
11.9 小结 257
第12章 骨骼动画 259
12.1 传统的动画系统与最新的动画系统 259
12.2 MD5文件格式 261
12.3 加载MD5网格 261
12.4 对网格进行动画处理 264
12.4.1 LERP 266
12.4.2 SLERP 266
12.5 混合动画 267
12.6 相加混合 269
12.7 小结 271