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