标题：计算机图形学——用OpenGL实现（第2版）
图书信息
作者：罗霄 图书详细信息： ISBN：9787302117094 定价：119元 印次：1-1 装帧：平装 印刷日期：2006-4-26
图书简介
本书通过最能代表技术发展状况的示例综合介绍了计算机图形学方面的原则和技巧，其中的示例都是学生和老师们能够每天在因特网和利用计算机制作的电影中看到的。作者曾经编写过许多极具实用性的图书。书中的每个概念都有详细介绍，并且说明了其背后的数学原理。本书向读者介绍了将数学算法转变成程序代码的方法，并有结果展示。新版本还为读者提供了计算机图形学领域的最前沿信息。
图书前言
本书特色：使用OpenGL作为支持软件--附录中说明了如何获取这个软件（免费下载）及其安装方法，这个软件在多种平台上都能使用。使用C++作为编程语言。介绍有用的图形类，但并非严格的面向对象编程。最前沿和更深入的3D图形处理技术和数学原理。更新了所有反映这一领域发展状况的内容。每章最后都有大量的案例分析。对图形学技巧的首要原则的清晰描述。介绍了功能强大的场景设计语言（Scene Design Language, SDL）；本书的网站中有SDL解释程序的C++代码。一个附录专门介绍了PostScript® 语言。 提供了概念、背景数学原理、程序编码和结果之间的链接。 包括了丰富的、能够反映技术发展水平的成熟示例。
图书目录
第1章 计算机图形学导言 11.1 什么是计算机图形 11.2 计算机生成的图片应用在哪些地方 31.2.1 艺术、娱乐以及出版 31.2.2 计算机图形和图像处理 41.2.3 监视过程 51.2.4 显示模拟 61.2.5 计算机辅助设计 71.2.6 科学分析和可视化 71.3 在计算机图形中创建的图片元素 101.3.1 折线 101.3.2 文本 121.3.3 实心区域 131.3.4 光栅图像 141.3.5 灰度阴影的呈现以及光栅图像中的颜色 181.4 图像显示设备 211.4.1 绘线型显示器 211.4.2 光栅显示器 221.4.3 索引颜色和查找表格 261.4.4 其他的光栅显示设备 291.4.5 硬拷贝光栅设备 301.5 图形输入原语和设备 311.5.1 输入图形原语的类型 311.5.2 物理输入设备的类型 321.6 小结 341.7 进一步阅读 34第2章 绘制图片入门 362.1 着手创建图片 362.1.1 设备无关编程和OpenGL 382.1.2 基于窗口的编程 382.1.3 打开一个绘图窗口 402.2 绘制基本图形原语 41绘制点丛 442.3 绘制线条画 502.3.1 绘制折线和多边形 512.3.2 使用moveto( )和lineto( )绘制线条 552.3.3 绘制校准长方形 562.3.4 校准长方形的高宽比 572.3.5 填充多边形 592.3.6 OpenGL中的其他图形原语 602.4 使用鼠标和键盘的简单交互作用 612.4.1 鼠标交互作用 612.4.2 键盘交互作用 642.5 小结 652.6 案例分析 66案例分析2.1?伪随机点的集合 66案例分析2.2?迭代函数系统导言 68案例分析2.3?资金分割率和其他的宝石 71案例分析2.4?建立并使用折线文件 73案例分析2.5?线条和多边形的点画法 74案例分析2.6?折线编辑器 75案例分析2.7?建立并运行迷阵 762.7 进一步阅读 78第3章 更多绘图工具 793.1 简介 803.2 世界窗口和视口 803.2.1 从窗口到视口的映射 823.2.2 自动设定窗口和视口 913.3 裁剪线 943.3.1 裁剪线段 943.3.2 Cohen-Sutherland裁剪算法 953.4 开发Canvas类 983.4.1 一些有用的支持类 993.4.2 类Canvas的声明 1003.4.3 类Canvas的实现方法 1013.5 相对绘图例程 1033.5.1 开发moveRel( )和lineRel( ) 1043.5.2 龟纹绘图历程 1053.6 基于规则多边形的图形 1093.6.1 规则多边形 1093.6.2 n-Gon的变分(Variation) 1113.7 绘制圆和圆弧 1153.7.1 绘制圆 1153.7.2 绘制圆弧 1153.8 对曲线使用参数形式 1193.8.1 曲线的参数形式 1193.8.2 绘制以参数表示的曲线 1223.8.3 超椭圆(Superellipses) 1243.8.4 极坐标形状 1253.8.5 3D曲线 1273.9 小结 1283.10 案例分析 129案例分析3.1 学习数理逻辑图形和混沌模拟 129案例分析3.2 在C或者C++中实现Cohen-Suther-land裁剪器 131案例分析3.3 在Turbo C++中实现Canvas 133案例分析3.4 绘制圆弧 135案例分析3.5 一些用于物理和工程中的图形 136案例分析3.6 平铺图案 138案例分析3.7 主旋律的有趣改变 139案例分析3.8 圆围绕着圆滚动 141案例分析3.9 超椭圆 1423.11?进一步阅读 143第4章 图形向量工具 1444.1 简介 1454.2 向量 1474.2.1 向量操作 1484.2.2 向量线性组合 1494.2.3 向量的大小；单位向量 1514.3 点积 1524.3.1 点积的性质 1534.3.2 两个向量的夹角 1544.3.3 b·c的符号和正交性 1544.3.4 2D"正交"向量 1564.3.5 正交投影和点到线的距离 1584.3.6 投影的应用：反射 1604.4 两个向量的叉积 1614.4.1 叉积的几何解释 1624.4.2 求平面的法向量 1634.5 主要几何对象的表示 1644.5.1 坐标系和坐标框架 1654.5.2 点的仿射组合 1684.5.3 两个点的线性插值 1704.5.4 艺术和动画的"插值" 1714.5.5 概述：二次插值、立方插值和贝济埃曲线 1734.5.6 表示线和平面 1744.6 求两条线段的交点 182直线相交的应用：过三点的圆 1844.7 直线和平面的交点；裁剪 1864.8 多边形相交问题 1884.8.1 处理凸多边形和多面体 1894.8.2 射线与凸多边形的交点和裁剪问题 1904.8.3 Cyrus-Beck裁剪算法 1944.8.4 任意多边形的裁剪 1964.8.5 更高级的裁剪问题 1984.9 小结 1984.10 案例分析 199案例分析4.1 插值动画 199案例分析4.2 大量的圆 200案例分析4.3 点Q是否在凸多边形P内部 201案例分析4.4 密室反射(2D射线跟踪) 202案例分析4.5 Cyrus-Beck裁剪 203案例分析4.6 用凸多边形裁剪多边形：Sutherland-Hodgman裁剪 203案例分析4.7 用多边形裁剪多边形：Weiler-Atherton 裁剪 206案例分析4.8 多边形的布尔操作 2084.11 进一步阅读 210第5章 对象的变换 2115.1 简介 2125.2 变换导论 2125.2.1 变换点和对象 2155.2.2 仿射变换 2175.2.3 初等2D仿射变换的几何效果 2185.2.4 仿射变换的逆转 2235.2.5 组合仿射变换 2245.2.6 组合2D变换的例子 2265.2.7 仿射变换的一些有用特征 2305.3 3D仿射变换 2355.3.1 初等3D变换 2365.3.2 组合3D仿射变换 2405.3.3 组合旋转 2405.3.4 3D仿射变换特征小结 2455.4 改变坐标系 2465.5 在程序中使用仿射变换 249保存CT以备用 2565.6 使用OpenGL绘制3D场景 2605.6.1 观察过程和图形流水线综述 2615.6.2 一些OpenGL建模和视角工具 2645.6.3 用OpenGL绘制基本形状 2675.6.4 从文件中读取场景 2755.7 小结 2795.8 案例分析 280案例分析5.1 用Canvas中的CT进行自行变换 280案例分析5.2 使用多个旋转绘制图5.39中的星星 280案例分析5.3 分解2D仿射变换 280案例分析5.4 通用3D错切 284案例分析5.5 绕某条轴旋转：构造方法 286案例分析5.6 分解3D仿射变换 287案例分析5.7 用SDL绘制3D场景 2895.9 进一步阅读 289第6章 使用多边形网格为各种形状建模 2906.1 简介 2906.2 使用多边形网格实体建模简介 2916.2.1 定义多边形网格 2926.2.2 计算法向量 2946.2.3 网格的性质 2966.2.4 为非实体物体建立网格模型 2986.2.5 在程序中使用网格 2986.3 多面体 3016.3.1 棱柱和对角柱 3036.3.2 柏拉图立体 3046.3.3 其余常见的多面体 3096.4 推挤型形状 3126.4.1 生成棱柱 3126.4.2 推挤棱柱数组："堆砌工作" 3136.4.3 带有"扭曲"的推挤 3156.4.4 建立分段推挤形状：管状物体和蛇形物体 3166.4.5 "离散地"延伸旋转面 3216.5 平滑物体的网格近似 3236.5.1 表面的表示方法 3236.5.2 表面的法向量 3256.5.3 仿射变换的作用 3266.5.4 三种"标准"形状：球面、圆柱面和圆锥面 3276.5.5 为曲面建立多边形网格 3316.5.6 直纹面 3336.5.7 旋转面 3386.5.8 二次曲面 3406.5.9 超二次曲面 3446.5.10 基于三维曲线的管状物体 3466.5.11 基于双变量显式函数的表面 3466.6 小结 3476.7 案例分析 348案例分析6.1 存储在文件中的网格 348案例分析6.2 Newell方法的推导 349案例分析6.3 棱柱 351案例分析6.4 棱柱组和推挤四边形带 352案例分析6.5 基于参数曲线的管状物体和蛇形物体 353案例分析6.6 建立离散旋转面 354案例分析6.7 关于边列表和线框模型 354案例分析6.8 拱形屋顶 354案例分析6.9 关于柏拉图立体 355案例分析6.10 关于阿基米德立体 355案例分析6.11 二次曲面的代数表达式 355案例分析6.12 超二次曲面 357案例分析6.13 绘制平滑参数表面 357案例分析6.14 锥化、扭曲、弯曲和挤压 3586.8 进一步阅读 359第7章 三维视图 3607.1 简介 3607.2 再次研究照相机 3617.2.1 设置视角范围 3627.2.2 照相机的定位和定向 3627.3 在程序中建立照相机 368移动照相机 3707.4 三维物体的透视投影 3737.4.1 点的透视投影 3747.4.2 直线的透视投影 3777.4.3 把透视法结合到图形管道中 3807.4.4 对视角范围进行面裁剪 3877.5 生成立体视图 3937.6 投影的分类 3957.6.1 一点透视，两点透视和三点透视 3967.6.2 平行投影 4007.7 小结 4067.8 案例分析 407案例分析7.1 在场景中移动照相机 407案例分析7.2 立体视图 408案例分析7.3 生成平行投影 408案例分析7.4 自己产生视图(假定没有OpenGL可以使用) 408案例分析7.5 去掉背面以提高效率 4087.9 进一步阅读 410第8章 渲染表面获得视觉真实感 4118.1 简介 4118.2 明暗处理模型介绍 4158.2.1 计算反射光的几何要素 4168.2.2 计算漫反射分量 4168.2.3 镜面反射 4188.2.4 环境光的作用 4218.2.5 光分量的结合 4228.2.6 添加颜色 4238.2.7 明暗处理和图形管道 4258.2.8 在OpenGL中使用光源 4268.2.9 在OpenGL中使用材质属性 4318.2.10 对SDL指定的场景进行明暗处理 4328.3 平面明暗处理方式和平滑明暗处理方式 4328.3.1 平面明暗处理 4338.3.2 平滑明暗处理 4348.4 去除隐藏面 438深度缓冲区方法 4388.5 给面添加纹理 4418.5.1 把纹理映射到平表面上 4448.5.2 渲染纹理 4468.5.3 纹理改变了什么 4538.5.4 使用OpenGL获得的纹理示例 4558.5.5 向曲面上环绕纹理 4608.5.6 反射映射 4648.6 为物体添加阴影 4678.6.1 作为纹理的阴影 4688.6.2 利用阴影缓冲区生成阴影 4698.7 小结 4718.8 案例分析 472案例分析8.1 使用OpenGL生成有阴影的物体 472案例分析8.2 自己实现图形管道 472案例分析8.3 添加多边形填充和深度缓冲区去除隐藏面 473案例分析8.4 渲染纹理 473案例分析8.5 应用可编程3D纹理 473案例分析8.6 绘制阴影 474案例分析8.7 扩展SDL使其包括纹理生成 4748.9 进一步阅读 474第9章 通向无限之路 4759.1 简介 4769.2 分形与自相似性 4769.2.1 曲线的连续细化 4779.2.2 绘制Koch曲线和Koch雪花 4789.2.3 分形维数 4809.3 字符串产生式和PEANO曲线 4819.3.1 在程序中递归生成字符串并绘图 4839.3.2 添加分支 4869.4 拼接平面 4899.4.1 单面拼接 4909.4.2 双面拼接 4929.4.3 绘制拼接 4949.4.4 "爬虫" 4949.5 通过迭代函数系统生成图像 4979.5.1 拷贝器试验 4979.5.2 拷贝过程的一些基本理论 4999.5.3 绘制第k次迭代结果 5009.5.4 混沌游戏 5019.5.5 计算IFS；分形图像压缩 5049.6 MANDELBROT集 5079.6.1 Mandelbrot集和迭代函数系统 5089.6.2 定义Mandelbrot集 5119.6.3 计算点c是否在Mandelbrot集内 5139.6.4 绘制Mandelbrot集 5149.6.5 Mandelbrot集的几点性质 5159.7 JULIA集 5169.7.1 充满Julia集Kc 5169.7.2 绘制充满Julia集 5169.7.3 固定点和吸引盆的几点性质 5179.7.4 Julia集Jc 5199.8 随机分形 5219.8.1 线段的分形化 5229.8.2 控制分形曲线的频谱密度 5239.9 小结 5259.10 案例分析 526案例分析9.1 绘制字符串产生式 526案例分析9.2 绘制雪花和爬虫 527案例分析9.3 混沌游戏 529案例分析9.4 绘制Mandelbrot集中的轨道 529案例分析9.5 生成Mandelbrot集的图像 530案例分析9.6 生成Julia集的图像 530案例分析9.7 非周期性拼接；Penrose拼板 530案例分析9.8 分形化曲线 532案例分析9.9 为分形山建模 5339.11 进一步阅读 533第10章 光栅显示工具 53410.1 简介 53410.2 处理像素映射 53610.2.1 对像素映射的操作 53610.2.2 像素映射的有用数据类型 53710.2.3 图像的缩放和旋转 54310.3 合并像素映射 54610.3.1 读-修改-写循环 54710.3.2 Alpha通道和图像融合 54810.3.3 像素的逻辑合并 55210.3.4 BitBLT操作 55610.4 自己实现直线绘制：Bresenham算法 557Bresenham直线绘制算法 55810.5 定义和填充像素区域 56310.5.1 定义区域范围 56410.5.2 像素定义的区域 56410.5.3 一种递归洪水填充算法 56510.5.4 用图案填充区域 56610.5.5 利用一致性：基于像素串的区域填充 56810.6 处理符号定义的区域 56910.6.1 矩形定义的区域 57010.6.2 路径定义的区域 57110.7 填充多边形定义的区域 57310.7.1 边缘上的哪些像素属于多边形 57410.7.2 改进算法性能 57610.8 失真；反失真技术 58010.8.1 反失真技术 58110.8.2 纹理的反失真 58610.8.3 使用OpenGL反失真 58810.9 生成更多的明暗效果和色彩 59010.9.1 顺序抖动 59110.9.2 误差扩散 59510.10 小结 59710.11 案例分析 598案例分析10.1 读取和显示BMP图像文件 598案例分析10.2 用OpenGL融合两幅图像 598案例分析10.3 基于像素串的区域填充 598案例分析10.4 处理shape数据结构 599案例分析10.5 shape的链码 599案例分析10.6 填充"水平凸"多边形 599案例分析10.7 一般多边形填充 600案例分析10.8 误差扩散 60010.12 进一步阅读 600第11章 曲线与曲面设计 60111.1 简介 60211.1.1 轨迹参数曲线 60211.1.2 运动的平滑度 60311.2 用多项式表示曲线 60611.3 关于交互式曲线设计 61111.4 用贝济埃曲线进行曲线设计 613de Casteljau算法 61311.5 贝济埃曲线的性质 61811.6 寻找更好的混合函数 62311.6.1 局部控制问题 62311.6.2 混合函数集的期望性质表 62411.6.3 分段多项式曲线和样条 62611.6.4 根据g(t)建立一组混合函数 62711.6.5 样条曲线和基函数 63011.7 B样条基函数 63111.7.1 B样条函数定义 63211.7.2 在结点向量中使用多重结点 63611.7.3 开放B样条曲线：标准结点向量 63711.8 B样条曲线设计的有用性质 640使用多重控制点 64111.9 有理样条和NURBS曲线 64211.10 插值简述 64611.10.1 用分段三次多项式插值 64711.10.2 Hermite插值 64811.10.3 自然三次样条 65111.10.4 三次插值中计算斜率 65311.10.5 交互指定切向量 65611.11 曲面建模 65711.11.1 基于B样条的直纹面 65711.11.2 基于B样条的旋转面 65711.11.3 贝济埃表面碎片 65911.11.4 贝济埃碎片的拼接 66011.11.5 B样条碎片 66211.11.6 NURBS曲面 66311.12 小结 66411.13 案例分析 666案例分析11.1 几种有趣的参数曲线 666案例分析11.2 "椭圆台球桌" 667案例分析11.3 贝济埃曲线 669案例分析11.4 一种二次样条曲线生成法 669案例分析11.5 建立样条曲线编辑器 669案例分析11.6 用B样条插值控制点 670案例分析11.7 用三次多项式插值 671案例分析11.8 古老的茶壶 671案例分析11.9 投影变换不变性 673案例分析11.10 绘制NURBS碎片 67311.14 进一步阅读 675第12章 色彩理论 67612.1 简介 67612.2 描述颜色 67912.2.1 主导波长 67912.2.2 色匹配 68012.3 国际照明协会标准 68212.3.1 构造CIE表 68412.3.2 使用CIE色度表 68512.3.3 色域 68612.4 颜色空间 68712.4.1 RGB和CMY颜色空间 68712.4.2 加色和减色系统 68812.4.3 HLS颜色模型 68912.5 颜色量化 69212.5.1 均衡量化 69312.5.2 流行算法 69512.5.3 中线切割算法 69512.5.4 八叉树量化 69612.6 小结 69812.7 案例分析 699案例分析12.1 画CIE图 699案例分析12.2 画RGB空间 699案例分析12.3 HSV到RGB的转变 699案例分析12.4 均匀颜色量化 699案例分析12.5 流行颜色量化 699案例分析12.6 中线切割颜色量化 699案例分析12.7 八叉树颜色量化 70012.8 进一步阅读 701第13章 隐面的消除 70213.1 简介 70313.1.1 对象精度与图像精度方法的比较 70413.1.2 多边形网格的数据描述 70513.2 再次研究深度缓存算法 70713.3 列表优先HSR算法 70813.3.1 粗心画家算法 70913.3.2 使用二叉空间分割(BSP)树的HSR 71013.3.3 深度排序算法 71413.4 扫描线HSR方法 71613.5 区域的细分方法 71913.5.1 象限细分 71913.5.2 简单区域的其他定义 72213.6 关于隐线消除法 724edgeTest( )中的几何测试 72613.7 曲面的HSR方法 72813.8 小结 73013.9 案例分析 731案例分析13.1 画家算法测试 731案例分析13.2 测试和分割 732案例分析13.3 使用BSP树消除隐面 732案例分析13.4 使用深度排序法解决HSR问题 733案例分析13.5 采用扫描线HSR方法 734案例分析13.6 使用WARNOCK算法绘制 734案例分析13.7 HLR的边堆栈算法 73413.10 进一步阅读 735第14章 光线追踪法的介绍 73614.1 简介 73714.2 建立光线跟踪法的几何学 73814.3 光线跟踪法过程概述 74014.4 光线与对象的交点 74114.4.1 光线与通用平面的相交 74314.4.2 光线与通用球体相交 74314.4.3 光线与变换后的对象相交 74414.5 编制光线跟踪器的应用程序 74614.5.1 计算光线－球体相交的例程 75214.5.2 用于发光球体场景的完整的光线跟踪器 75414.6 光线与其他几种基本形状的相交 75514.6.1 与正方形相交 75514.6.2 与锥形柱体相交 75614.6.3 与立方体(或任何凸多面体)相交 75914.6.4 考虑更多的基本形状 76614.7 绘制场景的明暗图 76714.7.1 确定命中点处的法向量 76814.7.2 根据对象的表面材料为其着色 76814.7.3 基于物理原理的明暗处理模型：Cook-Torrance明暗处理 77014.8 加入表面纹理 77614.8.1 实体纹理 77714.8.2 在表面上粘贴图像 78614.8.3 反失真光线追踪 78814.9 范围的使用 78914.9.1 框形范围和球形范围 79014.9.2 投影范围的使用 79514.10 加阴影以增加真实感 79814.11 反射与透明 80114.11.1 光的折射 80314.11.2 处理shade( )中的折射问题 80714.12 复合对象：关于对象的布尔运算 81014.12.1 对CSG对象的光线追踪 81114.12.2 布尔对象的数据结构 81314.12.3 光线与布尔对象相交 81614.12.4 构造和使用CSG对象的范围 82014.13 小结 82214.14 案例分析 823案例分析14.1 放射型光线跟踪器 823案例分析14.2 一种新型的光线跟踪器 824案例分析14.3 在光线跟踪器中实现阴影处理 824案例分析14.4 使用范围加速光线跟踪过程 824案例分析14.5 对3D纹理的光线跟踪 824案例分析14.6 反失真 825案例分析14.7 对其他基本形状的光线跟踪 825案例分析14.8 一个用于研究折射效应的2D光线跟踪器 825案例分析14.9 反射光和折射光 825案例分析14.10 对对象的布尔组合进行光线跟踪 82514.15 进一步阅读 826附录1 图形工具：获得OpenGL 827A1.1 OpenGL的获取和安装 827附录2 计算机图形学的数学研究 829A2.1 一些关于矩阵及其运算的主要定义 829A2.1.1 矩阵的运算 830A2.1.2 两个矩阵相乘 831A2.1.3 矩阵的分块 833A2.1.4 矩阵的行列式 834A2.1.5 矩阵的逆矩阵 835A2.2 向量及其运算的一些性质 837A2.2.1 向量的正交；正交点积 837A2.2.2 标量三重积 837A2.2.3 三重向量积以及4个向量的积 839A2.3 复数的运算 839A2.4 球坐标和方向余弦 842附录3 一些有用的类以及实用例程 845附录4 PostScript?简介 877A4.1 关于PostScript语言 878A4.1.1 准备事项 878A4.1.2 PostScript是"基于堆栈的" 879A4.1.3 一些有关堆栈的操作符：pop、dup、exch和clear 880A4.1.4 更高级的堆栈操作符 880A4.1.5 一些算术操作符 881A4.2 PostScript中的图形操作符 884A4.2.1 坐标系及其变换 884A4.2.2 路径构造动词 885A4.2.3 圆弧 886A4.2.4 用作绘图动词 887A4.2.5 坐标变换 888A4.2.6 图形状态操作符 892A4.3 在PostScript中绘制文本 893A4.4 定义新的变量和过程 894A4.4.1 定义变量 894A4.4.2 定义过程 895A4.4.3 使用repeat实现一种简单的迭代形式 899A4.5 决策和迭代 901A4.5.1 把布尔值作为参数的动词 901A4.5.2 判断 902A4.5.3 迭代 904A4.6 打印值 908A4.7 绘制灰度图 909附录5 SDL简介 912A5.1 SDL文法 913A5.2 SDL中的宏 917A5.3 扩展SDL 917[1]