《國外計算機科學教材系列:交互式計算機圖形學·基于OpenGL著色器的自頂向下方法(第6版)(英文版)》采用自頂向下的方法并輔以面向編程的方式,基于現代可編程GPU的著色器編程,使用C++語言、OpenGL著色語言(GLSL)并結合OpenGL系統地介紹了現代計算機圖形學的核心概念、原理和方法。本書是作者多年來教學與科研工作的總結,涵蓋了基于OpenGL著色器的交互式圖形編程、三維可編程繪制流水線、變換與觀察、光照與明暗繪制、曲線曲面建模等基本的計算機圖形學內容以及離散技術、層級建模、過程建模、光線跟蹤、并行繪制和體繪制等高級內容,并為讀者進一步深入學習和研究,在每章后面提供了相關的建議閱讀資料。
《國外計算機科學教材系列:交互式計算機圖形學·基于OpenGL著色器的自頂向下方法(第6版)(英文版)》第六版進一步反映了計算機圖形學的最新發展現狀,面向圖形應用開發并輔以大量的示例和完整的源代碼,是一本“基礎性與先進性、理論性與應用性、科學性與通俗性”相結合的內容全面而又系統的國外經典計算機圖形學教材。
《國外計算機科學教材系列:交互式計算機圖形學·基于OpenGL著色器的自頂向下方法(第6版)(英文版)》既可作為有一定C++編程基礎的計算機及相關專業高年級本科生或研究生的計算機圖形學雙語教材,也適合于作為相關技術人員的參考書。
第六版新增內容
●全書使用基于著色器的新版本OpenGL
●不再使用在OpenGL 3.1中所棄用的OpenGL函數
●在OpenGL應用程序代碼和著色器中均增加了實現變換和觀察的細節描述
●保持與OpenGL ES 2.0和WebGL的一致性
●用C++代替了C
●增加了向量類和矩陣類以創建與OpenGL著色語言(GLSL)兼容的應用程序代碼
●討論了基于頂點的光照計算和基于片元的光照計算
●增加了多邊形的三角細分和Delaunay三角剖分
●介紹了體繪制
●重新編寫了所有示例程序的代碼以適合OpenGL 3.1
●增加了新合著者,《OpenGL編程指南》的作者Dave Shreiner
本書是計算機圖形學的入門教材,重點介紹應用程序的編寫。本書于1997年首次出版,第一版在使用標準圖形庫和自頂向下的方法上多多少少是一場革命。在接下來的13年中,發行了5個版本,大多數計算機圖形學概論課以及幾乎所有的教科書都采用了本書的方法。
在過去的幾年中,圖形硬件的重大變化已經導致了圖形軟件的重大變化。在OpenGL的前15年,新版本的發布一直保持向后兼容,基礎軟件的升級使代碼的可重用能力成為重要的優點,應用軟件的開發者和圖形學課程的教師都在受益。從所公布的OpenGL 3.0重大變化來看,其中一個關鍵的變化是從OpenGL 3.1開始,許多先前版本中最常見的函數將被廢棄。相對于先前版本的這一根本變化反映出需要使用最新的可編程圖形處理單元(GPU)的功能變化,這些變化也是OpenGL ES 2.0和WebGL的一部分,OpenGL ES 2.0用于開發手機和圖形輸入板等移動終端設備的應用軟件,而WebGL支持大多數最新的瀏覽器。
就像本書以前5個版本的作者(Edward Angel)以及《OpenGL編程指南》和《OpenGL ES 2.0編程指南》的作者(Dave Shreiner)一樣,我們面臨著如何反映這些變化的難題。我們撰寫了多部書籍并在ACM SIGGRAPH中多年從事OpenGL導論課程的教學,我們發現在高等教育界或高端游戲領域之外的應用程序編程人員,幾乎沒有人了解這些變化,知道這些變化的人并不認為我們可以在初級層次教會這些概念。這曾是一個我們不能抗拒的挑戰,在SIGGRAPH的課程教學中,我們從半天的短期課程開始,這使我們確信可以教會以前沒有圖形編程經驗的人如何編寫一個基于著色器的實用程序,只不過比早期版本的OpenGL多一點點工作而已。
在編寫這一版的時候,我們找到了一些其他理由,這使我們確信這種教學方法不僅是可能的,而且對學生學習計算機圖形學甚至更好。就在不久前,我們宣講了OpenGL帶來的優勢,它適用于Windows、Linux 以及Mac OS X,這樣就可以講授一門讓學生在喜愛的操作系統環境中編程的課程。學生們現在可以用OpenGL ES和WebGL開發手機和Web瀏覽器上的應用軟件,這將激勵學習計算機圖形學的學生和教師,并開辟許多新的教育和商業機會。
我們認為對于學習經驗來說尤為重要的是,讀者應該知道在這些OpenGL的新版本中棄用了先前版本中的大部分默認函數以及固定功能的繪制流水線。乍看起來,這種棄用機制似乎使第一節課程的教學更加困難,也可能稍微困難些,但是我們認為會更好。因為大多數學生過于依賴這些函數,而并不太在意課本或教師要講授給他們什么。為什么當學生使用繪制透視投影圖或執行光照計算的OpenGL內置函數就感到畏懼呢?現在,這些函數沒有了,學生們不得不自己編寫著色器來完成這些任務,這樣他們就必須首先理解計算機圖形學的基本原理和相關的數學基礎。
自頂向下的方法
圖形學的新進展以及本書前5個版本的成功一直鞭策著我們堅持采用自頂向下的、面向程序設計的方法來介紹計算機圖形學。雖然許多計算機科學與工程系現在開設了多門計算機圖形學課程,但是大多數學生只選修一門。在學生們學習了程序設計、數據結構、算法、軟件工程和基礎數學以后給他們安排一門圖形學課程,應允許教師以內容充實并且有趣的方式按上述已學課程來組織計算機圖形學課程,我們希望這些學生學習這門課程時盡可能早地編寫出三維應用程序。底層的算法,例如繪制線段或者填充多邊形,可以在學生們編寫了圖形程序之后再考慮。
計算機教育的先驅John Kemeny曾經把自頂向下的編程方法與我們熟悉的汽車來類比:你沒有必要知道汽車罩下面是什么,但是如果知道內部的工作原理,你就會去駕駛汽車而不是坐在汽車后座上。同樣的類比適用于講授計算機圖形學的方法。第一種方法(算法的方法)是把汽車工作原理的方方面面都交代清楚:發動機、傳動裝置、燃燒過程等;第二種方法(概覽的方法)是雇一名司機,自己坐在后面觀光;第三種方法(本書采用的編程方法)是教會你如何駕駛并把車開到你想要去的地方,正如一句過時的租賃廣告詞說的那樣:“讓我們把你放在駕駛員的位子上去”。
使用OpenGL和C++語言編程
當本書的第一作者Edward Angel在25年前開始講授計算機圖形學的時候,當時以面向編程的方式講授這門課程并編寫相應教材的最大障礙是缺乏一個廣泛接受的圖形庫或者應用程序編程接口(API)。遇到的困難包括:高成本、可用性受限、缺乏通用性以及高復雜性。OpenGL的開發解決了我們中很多人在其他API(例如GKS和PHIGS)中遇到的以及在使用自己編寫的軟件作為替代時所面臨的大多數困難,今天所有的平臺都支持OpenGL,它已和Microsoft Windows以及Mac OS X操作系統集成在一起。實際上所有的圖形卡都有驅動程序,在大多數Linux發行版中也都包含一個稱為Mesa的OpenGL API。
一門圖形學的課程遠遠不能僅講授如何使用一種特定的API,一種好的API應使得講授圖形學中的一些關鍵內容變得更容易,這些內容包括三維圖形學、光照和明暗處理、客戶/服務器圖形系統、建模以及實現算法。我們相信,OpenGL的擴展功能以及良好定義的結構可以為講授圖形學理論和實踐這兩方面提供了更好的基礎,而且OpenGL同樣也可以為講授包括紋理映射、圖像融合以及可編程著色器在內的一些高級概念提供更好的基礎。
大約15年以前Edward Angel就開始在授課時使用OpenGL,結果令他欣喜若狂。在那個學期的期中之前,所有的學生就都能編寫出中等復雜程度的三維圖形程序,而編寫這樣的程序需要理解三維顯示和事件驅動輸入。在這之前幾年的計算機圖形學教學中,Edward Angel從未收到過如此好的教學效果,那次課程孕育出了本書的第一版。
本書是關于計算機圖形學的教科書,并不是OpenGL使用手冊。因此,沒有把OpenGL API的方方面面都一一介紹,而是僅僅解釋了對于掌握本書內容來說必要的那些部分。因而,本書在介紹OpenGL時的定位是允許其他API用戶毫無困難地閱讀本書的內容。
與前幾個版本相比,這一版使用C++代替C語言作為占主導地位的編程語言,主要原因是必須用OpenGL著色語言(GLSL)來編寫著色器,而著色器是控制GPU的程序。GLSL是一個類似于C的語言,包括向量和矩陣的原子數據類型,以及操作它們的基本運算符的重載。OpenGL的所有現代版本要求每一個應用程序提供兩個著色器,因此學生需要使用這些特征,它們可以支持C++。只通過使用C++的這部分(簡單類、構造函數、重載操作符)內容,我們就可以實現基本圖形概念,如變換和光照,無論是OpenGL應用程序還是著色器幾乎都是完全相同的代碼。此外,使用本書網站提供的簡單矩陣類和向量類可以編寫出更加清晰、簡潔的代碼。學習Java或C語言的學生理解本書中的代碼應該沒什么困難。
適用的讀者
本書適用于計算機科學和工程專業的高年級本科生和一年級研究生,以及具有良好程序設計能力的其他專業學生。本書對于許多專業人員也是有價值的。我們已經成功地為專業人員講授了100多次短期課程,從這些非傳統意義的學生身上獲得的經驗極大地影響了本書的內容。
在閱讀本書之前,讀者應該熟練掌握C++、Java或者C語言,理解鏈表和樹等基本數據結構并具有線性代數和三角學的初步知識。我們發現計算機科學專業學生的數學背景相差很大,不管是本科生還是研究生都是如此。因此,本書包含了很多計算機基礎圖形學所需的線性代數和幾何學知識。
本書的內容組織
本書內容組織如下:第l章概覽整個圖形學領域并介紹了基于光學設備的圖像生成,這樣從一開始就引入了三維圖形學的概念。第2章介紹OpenGL編程,雖然編寫的第一個示例程序是二維的(每一章都有一個或者多個完整的編程示例),但是這個程序是嵌入在三維環境下編寫的,并且可以擴展到三維。這一章還介紹交互式圖形學以及基于事件驅動的圖形程序開發。第3章和第4章討論三維圖形學概念,第3章討論如何定義和處理三維對象,而第4章討論如何觀察它們。第5章介紹光線和材質之間的相互作用以及明暗繪制。這5章應該按順序講授,在一個總共15周的學期里,大約10周可以講完這些內容。
后面的6章可以按照任何順序閱讀。所有這6章都或多或少是開放式的,讀者可以概覽,也可以深究其中的一些課題。第6章討論光柵化,對三維圖形繪制流水線中的每個基本步驟都給出了一種或兩種主要算法,這些基本步驟包括裁剪、直線段生成和多邊形填充。第7章介紹目前圖形硬件和OpenGL所支持的許多新的離散技術,所有這些技術都需要與各種緩存打交道,這一章以簡單討論計算機圖形學中的走樣問題而結束。第6章和第7章討論了用于所有交互式圖形系統的標準觀察流水線。
第8章包含層級建模主題中的若干松散內容,涉及從層級模型(封裝了各部分之間聯系的模型)的構造到互聯網圖形繪制的高級方法。這一章包括對場景圖和開放場景圖(OSG)的介紹。第9章介紹若干過程方法,包括粒子系統、分形和過程噪聲。第10章討論曲線和曲面,包括細分曲面。第11章介紹其他一些高繪制方法,進一步討論了光線
第1章 圖形系統和模型
1.1 計算機圖形學的應用
1.2 圖形系統
1.3 物理圖像與合成圖像
1.4 成像系統
1.5 虛擬照相機模型
1.6 應用程序編程接口
1.7 圖形繪制系統的體系結構
1.8 可編程流水線
1.9 性能特征
小結和注釋
建議閱讀資料
習題
第2章 圖形學編程
2.1 Sierpinski鏤墊
2.2 編寫二維圖形應用程序
2.3 OpenGL應用程序編程接口
2.4 圖元和屬性
2.5 顏色
2.6 觀察
2.7 控制函數
2.8 Sierpinski鏤墊繪制程序
2.9 多邊形和遞歸
2.10 三維Sierpinski鏤墊
2.11 增加交互性
2.12 菜單
小結和注釋
建議閱讀資料
習題
第3章 幾何對象和變換
3.1 標量、點和向量
3.2 三維圖元
3.3 坐標系和標架
3.4 OpenGL中的標架
3.5 矩陣和向量類
3.6 建模一個彩色立方體
3.7 仿射變換
3.8 平移、旋轉和縮放
3.9 變換的齊次坐標表示
3.10 變換的級聯
3.11 OpenGL變換矩陣
3.12 使立方體旋轉起來
3.13 三維應用程序的接口
3.14 四元數
小結和注釋
建議閱讀資料
習題
第4章 觀察
4.1 經典觀察和計算機觀察
4.2 計算機觀察
4.3 定位照相機
4.4 平行投影
4.5 透視投影
4.6 OpenGL中的透視投影
4.7 透視投影變換矩陣
4.8 隱藏面消除
4.9 顯示網格
4.10 投影和陰影
小結和注釋
建議閱讀資料
習題
第5章 光照和明暗繪制
5.1 光線和材質
5.2 光源
5.3 Phong反射模型
5.4 計算向量
5.5 多邊形的明暗繪制
5.6 通過遞歸細分逼近球面
5.7 指定光照參數
5.8 實現光照模型
5.9 球面模型的明暗繪制
5.10 基于每個片元的光照計算
5.11 全局光照
小結和注釋
建議閱讀資料
習題
第6章 從頂點到片元
6.1 圖形繪制流水線的基本實現策略
6.2 圖形繪制系統的四個主要任務
6.3 裁剪
6.4 線段的裁剪
6.5 多邊形的裁剪
6.6 其他圖元的裁剪
6.7 三維裁剪
6.8 光柵化
6.9 Bresenham算法
6.10 多邊形光柵化算法
6.11 隱藏面消除
6.12 反走樣
6.13 顯示方面的問題
小結和注釋
建議閱讀資料
習題
第7章 離散技術
7.1 緩存
7.2 數字圖像
7.3 緩存的寫操作
7.4 映射方法
7.5 紋理映射
7.6 OpenGL的紋理映射
7.7 紋理生成
7.8 環境貼圖
7.9 反射貼圖示例程序
7.10 凹凸映射
7.11 合成技術
7.12 采樣與走樣
小結和注釋
建議閱讀資料
習題
第8章 層級建模方法
8.1 圖符和實例
8.2 層級模型
8.3 機器人手臂
8.4 樹與樹的遍歷
8.5 使用樹形數據結構
8.6 動畫
8.7 圖形對象
8.8 場景圖
8.9 開放場景圖
8.10 圖形和因特網
8.11 其他樹形結構
小結和注釋
建議閱讀資料
習題
第9章 過程建模方法
9.1 基于算法的建模
9.2 基于物理的建模和粒子系統
9.3 牛頓粒子
9.4 求解粒子系統方程
9.5 約束條件
9.6 一個簡單的粒子系統
9.7 基于語言的建模
9.8 遞歸方法和分形
9.9 過程噪聲
小結和注釋
建議閱讀資料
習題
第10章 曲線和曲面
10.1 曲線和曲面的表示形式
10.2 設計準則
10.3 三次參數多項式曲線
10.4 插值
10.5 Hermite曲線和曲面
10.6 Bézier曲線和曲面
10.7 三次B樣條
10.8 普通B樣條
10.9 曲線和曲面的繪制
10.10 Utah茶壺模型
10.11 代數曲面
10.12 曲線和曲面的細分
10.13 從數據生成網格
小結和注釋
建議閱讀資料
習題
第11章 高級繪制
11.1 超越流水線繪制結構
11.2 光線跟蹤
11.3 構建一個簡單的光線跟蹤器
11.4 繪制方程
11.5 輻射度方法
11.6 RenderMan
11.7 并行繪制
11.8 體繪制
11.9 等值面與步進立方體
11.10 網格簡化
11.11 直接體繪制
11.12 基于圖像的繪制
小結和注釋
建議閱讀資料
習題
附錄A 示例程序
A.1 著色器初始化函數
A.2 Sierpinski鏤墊程序
A.3 遞歸實現Sierpinski鏤墊程序
A.4 在著色器中實現立方體的旋轉
A.5 透視投影
A.6 旋轉著色的立方體
A.7 對球面模型執行基于每個片元的光照計算
A.8 帶紋理的立方體旋轉程序
A.9 基于樹形結構的機器人繪制程序
A.10 茶壺繪制程序
附錄B 空間
B.1 標量
B.2 向量空間
B.3 仿射空間
B.4 Euclid空間
B.5 投影
B.6 GRAM?SCHMIDT正交化
建議閱讀資料
習題
附錄C 矩陣
C.1 定義
C.2 矩陣的運算
C.3 行矩陣和列矩陣
C.4 秩
C.5 表示的變換
C.6 叉積
C.7 特征值和特征向量
C.8 向量和矩陣類
建議閱讀資料
習題
附錄D OpenGL函數一覽
D.1 初始化和窗口函數
D.2 頂點緩沖區對象
D.3 交互函數
D.4 屬性設置和功能開啟函數
D.5 紋理和圖像函數
D.6 狀態和緩存操作函數
D.7 查詢函數
D.8 GLSL函數
參考文獻