标题：OpenGL编程基础（第3版）
图书信息
作者：段菲 图书详细信息： ISBN：9787302171027 定价：35元 印次：1-2 装帧：平装 印刷日期：2009-7-31
图书简介
本书简明扼要地介绍了基本的OpenGL命令。它既可当作计算机图形学教材的配套教参，供计算机专业学生使用，也可以单独作为OpenGL程序设计指南，供有一定计算机图形背景的程序员参考。
图书前言
在2000年当我编写本书的第1版时，我希望它既可作为我的图形学教科书Interactive Computer Graphics: A Top-Down Approach Using OpenGL(第4版，Addison-Wesley于2005年出版)的配套教材，也希望它能够自成体系，为已经掌握了一些计算机图形学知识，而且希望了解OpenGL的开发人员提供一本OpenGL入门指南。对于第二种读者群，我并不是想要取代OpenGL的标准参考书：“红宝书”(OpenGL Programming Guide, 第5版， Addison-Wesley出版)和“蓝宝书”(OpenGL 1.4 Reference Manual, 第4版，Addison-Wesley出版)。相反，我希望奉献一本能够使程序员无需参考这些价值不菲的参考书便能快速入门的书。　我认为本书的第1版达到了我所期望的目标。很多情况下，我惊奇地发现，第二类读者群(至少以我所接收到的反馈来看)的数量超过了我的预期。我还惊奇地发现，本书已经作为一本独立的教科书为各种层次的图形学课所采用。　当我开始考虑编写本书的第2版时，我不得不做出一些艰难的决定，因为我必须对一本我认为已经非常成功的书籍进行修订。我希望这本书仍然保持简捷的风格，以将价格维持在一个较低的层次上，但我也希望对一些用户的反馈做出反应，同时希望体现图形学和OpenGL API的最新进展。为了实现这些看上去自相矛盾的愿望，本书的第2版与第1版相比，篇幅只增加了20%。在第2版中，我添加了一些新例子。另外我们专门增加了一章用于介绍可编程图形流水线，该工具代表了计算机图形学的一个主要进展。　可编程流水线的进一步发展促成了OpenGL 2.0，该版本中包含OpenGL着色语言(OpenGL Shading Language, GLSL)，它是促使我编写本书第3版的主要动机。我所面临的挑战是在短短一章中通过一些简单而生动的示例介绍GLSL的一些核心内容。　本书遵循了自顶向下的教学理念，这一理念是我在Interactive Computer Graphics一书中引入的。这种方法所基于的思想是如果学生能够尽快地开始编写一些有意义的应用程序，则他们在学习现代计算机图形学时就能达到最好的效果。OpenGL API非常有助于这一方法的实现。全世界的许多大中专院校都采用这种方法，充分表明这种教学理念的成功。　使用过Interactive Computer Graphics一书的学生都会有这样的认识：虽然这本书大量使用了OpenGL，但它绝非一本OpenGL编程指南，更不是一本用户手册。所以，在这本教材中，关于OpenGL的信息实际上是不完整的。并非所有的OpenGL函数都被涵盖，书中也没有函数及其参数的详细清单。对学生来说，前面的形式问题不大，但后面的形式确实会带来一些不便。于是，本书的诞生就填补了这个缺憾，这样学生们就不必去购买非常有参考价值但却价格不菲的“红宝书”(OpenGL Programming Guide)和“蓝宝书”(OpenGL 1.4 Reference Manual)。　大学里选修图形学课程的学生只是图形学社区中规模很小的一个群体，如果放在整个编程社区，则比例更小。许多人至少都对计算机图形学产生过一时的兴趣，而且也编写过图形程序。对他们来说，使用OpenGL是涉足图形学领域的一种非常诱人的方式。本书编写的第二个动机是为读者学习OpenGL提供一条捷径。在我看来，即使对那些最终将在Windows平台上使用DirectX进行开发的人，从研究和使用OpenGL开始，并借助OpenGL来掌握一些图形学概念，这种学习方式更容易，效果也更好。对于那些像我们一样长期从事科学应用，而且需要在跨平台环境中工作的读者，OpenGL是一个绝佳的选择。　本书自始至终几乎都没有介绍我那本图形学教材中所用到的数学原理。所以在很多章节中，例如第9章，我们更关注编程实现的细节，而没有做任何的数学推导。第5章介绍了如何使用旋转、平移及比例变换，但是并未对其中涉及的矩阵做任何推导。本书的章节编排顺序大致与我那本图形学教材一致，但同时也遵循了OpenGL的循序渐进的学习规律。我们首先从研究二维问题入手，这是第2章的内容，紧接着在第3章中我们转而研究程序的交互性，在第4章和第5章中，我们对三维程序进行了研究。第6章则介绍光照和材质。第7章和第8章介绍如何使用OpenGL来显示离散实体，我们首先讨论了像素和位图，接着又对纹理映射进行了详细的讨论。第9章介绍曲线和曲面。第10章介绍OpenGL着色语言(GLSL)，这种语言提供了一种C风格的编程方式，借助它我们可在应用程序中对可编程显卡进行编程。第11章涉及OpenGL的一些高级特性。　本书中既有完整的程序代码，也有代码片段。您在阅读本书时将发现，一旦您编写了少量OpenGL应用程序之后，许多代码都会在后续的程序中重复出现。所以，在介绍完前面几个例子后，我们将大部分重复代码都省略。　在本书的编写过程中，得到了很多人的大力支持。我要感谢现在或曾经在Silicon Graphics公司工作的许多人在学习OpenGL中给予我的热忱帮助。特别要感谢Mark Kilgard和Mason Woo，当我在新墨西哥大学所开的图形学课程中最初采用OpenGL时，他们给予了我许多帮助。Mason、Kathleen Danielson、Dave Shreiner以及Vicki Shreiner曾邀请我与他们在过去9年中，在SIGGRAPH一同讲授OpenGL的入门课程，正是通过这种形式的讲授迫使我对OpenGL API进行更深入的学习，并帮助我获得了如何教授OpenGL的一些心得。Mark、Nate Robins以及Brian Paul，他们通过构建GLUT库、Mesa实现以及许多OpenGL示例程序，对我们这些使用和讲授OpenGL的人提供了非常大的帮助。本书第1版从编写到出版只经历了很短的时间，目的是满足图形学社区的一些需求。我非常感激那些对本书提出意见和印刷错误的读者。在编写本书第2版时，Mark Kilgard(NVIDIA)和Dave Shreiner(SGI)对我的手稿进行了细致的审阅。他们给予了我太多的恩惠，因为他们对OpenGL开展的研究工作不知给予了我多少启示。现在我仍在非常快乐地享受着他们的恩惠。在我学习和研究GLSL时，Takeshi Hakamata也给予了我莫大的帮助，我都欠他们一份人情。
图书目录
第1章 绪论 11.1 OpenGL API 21.2 关于OpenGL的三种观点 31.2.1 程序员的观点 31.2.2 OpenGL状态机 41.2.3 OpenGL绘制流水线 41.3 OpenGL的组成 51.4 OpenGL的版本和扩展 61.5 语言 61.6 编程约定 61.7 编译 81.8 资源 91.9 本书的适用对象 101.10 全书概览 11第2章 OpenGL中的二维编程 132.1 一个简单的示例程序 142.2 GLUT 152.3 事件循环和回调函数 162.4 矩形的绘制 172.5 修改GLUT中的默认值 192.6 OpenGL中的颜色 202.6.1 颜色的设置 202.6.2 颜色和状态 212.7 OpenGL和GLUT坐标系之间的差异 212.8 二维取景 222.9 视口 232.10 坐标系与变换 232.11 simple.c(第2版) 242.12 图元及其属性 262.12.1 点 272.12.2 直线 272.12.3 启用OpenGL特性 292.12.4 填充的图元 292.12.5 矩形 312.12.6 多边形的点划模式 312.13 多边形类型 312.14 颜色插值 342.14.1 离散处理与边标记 342.14.2 离散化与细分 352.15 文本 432.16 查询与错误 442.17 状态的保存 462.18 编程练习 47第3章 交互与动画 493.1 重绘回调函数 503.2 Idle回调函数 513.3 一个旋转的矩形 523.4 双缓存 543.5 键盘的使用 543.6 鼠标回调函数的使用 563.7 鼠标的移动 593.8 菜单 603.9 NULL回调函数 623.10 子窗口与多窗口 623.11 例程：single_double.c 633.12 显示列表 663.12.1 多个显示列表 673.12.2 显示列表与文本 683.12.3 显示列表与对象 693.13 拾取和选择模式 693.14 编程练习 74第4章 三维编程基础 754.1 摄像机与对象 764.2 OpenGL中的正交投影 794.3 观察一个立方体 804.4 摄像机的定位 814.5 对象的生成 844.5.1 数组的使用 854.5.2 顶点数组 864.6 消隐 884.7 GLU与GLUT对象 894.7.1 GLU二次曲面 904.7.2 GLUT对象 924.8 透视投影 944.9 编程练习 96第5章 几何变换 975.1 线性变换 985.2 齐次坐标 985.3 模型-视图变换与投影变换 995.4 平移 995.5 旋转变换 1025.6 比例变换 1035.7 一个旋转的立方体 1045.8 直接设置矩阵 1065.9 变换与坐标系 1095.10 基于变换的建模 1105.10.1 实例化 1105.10.2 层次模型 1115.11 编程练习 118第6章 光照与材质 1196.1 光照与材质之间的交互 1206.2 Phong模型 1216.2.1 漫反射 1226.2.2 镜面反射 1226.2.3 环境反射 1236.2.4 发射光 1236.3 OpenGL中的光照 1236.4 光源的指定 1246.5 材质的指定 1286.6 旋转立方体的明暗计算 1306.7 对明暗计算的控制 1336.8 平滑着色 1346.9 法线的处理 1356.10 透明度 1356.11 编程练习 139第7章 离散图元 1417.1 像素和位图 1427.2 位图 1437.2.1 位图的显示 1447.2.2 位图和几何图元的融合 1467.2.3 颜色与模板 1477.3 绘制模式 1487.4 像素的读/写 1517.4.1 像素的写操作 1527.4.2 像素的读取 1527.4.3 像素的复制 1537.5 缓存的选择 1547.6 像素存储模式 1557.7 PPM图像的显示 1557.8 灰度图像的使用 1627.9 像素映射 1627.10 像素的缩放 1647.11 OpenGL中的图像处理 1657.12 编程练习 166第8章 纹理映射 1678.1 什么是纹理映射 1688.2 纹理图的创建 1698.3 纹理坐标 1728.4 纹理参数 1738.5 一个带有纹理的旋转立方体 1758.6 将纹理映射到表面 1798.7 边界与尺寸调整 1808.8 多级渐进纹理 1808.9 纹理坐标的自动生成 1828.10 纹理对象 1868.11 用于图像操作的纹理图 1878.12 编程练习 190第9章 曲线与曲面 1919.1 参数曲线 1929.2 参数曲面 1949.3 贝塞尔曲线和曲面 1959.4 一维OpenGL求值器 1969.5 二维求值器 1989.6 一个交互式例程 1999.7 其他类型的曲线 2019.7.1 B样条 2029.7.2 NURBS曲线 2069.8 犹他壶 2069.9 法向量与明暗 2119.10 为表面映射纹理 2139.11 编程练习 214第10章 OpenGL着色语言 21510.1 对流水线的回顾 21610.2 着色器与着色语言 21710.2.1 RenderMan 21710.2.2 Cg与GLSL 21810.3 GLSL 21810.3.1 执行模型 21910.3.2 一个简单的顶点着色器 21910.3.3 一个简单的片段着色器 22010.4 GLSL语言基础 22110.4.1 限定符 22110.4.2 运算符 22310.4.3 控制结构 22410.4.4 内置函数 22410.4.5 采样器 22510.5 建立与应用程序之间的接口 22610.5.1 着色器对象的创建 22610.5.2 着色器的读取和编译 22710.5.3 编译和连接 22810.5.4 错误检查 22910.5.5 将数据送入着色器 22910.6 顶点着色器示例 23010.7 片段着色器示例 232第11章 总结与展望 23711.1 OpenGL各版本及扩展 23811.1.1 OpenGL 1.1版本 23811.1.2 OpenGL 1.2版本 23811.1.3 OpenGL 1.3版本 23911.1.4 OpenGL 1.4版本 23911.1.5 OpenGL 1.5版本 23911.1.6 OpenGL 2.0版本 24011.1.7 OpenGL 2.1版本 24011.2 OpenGL扩展 24011.3 一些附加的OpenGL特性 24011.4 其他缓存 24111.4.1 累积缓存 24111.4.2 模板缓存 24211.4.3 片段测试 24311.5 编写可移植、高效而又健壮的 代码 243索引 245[1]