内容简介
OpenGL图形系统是一个软件接口,让程序员能够创建交互式程序,使用计算机图形学技术生成具有真实感的图像。本书是OpenGLARB推荐的OpenGL1.4版学习指南。
本书首先阐述OpenGL的功能和计算机图形学基本知识,包括状态管理和几何体的绘制、模型变换、视点变换和投影变换、颜色和光照;然后深入探讨一些高级技术,包括反走样、混合、雾效、显示列表、图像处理、纹理映射、帧缓存、网格化、NURBS、选择和反馈等;同时讨论其他一些重要主题,像如何提高程序的性能、OpenGL扩展和跨平台技术等。
本书只要求读者有一定的C语言基础和数学知识,适合所有对OpenGL编程感兴趣的读者阅读。
目录
- 第1章OpenGL简介1
- 1.1OpenGL概览2
- 1.2一个简单的OpenGL程序4
- 1.3OpenGL函数的语法5
- 1.4OpenGL是一个状态机6
- 1.5OpenGL渲染流水线6
- 1.5.1显示列表7
- 1.5.2求值程序7
- 1.5.3顶点操作8
- 1.5.4图元装配8
- 1.5.5像素操作8
- 1.5.6纹理装配8
- 1.5.7光栅化9
- 1.5.8片元操作9
- 1.6与OpenGL相关的函数库9
- 1.6.1包含文件10
- 1.6.2OpenGL实用工具包(GLUT)11
- 1.7动画13
- 1.7.1暂停刷新14
- 1.7.2运动就是重画加交换15
- 第2章状态管理和绘制几何体19
- 2.1绘图补救工具箱21
- 2.1.1清空窗口21
- 2.1.2指定颜色22
- 2.1.3强制完成绘图操作23
- 2.1.4坐标系统修补工具箱24
- 2.2描述点、直线和多边形25
- 2.2.1什么是点、直线和多边形26
- 2.2.2指定顶点28
- 2.2.3OpenGL几何绘图图元29
- 2.3基本状态管理33
- 2.4显示点、直线和多边形34
- 2.4.1点的细节35
- 2.4.2直线的细节35
- 2.4.3多边形的细节38
- 2.5法线向量44
- 2.6顶点数组45
- 2.6.1第1步:启用数组46
- 2.6.2第2步:指定数组中的数据47
- 2.6.3第3步:解除引用和渲染49
- 2.6.4混合数组54
- 2.7属性组56
- 2.8有关使用多边形构造曲面的建议59
- 第3章观察65
- 3.1概述:相机类比67
- 3.1.1一个简单的例子:绘制立方体69
- 3.1.2通用的变换函数72
- 3.2视点变换和模型变换73
- 3.2.1如何看待变换74
- 3.2.2模型变换75
- 3.2.3视点变换79
- 3.3投影变换84
- 3.3.1透视投影84
- 3.3.2正交投影86
- 3.3.3根据视景体进行裁剪87
- 3.4视口变换87
- 3.4.1定义视口88
- 3.4.2变换后的深度坐标89
- 3.5变换的诊断90
- 3.6操纵矩阵堆栈91
- 3.6.1模型视点矩阵堆栈94
- 3.6.2投影矩阵堆栈94
- 3.7附加裁剪面94
- 3.8组合变换举例97
- 3.8.1建立太阳系模型97
- 3.8.2建立带关节的机器人手臂模型99
- 3.9逆变换和模拟变换102
- 第4章颜色105
- 4.1颜色感知106
- 4.2计算机颜色107
- 4.3RGBA模式与颜色索引模式109
- 4.3.1RGBA显示模式109
- 4.3.2颜色索引显示模式111
- 4.3.3在RGBA模式和颜色索引模式之间做出选择112
- 4.3.4在显示模式之间切换113
- 4.4指定颜色和着色模式113
- 4.4.1在RGBA模式下指定颜色113
- 4.4.2在颜色索引模式下指定颜色114
- 4.4.3指定着色模式115
- 第5章光照119
- 5.1隐藏面消除修补工具箱121
- 5.2现实世界和OpenGL中的光照122
- 5.2.1环境光、散射光、镜面反射光和发射光122
- 5.2.2材质的颜色123
- 5.2.3光线和材质的RGB值123
- 5.3一个简单的例子:光照球体的渲染124
- 5.4创建光源126
- 5.4.1颜色128
- 5.4.2位置和衰减128
- 5.4.3聚光灯129
- 5.4.4多光源130
- 5.4.5控制光源的位置和方向131
- 5.5选择光照模型135
- 5.5.1全局环境光136
- 5.5.2近视点还是无穷远视点136
- 5.5.3双面光照136
- 5.5.4辅助镜面反射颜色137
- 5.5.5启用光照137
- 5.6指定材质属性137
- 5.6.1散射光反射和环境光反射138
- 5.6.2镜面光反射139
- 5.6.3发射光颜色139
- 5.6.4改变材质属性140
- 5.6.5颜色材质模式141
- 5.7光照的数学计算144
- 5.7.1材质的发射光144
- 5.7.2反射的全局环境光144
- 5.7.3光源的贡献144
- 5.7.4叠加146
- 5.7.5辅助镜面发射光颜色146
- 5.8颜色索引模式下的光照147
- 第6章混合、反走样、雾效和多边形偏移149
- 6.1混合150
- 6.1.1源因子和目标因子151
- 6.1.2启用混合操作152
- 6.1.3使用混合方程来合并像素153
- 6.1.4混合的用途154
- 6.1.5一个混合的例子156
- 6.1.6使用深度缓存的三维混合158
- 6.2反走样161
- 6.2.1点和值线的反走样162
- 6.2.2使用多重采样对几何图元进行反走样处理167
- 6.2.3多边形的反走样170
- 6.3雾170
- 6.3.1使用雾171
- 6.3.2雾方程173
- 6.4点参数178
- 6.5多边形偏移180
- 第7章显示列表183
- 7.1为何使用显示列表184
- 7.2一个使用显示列表的例子184
- 7.3显示列表设计准则187
- 7.4创建和执行显示列表188
- 7.4.1命名和创建显示列表189
- 7.4.2显示列表存储的内容190
- 7.4.3执行显示列表191
- 7.4.4多级显示列表192
- 7.4.5管理显示列表索引193
- 7.5执行多个显示列表193
- 7.6使用显示列表来管理状态变量197
- 第8章绘制像素、位图、字体和图像201
- 8.1位图和字体203
- 8.1.1当前光栅位置204
- 8.1.2绘制位图205
- 8.1.3选择位图的颜色206
- 8.1.4字体和显示列表206
- 8.1.5定义并使用一种完整的字体207
- 8.2图像209
- 8.3图像处理流水线215
- 8.3.1像素的封装和拆封217
- 8.3.2控制像素存储模式218
- 8.3.3像素转移操作221
- 8.3.4像素映射223
- 8.3.5缩放和翻转图像224
- 8.4读取和绘制矩形像素阵列226
- 8.5提高像素绘制速度的技巧229
- 8.6图像处理子集229
- 8.6.1颜色表230
- 8.6.2卷积234
- 8.6.3颜色矩阵240
- 8.6.4收集统计数据(histogram)241
- 8.6.5Minmax243
- 第9章纹理映射245
- 9.1概述和范例248
- 9.1.1纹理映射的步骤248
- 9.1.2一个简单的程序250
- 9.2指定纹理252
- 9.2.1纹理代理255
- 9.2.2替换纹理图像的部分或全部纹素256
- 9.2.3一维纹理258
- 9.2.4三维纹理259
- 9.2.5压缩的纹理图像263
- 9.2.6使用纹理边框265
- 9.2.7mipmap:多个明细等级265
- 9.3滤波273
- 9.4纹理对象275
- 9.4.1生成纹理对象名称275
- 9.4.2创建和使用纹理对象275
- 9.4.3删除纹理对象278
- 9.4.4驻留纹理工作集278
- 9.4.5纹理函数280
- 9.5指定纹理坐标282
- 9.5.1计算合适的纹理坐标283
- 9.5.2纹理的重复和截取284
- 9.6自动生成纹理坐标287
- 9.6.1创建等高线288
- 9.6.2球面图(spheremap)291
- 9.6.3立方图纹理(cubemaptexture)292
- 9.7多重纹理294
- 9.8纹理组合函数298
- 9.9执行纹理映射后应用辅助颜色302
- 9.9.1光照被禁用时的辅助颜色302
- 9.9.2光照被启用时的辅助镜面反射颜色302
- 9.10纹理矩阵堆栈303
- 9.11深度纹理303
- 9.11.1创建阴影图304
- 9.11.2生成纹理坐标并渲染场景305
- 第10章帧缓存307
- 10.1缓存及其用途309
- 10.1.1颜色缓存310
- 10.1.2深度缓存310
- 10.1.3模板缓存310
- 10.1.4累积缓存310
- 10.1.5清空缓存311
- 10.1.6指定要读写的颜色缓存311
- 10.1.7屏蔽缓存313
- 10.2片元的测试和操作314
- 10.2.1截剪测试314
- 10.2.2Alpha测试315
- 10.2.3模板测试316
- 10.2.4深度测试320
- 10.2.5混合、抖动和逻辑运算320
- 10.3累积缓存322
- 10.3.1场景反走样323
- 10.3.2运动模糊327
- 10.3.3景深327
- 10.3.4柔和阴影330
- 10.3.5抖动330
- 第11章网格化和二次曲面333
- 11.1多边形网格化334
- 11.1.1创建网格化对象335
- 11.1.2网格化回调函数335
- 11.1.3网格化属性339
- 11.1.4定义多边形343
- 11.1.5删除网格化对象345
- 11.1.6提高网格化性能的技巧345
- 11.1.7描述GLU错误345
- 11.1.8向后兼容性345
- 11.2二次曲面:渲染球体、圆柱体和圆盘346
- 11.2.1管理二次对象347
- 11.2.2设置二次对象的属性347
- 11.2.3二次图元348
- 第12章求值程序和NURBS353
- 12.1预备知识354
- 12.2求值程序355
- 12.2.1一维求值程序355
- 12.2.2二维求值程序358
- 12.2.3使用求值程序来生成纹理坐标362
- 12.3GLUNURBS接口364
- 12.3.1一个简单的NURBS范例364
- 12.3.2管理NURBS对象367
- 12.3.3创建NURBS曲线或曲面370
- 12.3.4修剪NURBS曲面374
- 第13章选择和反馈377
- 13.1选择378
- 13.1.1基本步骤378
- 13.1.2创建名称堆栈379
- 13.1.3命中记录380
- 13.1.4选择示例381
- 13.1.5拾取383
- 13.1.6有关编写使用选择机制的程序的建议390
- 13.2反馈392
- 13.2.1反馈数组393
- 13.2.2在反馈模式下使用标记394
- 13.2.3反馈示例394
- 第14章OpenGL高级技巧399
- 14.1错误处理400
- 14.2查询OpenGL版本402
- 14.2.1实用库版本403
- 14.2.2窗口系统扩展版本403
- 14.3对标准的扩展403
- 14.4轻松制作透明物体405
- 14.5轻松实现淡出效果405
- 14.6使用后缓存来处理选择406
- 14.7开销不高的图像变换方法407
- 14.8显示多层408
- 14.9字符反走样409
- 14.10绘制圆形点410
- 14.11图像插值410
- 14.12制作贴花411
- 14.13使用模板缓存绘制填充凹多边形412
- 14.14找出冲突区域413
- 14.15阴影414
- 14.16隐藏线消除415
- 14.16.1使用多边形偏移隐藏线消除415
- 14.16.2使用模板缓存消除隐藏线415
- 14.17纹理映射的用途416
- 14.18绘制深度缓存图像416
- 14.19狄利克雷域417
- 14.20生存游戏418
- 14.21glDrawPixels()和glCopyPixels()的其他用途419
- 附录A操作顺序421
- A.1概述422
- A.2几何操作422
- A.2.1顶点操作423
- A.2.2图元装配423
- A.3像素操作423
- A.4片元操作424
- A.5其他操作424
- 附录B状态变量425
- B.1查询函数426
- B.2OpenGL状态变量427
- 附录COpenGL和窗口系统445
- C.1访问新的OpenGL函数446
- C.2X窗口系统的OpenGL扩展(GLX)446
- C.2.1初始化447
- C.2.2控制渲染448
- C.2.3GLX库函数的原型449
- C.3AppleMacintosh的OpenGL扩展(AGL)451
- C.3.1初始化451
- C.3.2渲染和场境451
- C.3.3管理OpenGL渲染场境452
- C.3.4在屏幕上渲染452
- C.3.5离屏渲染452
- C.3.6全屏渲染452
- C.3.7交换缓存452
- C.3.8更新渲染缓存452
- C.3.9使用AppleMacintosh字体453
- C.3.10错误处理453
- C.3.11AGL库函数的原型453
- C.4IBMOS/2Warp的OpenGL扩展(PGL)454
- C.4.1初始化454
- C.4.2控制渲染455
- C.4.3PGL函数的原型456
- C.5MicrosoftWindows的OpenGL扩展(WGL)456
- C.5.1初始化457
- C.5.2控制渲染457
- C.5.3WGL函数的原型458
- 附录DOpenGL实用工具包(GLUT)基础461
- D.1初始化和创建窗口462
- D.2处理窗口事件和输入事件463
- D.3加载颜色表464
- D.4初始化和绘制三维物体464
- D.5管理后台处理465
- D.6运行程序465
- 附录E计算法线向量467
- E.1计算解析曲面的法线468
- E.2根据多边形数据计算法线469
- 附录F齐次坐标和变换矩阵471
- F.1齐次坐标472
- F.1.1变换顶点472
- F.1.2法线变换472
- F.2变换矩阵473
- F.2.1平移473
- F.2.2缩放473
- F.2.3旋转473
- F.2.4透视投影474
- F.2.5正交投影475
- 附录G编程建议477
- G.1OpenGL正确编程技巧478
- G.2提高OpenGL性能的建议479
- G.3GLX建议480
- 附录HOpenGL的不变性481
- 术语表483