OpenGL編程基礎(第3版)

OpenGL編程基礎(第3版)

《OpenGL編程基礎(第3版)》是2009年清華大學出版社出版的圖書,作者是段菲。

圖書信息

作者:段菲圖書詳細信息:
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章 緒論 1
1.1 OpenGL API 2
1.2 關於OpenGL的三種觀點 3
1.2.1 程式設計師的觀點 3
1.2.2 OpenGL狀態機 4
1.2.3 OpenGL繪製流水線 4
1.3 OpenGL的組成 5
1.4 OpenGL的版本和擴展 6
1.5 語言 6
1.6 編程約定 6
1.7 編譯 8
1.8 資源 9
1.9 本書的適用對象 10
1.10 全書概覽 11
第2章 OpenGL中的二維編程 13
2.1 一個簡單的示例程式 14
2.2 GLUT 15
2.3 事件循環和回調函式 16
2.4 矩形的繪製 17
2.5 修改GLUT中的默認值 19
2.6 OpenGL中的顏色 20
2.6.1 顏色的設定 20
2.6.2 顏色和狀態 21
2.7 OpenGL和GLUT坐標系之間的差異 21
2.8 二維取景 22
2.9 視口 23
2.10 坐標系與變換 23
2.11 simple.c(第2版) 24
2.12 圖元及其屬性 26
2.12.1 點 27
2.12.2 直線 27
2.12.3 啟用OpenGL特性 29
2.12.4 填充的圖元 29
2.12.5 矩形 31
2.12.6 多邊形的點劃模式 31
2.13 多邊形類型 31
2.14 顏色插值 34
2.14.1 離散處理與邊標記 34
2.14.2 離散化與細分 35
2.15 文本 43
2.16 查詢與錯誤 44
2.17 狀態的保存 46
2.18 編程練習 47
第3章 互動與動畫 49
3.1 重繪回調函式 50
3.2 Idle回調函式 51
3.3 一個旋轉的矩形 52
3.4 雙快取 54
3.5 鍵盤的使用 54
3.6 滑鼠回調函式的使用 56
3.7 滑鼠的移動 59
3.8 選單 60
3.9 NULL回調函式 62
3.10 子視窗與多視窗 62
3.11 例程:single_double.c 63
3.12 顯示列表 66
3.12.1 多個顯示列表 67
3.12.2 顯示列表與文本 68
3.12.3 顯示列表與對象 69
3.13 拾取和選擇模式 69
3.14 編程練習 74
第4章 三維編程基礎 75
4.1 攝像機與對象 76
4.2 OpenGL中的正交投影 79
4.3 觀察一個立方體 80
4.4 攝像機的定位 81
4.5 對象的生成 84
4.5.1 數組的使用 85
4.5.2 頂點數組 86
4.6 消隱 88
4.7 GLU與GLUT對象 89
4.7.1 GLU二次曲面 90
4.7.2 GLUT對象 92
4.8 透視投影 94
4.9 編程練習 96
第5章 幾何變換 97
5.1 線性變換 98
5.2 齊次坐標 98
5.3 模型-視圖變換與投影變換 99
5.4 平移 99
5.5 旋轉變換 102
5.6 比例變換 103
5.7 一個旋轉的立方體 104
5.8 直接設定矩陣 106
5.9 變換與坐標系 109
5.10 基於變換的建模 110
5.10.1 實例化 110
5.10.2 層次模型 111
5.11 編程練習 118
第6章 光照與材質 119
6.1 光照與材質之間的互動 120
6.2 Phong模型 121
6.2.1 漫反射 122
6.2.2 鏡面反射 122
6.2.3 環境反射 123
6.2.4 發射光 123
6.3 OpenGL中的光照 123
6.4 光源的指定 124
6.5 材質的指定 128
6.6 旋轉立方體的明暗計算 130
6.7 對明暗計算的控制 133
6.8 平滑著色 134
6.9 法線的處理 135
6.10 透明度 135
6.11 編程練習 139
第7章 離散圖元 141
7.1 像素和點陣圖 142
7.2 點陣圖 143
7.2.1 點陣圖的顯示 144
7.2.2 點陣圖和幾何圖元的融合 146
7.2.3 顏色與模板 147
7.3 繪製模式 148
7.4 像素的讀/寫 151
7.4.1 像素的寫操作 152
7.4.2 像素的讀取 152
7.4.3 像素的複製 153
7.5 快取的選擇 154
7.6 像素存儲模式 155
7.7 PPM圖像的顯示 155
7.8 灰度圖像的使用 162
7.9 像素映射 162
7.10 像素的縮放 164
7.11 OpenGL中的圖像處理 165
7.12 編程練習 166
第8章 紋理映射 167
8.1 什麼是紋理映射 168
8.2 紋理圖的創建 169
8.3 紋理坐標 172
8.4 紋理參數 173
8.5 一個帶有紋理的旋轉立方體 175
8.6 將紋理映射到表面 179
8.7 邊界與尺寸調整 180
8.8 多級漸進紋理 180
8.9 紋理坐標的自動生成 182
8.10 紋理對象 186
8.11 用於圖像操作的紋理圖 187
8.12 編程練習 190
第9章 曲線與曲面 191
9.1 參數曲線 192
9.2 參數曲面 194
9.3 貝塞爾曲線和曲面 195
9.4 一維OpenGL求值器 196
9.5 二維求值器 198
9.6 一個互動式例程 199
9.7 其他類型的曲線 201
9.7.1 B樣條 202
9.7.2 NURBS曲線 206
9.8 猶他壺 206
9.9 法向量與明暗 211
9.10 為表面映射紋理 213
9.11 編程練習 214
第10章 OpenGL著色語言 215
10.1 對流水線的回顧 216
10.2 著色器與著色語言 217
10.2.1 RenderMan 217
10.2.2 Cg與GLSL 218
10.3 GLSL 218
10.3.1 執行模型 219
10.3.2 一個簡單的頂點著色器 219
10.3.3 一個簡單的片段著色器 220
10.4 GLSL語言基礎 221
10.4.1 限定符 221
10.4.2 運算符 223
10.4.3 控制結構 224
10.4.4 內置函式 224
10.4.5 採樣器 225
10.5 建立與應用程式之間的接口 226
10.5.1 著色器對象的創建 226
10.5.2 著色器的讀取和編譯 227
10.5.3 編譯和連線 228
10.5.4 錯誤檢查 229
10.5.5 將數據送入著色器 229
10.6 頂點著色器示例 230
10.7 片段著色器示例 232
第11章 總結與展望 237
11.1 OpenGL各版本及擴展 238
11.1.1 OpenGL 1.1版本 238
11.1.2 OpenGL 1.2版本 238
11.1.3 OpenGL 1.3版本 239
11.1.4 OpenGL 1.4版本 239
11.1.5 OpenGL 1.5版本 239
11.1.6 OpenGL 2.0版本 240
11.1.7 OpenGL 2.1版本 240
11.2 OpenGL擴展 240
11.3 一些附加的OpenGL特性 240
11.4 其他快取 241
11.4.1 累積快取 241
11.4.2 模板快取 242
11.4.3 片段測試 243
11.5 編寫可移植、高效而又健壯的
代碼 243
索引 245

相關詞條

熱門詞條

聯絡我們