《华章 OpenGL ES 3.0编程指南(原书第2版)》由资深OpenGL技术专家亲笔撰写,全面介绍OpenGL ES 3.0的各种特性及新增功能; 通过大量已经编译和测试过的实例,详细讲解OpenGL ES 3.0中的应用程序接口(API)和图形管线,既涵盖简单图形的渲染方法,又深入介绍逐像素照明和粒子系统等高级渲染技术,并且包含大量有效使用API和硬件的实用技巧,为手持设备的各种高性能3D应用开发提供翔实指导。
内容简介
《华章 OpenGL ES 3.0编程指南(原书第2版)》由资深OpenGL技术专家亲笔撰写,全面介绍OpenGL ES 3.0的各种特性及新增功能, ,通过大量已经编译和测试过的实例,详细讲解OpenGL ES 3.0中的应用程序接口(API)和图形管线,既涵盖简单图形的渲染方法,又深入介绍逐像素照明和粒子系统等高级渲染技术,并且包含大量有效使用API和硬件的实用技巧,为手持设备的各种高性能3D应用开发提供翔实指导。 《华章 OpenGL ES 3.0编程指南(原书第2版)》共16章:第1章简单介绍OpenGL ES ,并概述OpenGL ES 3.0图形管线;第2章通过绘制一个三角形的简单OpenGL ES 3.0示例程序,讲解一些API概念,并说明如何构建和运行OpenGL ES示例程序;第3章讲述为OpenGL ES 3.0创建表面和渲染上下文的API——EGL;第4章讨论创建着色器对象、编译着色器和检查编译错误的方法;第5章讲解编写着色器所需的着色语言基本知识;第6章详细介绍几何形状输入图形管线的方法,包含对顶点属性、顶点数组和缓冲区对象的讨论;第7章讨论几何形状如何装配成图元,介绍OpenGL ES 3.0中所有可用图元类型,包括点精灵、直线、三角形、三角形条带和三角扇形;第8章概述顶点着色器如何融入管线,以及OpenGL ES 着色语言中可用于顶点着色器的特殊变量;第9章和第10章介绍片段着色器,包括多重纹理、雾化、Alpha测试和用户裁剪平面等;第11章讨论片段操作,包括剪裁测试、模板测试、深度测试、多重采样、混合和抖动;第12章介绍使用帧缓冲区对象渲染屏幕外表面;第13章讨论同步对象和栅栏的使用方法;第14章介绍OpenGL ES 3.0高级编程,包含使用法线贴图的逐像素照明、环境贴图、粒子系统、图像后处理、程序纹理、阴影贴图、地形渲染和投影纹理等渲染技术。;第15章提供OpenGL ES 3.0中各种可用状态查询的参考;第16章讨论如何为iOS 7、Android 4.3 NDK、Android 4.3 SDK、Windows和Linux构建OpenGL ES样板代码。
作者简介
Dan Ginsburg,Upsample Software公司创始人,该软件公司提供3D图形和GPU计算的咨询服务。Dan参与撰写了多部著作,包括《OpenCL 编程指南》和《OpenGL Shading Language》(第3版)。在过去的工作中,Dan曾经开发OpenGL驱动程序、桌面和手持3D演示、GPU开发人员工具、3D医学显示和游戏。
Dave Shreiner,ARM公司图形与GPU计算部门主管,自从OpenGL诞生之日起就积极地参与到它的开发当中。他创建了OpenGL的个商业培训课程,并且拥有超过20年的OpenGL编程教学经验。
精彩书评
★作为一名图形技术人员和认真的OpenGL ES开发人员,我真心诚意地认为,如果你只购买一本有关OpenGL ES 3.0编程的书籍,那么就应该是买这本书。Dan和 Budirijanto的这本书很明显是程序员写给程序员的书,任何对OpenGL ES 3.0感兴趣的人都有必要阅读它。你会发现在编程过程中,你将会一次又一次地打开本书,而不是阅读OpenGL ES 的规范。我极力推荐你阅读它! —— Rick Tewell,Freescale图形技术架构师
★本书用清晰、全面的解释和大量示例,介绍了OpenGL ES的版本,任何开发移动应用的人的桌面上都应该有它。 —— Dave Astle,高通公司图形工具主管,GameDev.net创始人
OpenGL ES 3.0是在手持设备和嵌入式设备上渲染复杂3D图形的软件接口。OpenGL ES是具有可编程3D硬件的手持和嵌入式设备(包括手机、个人数字助理(PDA)、控制台、家用设备、车辆和航空电子设备)的主要图形程序库。本书详细地介绍了整个OpenGL ES 3.0应用程序编程接口(API)和管线,并包含详细的例子,为手持设备的各种高性能3D应用的开发提供指导。 目标读者 本书是为对学习OpenGL ES 3.0感兴趣的开发人员所写的,我们希望读者在计算机图形学领域有一定的基础。在正文部分我们解释了许多相关的图形学概念,因为它们与OpenGL ES 3.0的各个部分有关,但是我们期望读者理解基本的3D概念。本书中的代码示例都以C语言编写。我们假定读者熟悉C或者C++,并且只介绍与OpenGL ES 3.0相关的语言主题。 读者将学到有关图形管线各个方面的设置和编程的知识。本书详细介绍了如何编写顶点和片段着色器,以及如何实现逐像素照明和粒子系统等高级渲染技术。此外,书中还提供性能提示以及有效使用API和硬件的技巧。 完成本书的学习之后,读者就能为编写充分利用嵌入式图形硬件可编程能力的OpenGL ES 3.0应用做好准备。 本书的组织结构 本书将顺序介绍API,帮助你逐步形成对OpenGL ES 3.0的认识。 第1章——OpenGL ES 3.0简介 第1章简单介绍OpenGL ES,概述了OpenGL ES 3.0图形管线,讨论了OpenGL ES 3.0的设计理念和限制,最后介绍了OpenGL ES 3.0中使用的一些约定和类型。 第2章——你好,三角形:一个OpenGL ES 3.0示例 第2章介绍绘制三角形的一个简单OpenGL ES 3.0示例。我们的目的是说明OpenGL ES 3.0程序的样子,向读者介绍一些API概念,并说明如何构建和运行OpenGL ES 3.0示例程序。 第3章——EGL简介 第3章介绍EGL——为OpenGL ES 3.0创建表面和渲染上下文的API。我们说明与原生窗口系统通信、选择配置和创建EGL渲染上下文及表面的方法,传授足够多的EGL知识,你可以了解到启动OpenGL ES 3.0进行渲染所需的所有知识。 第4章——着色器和程序 着色器对象和程序对象是OpenGL ES 3.0中最基本的对象。第4章介绍创建着色器对象、编译着色器和检查编译错误的方法。这一章还说明如何创建程序对象、将着色器对象连接到程序对象以及链接最终程序对象的方法。我们讨论如何查询程序对象的信息以及加载统一变量(uniform)的方法。此外,你将学习有关源着色器和程序二进制代码之间的差别以及它们的使用方法。 第5章——OpenGL ES着色语言 第5章介绍编写着色器所需的着色语言的基础知识。这些着色语言基础知识包括变量和类型、构造器、结构、数组、统一变量、统一变量块(uniform block)和输入/输出变量。该章还描述着色语言的某些更细微的部分,例如精度限定符和不变性。 第6章——顶点属性、顶点数组和缓冲区对象 从第6章开始(到第11章为止),我们将详细介绍管线,教授设置和编程图形管线各个部分的方法。这一旅程从介绍几何形状输入图形管线的方法开始,包含了对顶点属性、顶点数组和缓冲区对象的讨论。 第7章——图元装配和光栅化 在前一章讨论几何形状输入图形管线的方法之后,第7章将讨论几何形状如何装配成图元,介绍OpenGL ES 3.0中所有可用的图元类型,包括点精灵、直线、三角形、三角形条带和三角扇形。此外,我们还说明了在顶点上进行坐标变换的方法,并简单介绍了OpenGL ES 3.0管线的光栅化阶段。 第8章——顶点着色器 我们所介绍的管线的下一部分是顶点着色器。第8章概述了顶点着色器如何融入管线以及OpenGL ES 着色语言中可用于顶点着色器的特殊变量,介绍了多个顶点着色器的示例,包括逐像素照明和蒙皮(skinning)。我们还给出了用顶点着色器实现OpenGL ES 1.0(和1.1)固定功能管线的示例。 第9章——纹理 第9章开始介绍片段着色器,描述OpenGL ES 3.0中所有可用的纹理功能。该章提供了创建纹理、加载纹理数据以及纹理渲染的细节,描述了纹理包装模式、纹理过滤、纹理格式、压缩纹理、采样器对象、不可变纹理、像素解包缓冲区对象和Mip贴图。该章介绍了OpenGL ES 3.0支持的所有纹理类型:2D纹理、立方图、2D纹理数组和3D纹理。 第10章——片段着色器 第9章的重点是如何在片段着色器中使用纹理,第10章介绍编写片段着色器所需知道的其他知识。该章概述了片段着色器和所有可用的特殊内建变量,还演示了用片段着色器实现OpenGL ES 1.1中所有固定功能技术的方法。多重纹理、雾化、Alpha测试和用户裁剪平面的例子都使用片段着色器实现。 第11章——片段操作 第11章讨论可以适用于整个帧缓冲区或者在OpenGL ES 3.0片段管线中执行片段着色器后适用于单个片段的操作。这些操作包括剪裁测试、模板测试、深度测试、多重采样、混合和抖动。本章介绍OpenGL ES 3.0图形管线的最后阶段。 第12章——帧缓冲区对象 第12章讨论使用帧缓冲区对象渲染屏幕外表面。帧缓冲区对象有多种用法,最常见的是渲染到一个纹理。本章提供API帧缓冲区对象部分的完整概述。理解帧缓冲区对象对于实现许多高级特效(如反射、阴影贴图和后处理)至关重要。 第13章——同步对象和栅栏 第13章概述同步对象和栅栏,它们是在OpenGL ES 3.0主机应用和GPU执行中同步的有效图元。我们讨论同步对象和栅栏的使用方法,并以一个示例作为结束。 第14章——OpenGL ES 3.0高级编程 第14章是核心章节,将本书介绍的许多主题串联在一起。我们已经选择了高级渲染技术的一个样本,并展示了实现这些功能的示例。该章包含使用法线贴图的逐像素照明、环境贴图、粒子系统、图像后处理、程序纹理、阴影贴图、地形渲染和投影纹理等渲染技术。 第15章——状态查询 OpenGL ES 3.0中有大量的状态查询。对于你的几乎任何设置,都有获取当前值的对应方法。第15章提供了OpenGL ES 3.0中各种可用状态查询的参考。 第16章——OpenGL ES平台 在最后一章中,我们抛开API的细节,讨论如何为iOS 7、Android 4.3 NDK、Android 4.3 SDK、Windows和Linux构建OpenGL ES样板代码。该章的意图是作为一个指南,帮助你在所选择的OpenGL ES 3.0平台上建立和运行样板代码。 附录A——GL_HALF_FLOAT 附录A详细介绍半浮点格式,并提供如何从IEEE浮点值转换为半浮点值(以及相反方向的转换)的参考。 附录B——内建函数 附录B提供了OpenGL ES着色语言中所有可用的内建函数。 附录C——ES框架API 附录C提供了我们为本书开发的实用框架的参考,并说明了每个函数的作用。 OpenGL ES 3.0参考卡片 本书正文前面有几页OpenGL ES 3.0参考卡片,版权归Khronos所有,并授权我们使用。该参考卡片包含了OpenGL ES 3.0中所有函数的完整列表以及OpenGL ES着色语言中的所有类型、操作符、限定符、内建函数和函数。 代码和着色器示例 本书包括大量程序和着色器示例。你可以从本书英文版网站(opengles-book.com)上下载这些示例,该网站提供了寄存本书代码的github.com网站链接。在写作本书时,示例程序已在iOS7、Android 4.3 NDK、 Android 4.3 SDK、 Windows (OpenGL ES 3.0 Emulation)和 Ubuntu Linux上编译和测试过。该网站提供了任何必要工具的下载链接。 致谢 Acknowledgements 我要感谢Affie Munshi和 Dave Shreiner对本书第1版做出的巨大贡献,非常感谢Budi Purnomo和我一起将本书更新到OpenGL ES 3.0。我还要感谢多年来一起工作的同事,他们对我在计算机图形学、OpenGL和OpenGL ES上的教育给予了许多帮助。需要感谢的人很多,无法一一列出,特别要感谢Shawn Leaf、 Bill Licea-Kane、 Maurice Ribble、 Benj Lipchak、 Roger Descheneaux、 David Gosselin、 Thorsten Scheuermann、 John Isidoro、 Chris Oat、 Jason Mitchell、 Dan Gessel和 Evan Hart。 我要特别感谢我的妻子Sofia,感谢她在我忙于本书时对我的支持。我还要感谢我的儿子Ethan,他出生于本书写作期间,他的笑声每天都给我带来欢乐。 ——Dan Ginsburg 我要向Dan Ginsburg致以深深的谢意,感谢他给我提供机会为本书做出贡献。感谢我的经理Callan McInally和AMD所有同事对我的支持。我还要感谢过去的教授——Jonathan Cohen、Subodh Kumar、 Ching-Kuang Shene和John Lowther,感谢他们带我进入计算机图形和OpenGL的世界。 我要感谢父母和姐妹无条件的爱。特别感谢我了不起的妻子——Liana Hadi,她的爱和支持帮助我完成了这个项目。感谢我的女儿Michelle Lo 和 Scarlett Lo,她们是我生命中的阳光。 —— Budi Purnomo 我们都要感谢Neil Trevett为本书作序,并从Khronos发起人委员会获得批准,允许我们在附录B中使用来自OpenGL ES着色语言规范的文本以及OpenGL ES 3.0参考卡片。特别感激评阅人宝贵的反馈——Maurice Ribble、Peter Lohrmann和 Emmanuel Agu。我们还要感谢本书第1版的技术评审——Brian Collins、 Chris Grimm、 Jeremy Sandmel、 Tom Olson和 Adam Smith。 对Addison-Wesley的编辑Laura Lewin,我们亏欠她太多了,她对本书创作的每个方面都给予了很多帮助。Addison-Wesley的许多人都对本书的编辑做出了宝贵的贡献,对此我们深深感激,这些人包括Debra Williams Cauley、Olivia Basegio、 Sheri Cain和Curt Johnson等。 我们要感谢第1版的读者,他们报告书中的错误并改进样板代码,对我们的帮助很大。特别要感谢读者Javed Rabbani Shah,他用Java将OpenGL ES 3.0样板代码移植到Android 4.3 SDK中。他还帮助我们进行Android NDK的移植,并解决了许多设备特定问题。我们感谢Jarkko Vatjus-Anttila提供Linux X11移植,Eduardo Pelegri-Llopart 和Darryl Gough将第1版的代码移植到BlackBerry Native SDK中。 深深感谢OpenGL ARB、OpenGL ES工作组和所有对OpenGL ES开发做出贡献的人。