基本信息
原書名:OpenGL Programming Guide: The Official Guide to Learning OpenGL, Versions 3.0 and 3.1 (7th Edition)
原出版社: Addison-Wesley Professional
作者:(美)Dave Shreiner The Khronos OpenGL ARB Working Group
譯者:李軍 徐波
叢書名: 開發人員專業技術叢書
出版社:機械工業出版社
ISBN:9787111294504
出版日期:2010 年3月
開本:16開
頁碼:519
版次:7-1
編輯推薦
由Khronos小組編寫的官方指南
是OpenGL領域的權威著作,OpenGL紅寶書
幫助程式設計師走上了OpenGL專家之路
內容簡介
本書對opengl以及opengl實用函式館進行了全面而又權威的介紹,素有“opengl紅寶書”之譽。本書的上一個版本覆蓋了到opengl 2.1版的內容。本版涵蓋了opengl 3.0和3.1的最新特性。本書以清晰的語言描述了opengl的功能以及許多基本的計算機圖形技巧,例如創建和渲染3d模型、從不同的透視角度觀察物體、使用著色、光照和紋理貼圖使場景更加逼真等。另外,本書還深入探討了許多高級技巧,包括紋理貼圖、抗鋸齒、霧和大氣效果、nurbs、圖像處理子集等。此外,本書還對一些重要的主題進行了討論,例如提高性能、opengl擴展以及跨平台技術等。本書內容詳實,講解生動,圖文並茂,是opengl程式設計師的絕佳編程指南。
opengl是一種功能強大的軟體接口,既可以用於生成高質量的計算機圖像,也可以用於編寫使用2d和3d物體、點陣圖和彩色圖像的互動式應用程式。
本書對opengl以及opengl實用函式館進行了全面而又權威的介紹,素有“opengl紅寶書”之譽。本書的上一個版本覆蓋了截止opengl 2.1版的內容。這一版涵蓋了opengl 3.0和3.1的最新特性。本書以清晰的語言描述了opengl的功能以及許多基本的計算機圖形技巧,例如創建和渲染3d模型、從不同的透視角度觀察物體、使用著色、光照和紋理貼圖使場景更加逼真等。本書還深入探討了許多高級技巧,包括紋理貼圖、抗鋸齒、霧和大氣效果、nurbs、圖像處理等。另外,本書還對一些重要的主題進行了討論,例如提高性能、opengl擴展以及跨平台技術等。
本書進行了一些更新,涵蓋了opengl 3.0和3.1的最新特性,包括:
使用幀緩衝區對象進行離屏渲染和紋理更新。
各種新的緩衝區對象類型的示例,包括uniform緩衝區對象、變換反饋緩衝區和頂點數組對象。
使用紋理數組提高使用眾多紋理的性能。
使用圖元重啟和條件渲染來高效地進行渲染。
介紹opengl的廢棄機制,以及如何針對opengl未來版本驗證程式。
本書繼續對opengl著色語言(glsl)展開討論,並解釋了使用這種語言創建複雜圖形效果並提升opengl計算威力的機制。opengl技術資料庫(opengl technical library)提供了大量的opengl教程和參考書籍,它可以幫助程式設計師深入理解opengl,完全釋放opengl的潛力。這個資料庫最初由sgi開發,目前由khronos opengl體系結構審核委員會(arb)工作組維護,這是負責指導opengl以及相關技術發展和演變的行業協會。
目錄
譯者序
前言
第1章 opengl簡介 1
1 1 什麼是opengl 1
1 2 一段簡單的opengl代碼 3
1 3 opengl函式的語法 4
1 4 opengl是一個狀態機 6
1 5 opengl渲染管線 6
1 5 1 顯示列表 7
1 5 2 求值器 7
1 5 3 基於頂點的操作 7
1 5 4 圖元裝配 7
1 5 5 像素操作 8
1 5 6 紋理裝配 8
1 5 7 光柵化 8
1 5 8 片斷操作 8
1 6 與opengl相關的函式館 9
1 6 1 包含檔案 9
1 6 2 opengl實用工具庫(GLUT) 10
1 7 動畫 13
1 7 1 暫停刷新 14
1 7 2 動畫=重繪+交換 15
1 8 opengl及其廢棄機制 17
1 8 1 opengl渲染環境 17
1 8 2 訪問opengl函式 18
第2章 狀態管理和繪製幾何物體 19
2 1 繪圖工具箱 20
2 1 1 清除視窗 20
2 1 2 指定顏色 22
2 1 3 強制完成繪圖操作 23
2 1 4 坐標系統工具箱 24
2 2 描述點、直線和多邊形 25
2 2 1 什麼是點、直線和多邊形 25
2 2 2 指定頂點 27
2 2 3 opengl幾何圖元 27
2 3 基本狀態管理 31
2 4 顯示點、直線和多邊形 32
2 4 1 點的細節 32
2 4 2 直線的細節 33
2 4 3 多邊形的細節 36
2 5 法線向量 41
2 6 頂點數組 43
2 6 1 步驟1:啟用數組 44
2 6 2 步驟2:指定數組的數據 44
2 6 3 步驟3:解引用和渲染 46
2 6 4 重啟圖元 51
2 6 5 實例化繪製 53
2 6 6 混合數組 54
2 7 緩衝區對象 57
2 7 1 創建緩衝區對象 57
2 7 2 激活緩衝區對象 58
2 7 3 用數據分配和初始化緩衝區對象 58
2 7 4 更新緩衝區對象的數據值 60
2 7 5 在緩衝區對象之間複製數據 62
2 7 6 清除緩衝區對象 63
2 7 7 使用緩衝區對象存儲頂點數組
數據 63
2 8 頂點數組對象 65
2 9 屬性組 69
2 10 創建多邊形表面模型的一些提示 71
第3章 視圖 77
3 1 簡介:用照相機打比方 78
3 1 1 一個簡單的例子:繪製立方體 80
3 1 2 通用的變換函式 83
3 2 視圖和模型變換 84
3 2 1 對變換進行思考 85
3 2 2 模型變換 86
3 2 3 視圖變換 89
3 3 投影變換 93
3 3 1 透視投影 94
3 3 2 正投影 95
3 3 3 視景體裁剪 96
3 4 視口變換 96
3 4 1 定義視口 96
3 4 2 變換深度坐標 97
3 5 和變換相關的故障排除 98
3 6 操縱矩陣堆疊 100
3 6 1 模型視圖矩陣堆疊 101
3 6 2 投影矩陣堆疊 102
3 7 其他裁剪平面 102
3 8 一些組合變換的例子 104
3 8 1 創建太陽系模型 104
3 8 2 創建機器人手臂 107
3 9 逆變換和模擬變換 109
第4章 顏色 113
4 1 顏色感知 113
4 2 計算機顏色 114
4 3 RGBA和顏色索引模式 115
4 3 1 rgba顯示模式 116
4 3 2 顏色索引模式 117
4 3 3 在rgba和顏色索引模式中
進行選擇 118
4 3 4 切換顯示模式 118
4 4 指定顏色和著色模型 119
4 4 1 在rgba模式下指定顏色 119
4 4 2 在顏色索引模式下指定顏色 120
4 4 3 指定著色模型 121
第5章 光照 123
5 1 隱藏表面消除工具箱 124
5 2 現實世界和opengl光照 125
5 2 1 環境光、散射光、鏡面光和
發射光 125
5 2 2 材料顏色 126
5 2 3 光和材料的rgb值 126
5 3 一個簡單的例子:渲染光照球體 127
5 4 創建光源 129
5 4 1 顏色 130
5 4 2 位置和衰減 131
5 4 3 聚光燈 132
5 4 4 多光源 133
5 4 5 控制光源的位置和方向 133
5 5 選擇光照模型 138
5 5 1 全局環境光 138
5 5 2 局部的觀察點或無限遠的觀察點 138
5 5 3 雙面光照 139
5 5 4 鏡面輔助顏色 139
5 5 5 啟用光照 140
5 6 定義材料屬性 140
5 6 1 散射和環境反射 141
5 6 2 鏡面反射 141
5 6 3 發射光顏色 142
5 6 4 更改材料屬性 142
5 6 5 顏色材料模式 143
5 7 和光照有關的數學知識 146
5 7 1 材料的發射光 147
5 7 2 經過縮放的全局環境光 147
5 7 3 光源的貢獻 147
5 7 4 完整的光照計算公式 148
5 7 5 鏡面輔助顏色 148
5 8 顏色索引模式下的光照 149
第6章 混合、抗鋸齒、霧和多邊形偏移 151
6 1 混合 152
6 1 1 源因子和目標因子 152
6 1 2 啟用混合 154
6 1 3 使用混合方程式組合像素 154
6 1 4 混合的樣例用法 156
6 1 5 一個混合的例子 157
6 1 6 使用深度緩衝區進行三維混合 159
6 2 抗鋸齒 162
6 2 1 對點和直線進行抗鋸齒處理 164
6 2 2 使用多重採樣對幾何圖元進行
抗鋸齒處理 169
6 2 3 對多邊形進行抗鋸齒處理 172
6 3 霧 172
6 3 1 使用霧 173
6 3 2 霧方程式 175
6 4 點參數 181
6 5 多邊形偏移 182
第7章 顯示列表 185
7 1 為什麼使用顯示列表 185
7 2 一個使用顯示列表的例子 186
7 3 顯示列表的設計哲學 188
7 4 創建和執行顯示列表 189
7 4 1 命名和創建顯示列表 191
7 4 2 存儲在顯示列表里的是什麼 191
7 4 3 執行顯示列表 193
7 4 4 層次式顯示列表 193
7 4 5 管理顯示列表索引 194
7 5 執行多個顯示列表 194
7 6 用顯示列表管理狀態變數 199
第8章 繪製像素、點陣圖、字型和圖像 202
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 像素包裝和解包 216
8 3 2 控制像素存儲模式 217
8 3 3 像素傳輸操作 219
8 3 4 像素映射 221
8 3 5 放大、縮小或翻轉圖像 222
8 4 讀取和繪製像素矩形 224
8 5 使用緩衝區對象存取像素矩形數據 227
8 5 1 使用緩衝區對象傳輸像素數據 227
8 5 2 使用緩衝區對象提取像素數據 228
8 6 提高像素繪圖速度的技巧 229
8 7 圖像處理子集 230
8 7 1 顏色表 231
8 7 2 卷積 234
8 7 3 顏色矩陣 240
8 7 4 柱狀圖 241
8 7 5 最小最大值 243
第9章 紋理貼圖 245
9 1 概述和示例 248
9 1 1 紋理貼圖的步驟 248
9 1 2 一個示例程式 249
9 2 指定紋理 251
9 2 1 紋理代理 255
9 2 2 替換紋理圖像的全部或一部分 257
9 2 3 一維紋理 259
9 2 4 三維紋理 261
9 2 5 紋理數組 264
9 2 6 壓縮紋理圖像 265
9 2 7 使用紋理框線 267
9 2 8 Mipmap:多重細節層 267
9 3 過濾 275
9 4 紋理對象 277
9 4 1 命名紋理對象 277
9 4 2 創建和使用紋理對象 278
9 4 3 清除紋理對象 280
9 4 4 常駐紋理工作集 280
9 5 紋理函式 282
9 6 分配紋理坐標 284
9 6 1 計算正確的紋理坐標 285
9 6 2 重複和截取紋理 286
9 7 紋理坐標自動生成 289
9 7 1 創建輪廓線 289
9 7 2 球體紋理 293
9 7 3 立方圖紋理 294
9 8 多重紋理 296
9 9 紋理組合器函式 299
9 10 在紋理之後套用輔助顏色 303
9 10 1 在禁用光照時使用輔助顏色 303
9 10 2 啟用光照後的輔助鏡面顏色 303
9 11 點塊紋理 303
9 12 紋理矩陣堆疊 304
9 13 深度紋理 305
9 13 1 創建陰影圖 306
9 13 2 生成紋理坐標並進行渲染 307
第10章 幀緩衝區 309
10 1 緩衝區及其用途 310
10 1 1 顏色緩衝區 311
10 1 2 清除緩衝區 312
10 1 3 選擇用於讀取和寫入的顏色
緩衝區 313
10 1 4 緩衝區的禁止 315
10 2 片斷測試和操作 316
10 2 1 裁剪測試 316
10 2 2 Alpha測試 317
10 2 3 模板測試 318
10 2 4 深度測試 322
10 2 5 遮擋查詢 322
10 2 6 條件渲染 324
10 2 7 混合、抖動和邏輯操作 325
10 3 累積緩衝區 327
10 3 1 運動模糊 328
10 3 2 景深 328
10 3 3 柔和陰影 331
10 3 4 微移 331
10 4 幀緩衝區對象 332
10 4 1 渲染緩衝區 333
10 4 2 複製像素矩形 340
第11章 分格化和二次方程表面 342
11 1 多邊形分格化 342
11 1 1 創建分格化對象 343
11 1 2 分格化回調函式 343
11 1 3 分格化屬性 347
11 1 4 多邊形定義 350
11 1 5 刪除分格化對象 352
11 1 6 提高分格化性能的建議 352
11 1 7 描述glu錯誤 352
11 1 8 向後兼容性 352
11 2 二次方程表面:渲染球體、圓柱體
和圓盤 353
11 2 1 管理二次方程對象 354
11 2 2 控制二次方程對象的屬性 354
11 2 3 二次方程圖元 355
第12章 求值器和nurbs 360
12 1 前提條件 360
12 2 求值器 361
12 2 1 一維求值器 361
12 2 2 二維求值器 365
12 2 3 使用求值器進行紋理處理 369
12 3 glu的nurbs接口 371
12 3 1 一個簡單的nurbs例子 371
12 3 2 管理nurbs對象 374
12 3 3 創建nurbs曲線或表面 377
12 3 4 修剪nurbs表面 380
第13章 選擇和反饋 383
13 1 選擇 383
13 1 1 基本步驟 384
13 1 2 創建名字棧 384
13 1 3 點擊記錄 385
13 1 4 一個選擇例子 386
13 1 5 挑選 389
13 1 6 編寫使用選擇的程式的一些建議 397
13 2 反饋 398
13 2 1 反饋數組 399
13 2 2 在反饋模式下使用標記 400
13 2 3 一個反饋例子 400
第14章 opengl高級技巧 404
14 1 錯誤處理 405
14 2 opengl版本 406
14 2 1 工具函式館版本 407
14 2 2 視窗系統擴展版本 407
14 3 標準的擴展 407
14 4 實現半透明效果 409
14 5 輕鬆實現淡出效果 409
14 6 使用後緩衝區進行物體選擇 411
14 7 低開銷的圖像轉換 411
14 8 顯示層次 412
14 9 抗鋸齒字元 413
14 10 繪製圓點 414
14 11 圖像插值 414
14 12 製作貼花 415
14 13 使用模板緩衝區繪製填充的
凹多邊形 416
14 14 尋找衝突區域 416
14 15 陰影 417
14 16 隱藏直線消除 418
14 16 1 使用多邊形偏移實現隱藏
直線消除 418
14 16 2 使用模板緩衝區實現隱藏
直線消除 419
14 17 紋理貼圖的套用 419
14 18 繪製深度緩衝的圖像 420
14 19 dirichlet域 420
14 20 使用模板緩衝區實現生存遊戲 421
14 21 glDrawPixels()和glCopyPixels()的其他套用 422
第15章 opengl著色語言 424
15 1 opengl圖形管線和可程式著色器 424
15 1 1 頂點處理 425
15 1 2 片斷處理 426
15 2 使用glsl著色器 427
15 2 1 著色器示例 427
15 2 2 opengl/glsl接口 428
15 3 opengl著色語言 432
15 4 使用glsl創建著色器 433
15 4 1 程式起點 433
15 4 2 聲明變數 433
15 4 3 聚合類型 434
15 5 uniform塊 439
15 5 1 在著色器中指定uniform變數 440
15 5 2 訪問在uniform塊中聲明的uniform變數 440
15 5 3 計算不變性 446
15 5 4 語句 446
15 5 5 函式 448
15 5 6 在glsl程式中使用opengl
狀態值 449
15 6 在著色器中訪問紋理圖像 449
15 7 著色器預處理器 452
15 7 1 預處理器指令 452
15 7 2 宏定義 452
15 7 3 預處理器條件 453
15 7 4 編譯器控制 453
15 8 擴展處理 454
15 9 頂點著色器的細節 454
15 10 變換反饋 458
15 11 片斷著色器 462
附錄a glut(opengl實用工具庫)
基礎知識 464
附錄b 狀態變數 468
附錄c 齊次坐標和變換矩陣 495
附錄d opengl和視窗系統 499
術語表 511
譯者序
OpenGL是圖形硬體的一種軟體接口。從本質上說,它是一個3D圖形和模型庫,具有高度
的可移植性,並且具有非常快的渲染速度。如今,OpenGL廣泛套用於遊戲、醫學影像、地理信息、氣象模擬等領域,是高性能圖形和互動性場景處理的行業標準。
OpenGL的前身是SGI公司開發的IRIS GL圖形函式館。SGI是一家久負盛名的公司,在計算機圖形和動畫領域處於業界領先地位。IRIS GL最初是一個2D圖形函式館,後來逐漸演化為SGI的高端IRIS圖形工作站所使用的3D編程API。後來,由於圖形技術的發展,SGI對IRIS GL的移植性進行了改進和提高,使它逐步發展成如今的OpenGL。在此期間,OpenGL得到了各大廠商的支持,從而成為一種廣泛流行的三維圖形標準。
OpenGL並不是一種程式語言,而更像是一個C運行時函式館。它提供了一些預包裝的功能,幫助開發人員編寫功能強大的三維圖形應用程式。OpenGL可以在多種作業系統平台上運行,例如各種版本的Windows、UNIX/Linux、Mac OS和OS/2等。
OpenGL是一個開放的標準,雖然它由SGI首創,但是它的標準並不控制在SGI的手中,而是由OpenGL體系結構審核委員會(ARB)掌管。ARB由SGC、DEC、IBM、Intel和Microsoft等著名公司於1992年創立,後來又陸續添加了nVidia、ATI等圖形晶片領域的巨擎。ARB每隔4年舉行一次會議,對OpenGL規範進行維護和改善,並出台計畫對OpenGL標準進行升級,使OpenGL一直保持與時代同步。
2006年,SGI公司把OpenGL標準的控制從ARB移交給一個新的工作組—Khronos小組。Khronos是一個由成員提供資金的行業協會,專注於開放媒體標準的創建和維護。目前,Khronos負責OpenGL的發展和升級。
《OpenGL編程標準指南》就是由Khronos小組編寫的官方指南,是OpenGL領域的權威著作,有“OpenGL紅寶書”之稱,曾經幫助許多程式設計師走上了OpenGL專家之路。第7版在第6版的基礎上又有所改進,介紹了OpenGL 3 0和OpenGL 3 1的新的和更新的內容。
本書歷經多次版本升級,其中文版的翻譯也是一項延續性的工作,凝結了許多人的辛勤工作。徐波等曾承擔《OpenGL編程指南》第5版和第6版的主要翻譯工作。李軍在第6版的中文版的基礎上,負責了第7版新增內容的翻譯和更新工作。參與第7版翻譯工作的還有劉金華、劉偉超、羅庚臣、劉二然、鄭芳菲、莊逸川、王世高、郭瑩、陳、鄧勇、何進偉、賈曉斌、汪蔚和齊國濤。機械工業出版社華章分社的編輯為本書的出版付出了辛勤勞動,感謝他們!
譯者
2009年10月
前言
OpenGL(Graphics Library,GL圖形庫)圖形系統是圖形硬體的一個軟體接口,它允許我們創建互動性的程式,產生移動三維物體的彩色圖像。使用OpenGL,我們可以對計算機圖形技術進行控制,產生逼真的圖像或者虛構出現實世界沒有的圖像。本書解釋了如何使用OpenGL圖形系統進行編程,實現所需要的視覺效果。
本書內容
本書共分15章。前5章描述了一些基本信息,讀者需要理解這些內容,才能在場景中繪製正確著色和光照的三維物體。
·第1章對OpenGL可以實現的功能進行簡要的介紹。該章還提供了一個簡單的OpenGL程式,並介紹需要了解的一些基本編程細節,有助於學習後續章節的內容。
·第2章解釋如何創建一個物體的三維幾何圖形描述,並最終把它繪製到螢幕上。
·第3章描述三維模型在繪製到二維螢幕之前如何進行變換。我們可以控制這些變換,顯示模型的特定視圖。
·第4章描述如何指定顏色以及用於繪製物體的著色方法。
·第5章解釋如何控制圍繞一個物體的光照條件,以及這個物體如何對光照作出反應(也就是說,它是如何反射或吸收光線的)。光照是一個重要的主題,因為物體在沒有光照的情況下看上去往往沒有立體感。
接下來的幾章說明如何對三維場景進行最佳化以及如何添加一些高級特性。在沒有精通OpenGL之前,讀者可以選擇不使用這些高級特性。有些特別高級的主題在出現時會有特殊的標記。
·第6章描述創建逼真場景所需要的一些基本技巧:Alpha混合(創建透明物體)、抗鋸齒(消除鋸齒狀邊緣)、大氣效果(模擬霧和煙霧)以及多邊形偏移(在著重顯示填充多邊形的框線時消除不良視覺效果)。
·第7章討論如何存儲一系列的OpenGL命令,用於在以後執行。我們可以使用這個特性來提高OpenGL程式的性能。
·第8章討論如何操作表示點陣圖或圖像的二維數據。點陣圖的一種常見用途就是描述字型中的字元。
·第9章解釋如何把稱為紋理的一維、二維和三維圖像映射到三維物體表面。紋理貼圖可以實現許多非常精彩的效果。
·第10章描述OpenGL實現中可能存在的所有緩衝區,並解釋如何對它們進行控制。我們可以使用這些緩衝區實現諸如隱藏表面消除、模板、禁止、運動模糊和景深聚焦等效果。
·第11章顯示了如何使用GLU(OpenGL Utility Library,OpenGL工具函式館)中的分格化和二次方程函式。
·第12章介紹生成曲線和表面的高級技巧。
·第13章說明如何使用OpenGL的選擇機制來選擇螢幕上的一個物體。此外,該章還解釋了反饋機制,它允許我們收集OpenGL所產生的繪圖信息,而不是在螢幕上繪製物體。
·第14章描述如何用巧妙的或意想不到的方法來使用OpenGL,產生一些有趣的結果。這些技巧是通過對OpenGL及其技術前驅Silicon Graphics IRIS圖形函式館的多年套用和實踐總結出來的。
·第15章討論OpenGL 2 0所引入的變化,包括對OpenGL著色語言的介紹。OpenGL著色語言通常又稱為GLSL,它允許對OpenGL的頂點和片斷處理階段進行控制。這個特性可以極大地提高圖像的質量,充分體現OpenGL的計算威力。