互動式計算機圖形學——基於OpenGL的自頂向下方法(第4版)(互動式計算機圖形學--基於OpenGL的自頂向下方法)

互動式計算機圖形學——基於OpenGL的自頂向下方法(第4版)

互動式計算機圖形學--基於OpenGL的自頂向下方法一般指本詞條

《互動式計算機圖形學——基於OpenGL的自頂向下方法(第4版)》是2007年8月27日清華大學出版社出版的圖書,作者是(美)安吉爾(EdwaN Angel),譯者是吳文國。

基本介紹

  • 書名:互動式計算機圖形學——基於OpenGL的自頂向下方法(第4版)
  • 作者:(美)安吉爾(EdwaN Angel)
  • 譯者:吳文國。
  • ISBN:9787302152651
  • 定價:79.99元
  • 出版社:清華大學出版社
  • 出版時間:2007年8月27日
  • 裝幀:平裝
  • 印次:4-1
內容簡介,圖書前言,圖書目錄,

內容簡介

本書介紹計算機圖形學,重點講解圖形學的套用編程。從最初作為圖形學講義到1997正式出版第1版的7年時間裡,圖形學領域發生了巨大的變化,變化之迅速出乎多數人的意料。在此後的8年時間裡(本書前3版),計算機圖形學領域發生了更多的變化。具有正片電影長度的計算機動畫不僅在商業上獲得了成功,而且在藝術上也取得了一定的成就。在電影中使用計算機特效已成為一種標準,而且很難辨別真實動作與計算機製作的動畫效果之間的差異。近來的先進硬體技術模糊了計算機和實際遊戲製作棚之間的界線。可程式圖形處理器使得個人計算機具有靈活的圖形處理功能,這些功能幾年前即使在最昂貴的工作站上也是不可能實現的。
不僅圖形系統的性能提高了許多,而且高端和低端工作站的價格也大幅度地下降。在最近幾年裡,每秒能生成一千多萬個三維多邊形,且帶有光照效果和紋理映射的圖形系統的價格從最初數十萬美元下降到現在的不到1000美元。為個人計算機提供的專用圖形顯示卡的出現具有其特別深遠的意義。這些顯示卡起價雖然大約只有100美元,但能實現複雜的三維圖形功能。在軟體方面,無論是編寫圖形學應用程式還是在科學研究領域裡開發高端產品,OpenGL仍將是圖形開發人員的標準工具包。
自頂向下的方法
圖形學的最新發展和本書前3版的成功,使我進一步增強了以下信念:即採用自頂向下的、面向編程的方法介紹計算機圖形學。儘管許多計算機科學與工程系都提供了多門與計算機圖形學有關的課程,但是就大多數學生而言,他們只能選修其中一門課程。現在的教學計畫往往把圖形學課程安排在程式語言、數據結構、算法設計、軟體工程和基礎數學等課程之後。計算機圖形學的講授方式應該以知識性和趣味性為出發點,並逐步深入討論與圖形學相關的內容。我希望選修圖形學課程的學生儘早動手編寫三維圖形應用程式,只有當學生掌握了如何創建圖形之後才可以向他們介紹畫線和多邊形填充等底層算法。
John Kemeny是計算機教育領域裡的開拓者,他用大家非常熟悉的汽車作了一個非常形象的比喻。即大家並不真正需要理解汽車發動機的工作原理,但是如果不掌握汽車駕駛技術,就只能坐在汽車的后座里看人家開車。這個比喻同樣可以類推到計算機圖形學的教學方法上。講授圖形學有3種不同的方法。方法1——算法法,就是要求學生掌握與汽車工作原理有關的各方面知識,如發動機、傳動裝置和燃燒過程等;方法2—— 觀察法,相當於讓一個車夫開車,讓學生坐在後排做一個旁觀者欣賞這個世界;方法3——編程法,就是指導學生如何駕駛,如何把車開到任何我們想要去的地方,本書就是採用這種方法。
用OpenGL和C編程
在20年前,當我開始講授圖形學課程時,在設計面向編程的課程和編寫相應的教材過程中遇到的最大困難是缺少普遍認可的圖形系統函式館或應用程式開發人員接口(Application Programmer's Interface,簡稱API)。其他困難還包括:高成本、有限的資源、缺少通用性和系統的高度複雜性。OpenGL的成功開發為我們解決了在使用其他一些API(如GKS與PHIGS)和一些由開發人員自行開發的代用軟體過程中遇到的許多困難。OpenGL得到了大多數工作站供貨商的支持,並且通過第三方供貨商,可以在絕大多數平台上運行。OpenGL與微軟Windows作業系統的所有最新版本和蘋果公司的Macintosh作業系統捆綁銷售。OpenGL API還有一個稱為Mesa的版本,它與Linux作業系統的絕大多數發行版捆綁發行。
作為一門圖形學課程,我們要講授的內容遠不只是介紹某個特定API工具包的使用那樣簡單,但是一個優秀的API工具包可以使講解圖形學中的某些關鍵問題變得輕而易舉。這些關鍵問題包括三維圖形、陰影處理、客戶-伺服器圖形學(簡稱C-S圖形學)、建模以及實現算法等內容。我堅信OpenGL強大的功能和良好的結構能夠使它成為講授圖形學原理與實踐的一個強有力工具,它也是講授紋理映射和圖像合成等最新功能的有用工具,這些功能直到最近還沒有在任何其他API工具包中得以實現。
大約在12年前,我把學生的興趣轉移到OpenGL上,其結果令我非常吃驚。到了學期期中時,每個學生都能編寫出具有一定難度,且結合了三維視圖理論並具有事件驅動輸入模式的三維圖形程式。在我此前的15年圖形學教學生涯里從來沒有取得過這么好的成績。這一成績最終促使我從頭開始編寫圖形學教材。
本書是計算機圖形學的教科書,而不是OpenGL使用手冊。因此我並沒有對OpenGL API的各個方面都進行詳細討論。只是對掌握本書內容必不可少的那部分OpenGL內容作了較為詳細的介紹。本書對OpenGL的介紹只是想讓其他API的用戶在遇到相關資料時不會感到有很大的困難。對於那些想深入了解OpenGL的同學們,可以參考我最近出版的OpenGL:A Primer (Addison-Wesley,2002)一書,它是本書最有價值的補充閱讀材料。
在本版中,我同時使用C和C++語言,但是以C語言為主。對於這樣的安排,我有兩個理由:第一,由於OpenGL本身並不面向對象,所以除非我要在OpenGL與用戶之間建立一個面向對象的三維幾何對象庫,否則使用C++或Java等面向對象語言對於基本問題的討論沒有實質性的幫助。雖然採用面向對象這個想法看起來非常有吸引力,但我不想這樣做,因為這會影響學生掌握圖形學的理論知識,而且會使那些有很強的編程能力但不熟悉面向對象編程的學生不能很好地理解本書。第二,我的經驗表明,面向對象方法會使用戶看不到底層的工作原理(他們應該知道這些底層的東西)。然而作為計算機圖形學的導論課,我希望我的學生了解底層知識。儘管圖形學是向學生介紹面向對象編程方法的極好工具,但面向對象並不是向計算機科學與工程系學生介紹圖形學最有效的方法。一種例外的情況是在介紹場景圖形時我採用了面向對象的方法,而且這部分內容使用了C++知識。至於我的本科學生,由於C++是他們最先要學習的課程之一,因此他們在閱讀本書代碼時,不管是C或C++程式代碼都不會有太大困難。
在計算機圖形學領域裡,關於OpenGL的未來地位以及是否會被DirectX取代有很多爭論。然而在計算機圖形學教育者中間,毫無疑問,OpenGL仍將是他們講授圖形學課程的首選API工具包。儘管DirectX是遊戲開發的一個標準,但是在許多人看來,它並不十分適合於作為計算機圖形學的教學工具,也不適合於那些想自己開發應用程式的用戶。而且由於DirectX是專門針對Windows操作平台的,因此要想編寫可移植的基本應用程式必須要寫很多額外的代碼。從更高的層次上來看,OpenGL和DirectX在很多方面以相同的方式支持相同的功能。所以本書的讀者如需要轉到DirectX編程並不會有太大的困難。
本書讀者對象
本書適合計算機科學與工程系的高年級本科生和一年級研究生,以及其他學科有相當編程能力的學生。本書對許多圖形學專業人員也有幫助。我曾為圖形學專業人員舉辦過大約100期短期培訓,我與他們的交往經歷對編寫本書有很大影響。
使用本書的先決條件是要精通C或C++編程,基本的數據結構(鍊表和樹)知識以及線性代數與三角幾何方面的初步知識。據我所知,計算機系的學生,不管是本科生還是研究生,數學知識良莠不齊,所以我在本書不少地方插入了有關線性代數和三角幾何等方面的知識,這些知識是學習計算機圖形學的必備條件。我在書後的兩個附錄里也概括介紹了這兩方面的知識。
本書的結構安排
本書的內容安排如下。第1章綜述了圖形學領域,並介紹了光學設備的成像過程,接著我們開始討論三維圖形的概念。第2章介紹OpenGL編程,本書的第一個實例以及本章和本書其他章節的編程實例,儘管都是二維的,但它們都置於一個三維環境中。第3章討論最新C-S環境的互動式圖形學,並介紹了幾個事件驅動圖形程式。第4章和第5章集中介紹三維圖形的概念。其中第4章介紹三維對象的定義和操作方法。第5章介紹三維對象的視圖生成過程。第6章介紹光與材質的相互作用以及明暗處理方法。以上這些章節都要求讀者按順序閱讀,並且要在10周(假設一學期為15周)內完成。
本書後面6章可以按任意次序進行閱讀。這6章的內容都呈開放形式,即既可以採用概覽方式,也可以對某章或某個專題進行深入討論。第7章概括了光柵化技術,針對裁剪、線段生成、多邊形填充等每一個基本功能,本章都給出了一到兩個重要的算法。第8章介紹了離散化技術的許多特性,這些特性在現在的圖形硬體上和OpenGL里都已得到實現。所有這些離散化技術都與各種快取有關。第9章介紹基於OpenGL著色語言(OpenGL Shading Language,簡稱GLSL)的可程式著色器,OpenGL著色語言已經成為OpenGL標準的一部分。我們可以利用可程式著色器實現如凹凸紋理映射等技術,這些技術在以前是不能實時實現的。第8、9章展開討論了各種互動式圖形系統所採用的標準視圖處理流水線。
第10章在建模這個大標題下介紹了多個並不十分緊密相關的主題。從用於表示模型各部分之間關係的建模技術到圖形在Internet上的高級表示,再到過程建模技術。本章還提供了一個簡單的場景圖形API工具包。第11章討論了曲線、曲面及細分曲面等內容。第12章介紹了各種繪製方法,包括對光線跟蹤方法和輻射度方法的深入討論,並簡單介紹了基於圖像的繪製方法和並行繪製技術。
本書附錄A的程式實例主要來自本書的第一部分。附錄B和附錄C簡單複習了本書中用到的數學基礎知識。附錄D是本版新增的內容,概括介紹了本書中用到的OpenGL函式的用法。
針對第3版的修改
本書前3版的絕大多數讀者對本書的反應是肯定的,他們都特別推崇本書採用OpenGL和自頂向下的方法。儘管如此,還是存在一些需要改進的地方以及一些有關圖形學的最新進展。可程式圖形處理器的研製成功就是圖形學的一個最重要成就,我相信它將大大影響我們講授計算機圖形學的方式。在編寫前3版時,一些技術由於不能在大多數系統上實現,因此我們沒有對它們進行深入討論;而現在這些技術已經很常用,因此可以在計算機圖形學的第一門課程中講授。此外,我們還要對來自前3版的內容重新進行組織,這樣做會使得本版的章節組織順序比前面幾版更嚴格地按照OpenGL的流水線過程。
新增了第9章的內容,本章介紹可程式著色器。可程式著色器採用OpenGL著色語言,是OpenGL 2.0的一部分。現在利用可程式著色器,許多技術都可以實時實現。因此本章內容變動較大。在第3版中,我們在討論凹凸映射之前先討論的是紋理映射,但是在本版里,我們是先討論片元著色器(fragment shader)。有的老師一開始可能會認為這樣安排有點怪,但是我想當他們開始講授頂點和像素繪製器時就會發現這樣安排的好處。
在第3版中,我把科學可視化與過程建模方法這兩部分安排成單獨的一章,在第4版中則全部刪除了這一章內容。除了討論最先進的繪製技術的小部分內容外,這一章的其他內容都分散到其他章節中,目的是讓講授圖形學的老師們可以有針對性地討論這些圖形學的高級內容。例如,我們把Marching Squares(移動正方形方法)移到第2章的末尾,目的是為讀者提供一個複雜的二維應用程式實例,而實際上它對於閱讀第3章並非是必須的。
我相信這樣的變動會給一學期計算機圖形學導論課的教學產生一些不利的影響,但會給兩學期的圖形學課程帶來不少的便利。
致謝
在過去幾年裡,我有幸與新墨西哥大學的一群非常優秀的學生合作。是他們最先激發我對OpenGL的興趣,我從他們那裡學到了很多東西。這些學生包括Hue Bumgarner- Kirby(Walker)、Ye Cong、Pat Crossno、Tommie Daniel、Chris David、 Lisa Desjarlais、Kim Edlund、Lee Ann Fisk、Maria Gallegos、Brian Jones、Christopher Jordan、Max Hazelrigg、Sheryl Hurley、Thomas Keller、Ge Li、Pat McCormick、Al McPherson、Ken Moreland、Martin Muller、David Munich、Jim Pinkerton、Jim Prewett、Dave Rogers、Hal Smyer、Takeshi Hakamata、Dave Vick、Brian Wylie和Jin Xiong。彩圖裡的許多圖片由他們繪製生成。
本書的第1版,我是在假期里完成的。本書的不同部分在5個不同的國家完成。這個經曆本身很好地說明了手提計算機的強大作用和Internet無處不在。儘管如此,如果沒有許多人的幫助和一些機構為我提供的便利,我不可能完成這個任務。我非常感謝委內瑞拉安第斯大學的(the Universidad de Los Andes)的Jonas Montilva和Chris Birkbeck、厄瓜多赤道理工大學(Universidad Tecnologica Equinoccial)的Rodrigo Gallegos 和Aristides Novoa、香港中文大學的Kin Hong Wong和Pheng Ann Heng。ISTEC1(Ibero-American Research Education Technology Consortium)的Ramiro Jordan和新墨西哥大學的資助才使這些訪問成為可能。不管我身在何方,新墨西哥大學的John Brayer和Jason Steward以及Addison-Wesley出版社的Helen Goldstein總是想方設法把各種資料傳給我。我的個人主頁上對我在編寫本書第1版過程中遇到的冒險經歷有詳盡的描述。
本版是在新墨西哥大學完成的。前3版的成千上萬教師和學生給我提供了一些反饋意見和評價,我從這些反饋意見和評價中受益匪淺,前幾版的修改大多都來自他們的要求和反饋意見。
NVIDIA公司的David Kirk和Mark Kilgard好心地為我提供了圖形顯示卡,利用這些圖形卡我可以對書中的一些最新算法進行測試。還有其他人員為我提供了重要的幫助。在此,我要感謝Ben Bederson、Gonzalo Cartagenova、Tom Caudell、Kathi Collins、 Kathleen Danielson、 Roger Ehrich、Robert Geist、Chuck Hansen、Mark Henne、Bernard Moret、Dick Nordhaus、Helena Saona、Dave Shreiner、Vicki Shreiner、Gwen Sylvan 以及Mason Woo。OpenGL領域的研究人員要向Mark Kilgard、Brian Paul和Nate Robins等人致敬,他們開發的軟體能夠使OpenGL程式在各種平台上運行。
在新墨西哥大學,高性能計算中心和IBM公司為我的可視化項目提供了支持。新墨西哥大學的計算機科學系、美術學院的藝術技術中心、國家科學基金、桑迪亞國家實驗室和洛斯阿拉莫斯國家實驗室(Los Alamos National Laboratory)為我的學生和他們的研究項目提供了資助,這些項目與本書的部分內容有關。David Beining和北極星天文館(Lodestar Planetarium)為Sheryl Hurley、Christopher Jordan、Laurel Ladwig和Hue (Bumgarner-Kirby)(Walker) 等人的研究項目(Full Dome)提供了大力支持,該項目為本書提供了書中彩色插圖中的一些圖片。
本書原稿的審稿人員就本書的內容及本書的深度和廣度提出了各自不同的觀點。

圖書前言

這些審稿人員是Gur Saran Adhar (北卡羅來納大學威明頓分校) 、Mario Agrular(傑克遜維爾州立大學)、Michael Anderson(哈特福德大學)、C. S. Bauer(中佛羅里達大學)、Marty Barrett(東田納西州立大學)、Robert P. Burton(伯明罕揚大學)、Sam Buss(加州大學聖地亞哥分校)、Kai H. Chang(奧本大學)、Ron DiNapoli(康乃爾大學)、Eric Alan Durant(密爾瓦基工程學校)、David S. Ebert(普渡大學)、Chenyi Hu(中阿肯色大學)、Mark Kilgard(NVIDIA公司)、Lisa B. Lancor(南康康乃狄克州立大學)、Chung Lee(加州州立理工大學波莫那分校)、John L. Lowther(密西根理工大學)、R. Marshall(波士頓大學、布利基沃特州立學院)、Bruce A. Maxwell(史瓦斯摩爾學院)、James R. Miller(堪薩斯州立大學)、Han-Wei Shen(俄亥俄州州立大學)、Oliver Staadt(加州大學戴維斯分校)、Stephen L. Stepoway(南衛理公會大學)、Michael Wainer(伊利諾斯州大學卡本代爾分校)、George Wolberg(紐約城市學院)、Yang Wang(南衛理公會大學)、Steve Warren(堪薩斯州立大學)、MikeWay(佛羅里達南部學院)以及Ying Zhu(喬治亞州立大學)。儘管最後的定稿並不一定都能反映他們的全部觀點(原因是這些觀點往往存在很大的分歧),但是他們的觀點促使我不得不對原稿的每一頁進行反覆推敲。
感謝Addison-Wesley出版公司的整個團體。在本書的4個版本及OpenGL Primer等書的出版過程中,我與我的編輯Peter Gordon、Maite Suarez-Rivas和Matt Goldstein的合作一直很愉快。我所有由Addison-Wesley公司出版的圖書在出版過程中一直得到了Katherine Harutunian的幫助。在我遇到TEX排版問題時,Windfall軟體公司的Paul Anagnostopoulos為我做了很多超出其職責範圍之內的事情。特別感謝Lyn Dupré,由於我天生就不是一個作家,如果讀者有機會看到本書第1版的原稿,就會知道Lyn Dupré在原稿上所創造的奇蹟。
我的夫人Rose Mary Molnar為我的第一本圖形學書繪製了裡面的插圖。這些插圖的一部分成為了本書插圖的基礎。可能只有其他作家才能完全理解在出版過程中作者所投入的精力以及我的合作夥伴為此所作出的貢獻和犧牲。也謹把此書獻給我的夫人,感謝她為我所做的工作。
1 ISTEC是伊比利亞美洲教育技術研究聯盟。

圖書目錄

第1章 圖形系統和模型 1
1.1 計算機圖形學的套用 1
1.1.1 信息的顯示 2
1.1.2 設計 2
1.1.3 仿真與動畫 3
1.1.4 用戶界面 3
1.2 計算機圖形系統 4
1.2.1 像素與幀快取 5
1.2.2 輸出設備 6
1.2.3 輸入設備 8
1.3 圖像:物理方法和人工
合成方法 8
1.3.1 對象與觀察者 9
1.3.2 光照與圖像 10
1.3.3 成像模型 12
1.4 成像系統 13
1.4.1 針孔照相機 13
1.4.2 人眼視覺系統 15
1.5 虛擬照相機模型 16
1.6 程式設計師接口 18
1.6.1 筆式繪圖儀模型 19
1.6.2 三維API軟體包 21
1.6.3 彩圖介紹 23
1.6.4 建模-繪製模式 24
1.7 圖形系統的體系結構 25
1.7.1 顯示處理器 25
1.7.2 流水線體系結構 26
1.7.3 圖形處理流水線 27
1.7.4 頂點處理 27
1.7.5 裁剪與圖元組裝 28
1.7.6 光柵化 28
1.7.7 片元處理 28
1.8 可程式流水線 28
1.9 性能特性 29
1.10 小結 30
1.11 補充閱讀材料 30
1.12 習題 31
第2章 圖形學編程 33
2.1 Sierpinski鏤墊 33
2.2 編寫二維應用程式 34
2.3 OpenGL API工具包 39
2.3.1 圖形函式 40
2.3.2 圖形流水線和狀態機 41
2.3.3 OpenGL接口 41
2.4 圖元與屬性 42
2.4.1 多邊形基本概念 44
2.4.2 OpenGL里的多邊形類型 46
2.4.3 球體的近似表示 47
2.4.4 字元 48
2.4.5 曲線和曲面 50
2.4.6 屬性 50
2.5 顏色 51
2.5.1 RGB顏色 53
2.5.2 索引顏色 55
2.5.3 設定顏色屬性 56
2.6 視圖處理 57
2.6.1 正交視圖 57
2.6.2 二維視圖 60
2.6.3 矩陣模式 60
2.7 控制函式 61
2.7.1 與Windows作業系統的
互動作用 61
2.7.2 縱橫比和視口 63
2.7.3 main、display和myinit
函式 64
2.7.4 程式結構 65
2.8 Sierpinski鏤墊程式 65
2.9 多邊形與遞歸 67
2.10 三維Sierpinski鏤墊 69
2.10.1 使用三維點 69
2.10.2 在三維空間裡使用
多邊形 71
2.10.3 隱藏面消除 73
2.11 描繪隱函式曲線 74
2.12 小結 82
2.13 補充閱讀材料 83
2.14 習題 84
第3章 輸入與互動 87
3.1 互動模式 87
3.2 輸入設備 88
3.2.1 物理輸入設備 89
3.2.2 邏輯設備 92
3.2.3 輸入模式 92
3.3 客戶-伺服器結構 94
3.4 顯示列表 95
3.4.1 顯示列表的定義和運行 97
3.4.2 字元和顯示列表 98
3.4.3 GLUT庫里的字型 101
3.5 事件驅動編程 102
3.5.1 使用指向輸入設備 102
3.5.2 視窗事件 105
3.5.3 鍵盤事件 106
3.5.4 顯示函式和空閒回調函式 106
3.5.5 視窗管理 107
3.6 選單 108
3.7 拾取 109
3.8 一個簡單的畫圖程式 115
3.9 建立互動模型 120
3.10 互動式動畫程式 123
3.10.1 旋轉的正方形 123
3.10.2 雙快取 125
3.10.3 使用定時器 126
3.11 互動式程式的設計 127
3.12 邏輯運算 128
3.12.1 繪製可刪除的直線 129
3.12.2 異或操作(XOR)和顏色 132
3.12.3 游標與覆蓋層位平面 132
3.13 小結 133
3.14 補充閱讀材料 134
3.15 習題 134
第4章 幾何對象與坐標變換 138
4.1 標量、點和矢量 138
4.1.1 幾何對象 139
4.1.2 與坐標無關的幾何對象 141
4.1.3 數學觀點:矢量與
仿射空間 141
4.1.4 計算機科學的觀點 142
4.1.5 幾何抽象數據類型 142
4.1.6 直線 144
4.1.7 仿射加 144
4.1.8 凸性 145
4.1.9 點積和叉積 146
4.1.10 平面 147
4.2 三維幾何圖元 148
4.3 坐標系與標架 150
4.3.1 矢量表示與N-元組 152
4.3.2 坐標系變換 153
4.3.3 表示變換的示例 155
4.3.4 齊次坐標 156
4.3.5 標架變換的示例 159
4.3.6 表示矩陣的運算處理 161
4.4 OpenGL里的標架系統 162
4.5 建立一個彩色立方體模型 166
4.5.1 立方體模型 166
4.5.2 內側面與外側面 167
4.5.3 對象表示的數據結構 168
4.5.4 彩色立方體 169
4.5.5 雙線性插值 169
4.5.6 頂點數組 171
4.6 仿射變換 173
4.7 平移、旋轉和縮放 175
4.7.1 平移變換 175
4.7.2 旋轉變換 176
4.7.3 縮放變換 178
4.8 齊次坐標表示的變換公式 179
4.8.1 平移 180
4.8.2 縮放 181
4.8.3 旋轉 181
4.8.4 剪下變換 183
4.9 變換的串乘運算 184
4.9.1 繞某一固定點的旋轉 185
4.9.2 一般的旋轉變換 186
4.9.3 實例變換 187
4.9.4 繞任一軸旋轉 188
4.10 OpenGL中的變換矩陣 192
4.10.1 當前變換矩陣 192
4.10.2 旋轉、平移和縮放 193
4.10.3 在OpenGL中繞固
定點旋轉 194
4.10.4 變換次序 194
4.10.5 立方體的旋轉 195
4.10.6 矩陣的裝載、壓棧和彈棧
操作 196
4.11 三維應用程式的互動方式 197
4.11.1 利用螢幕區域設定互動 197
4.11.2 一個虛擬跟蹤球 198
4.11.3 平滑旋轉 199
4.11.4 遞增式旋轉 200
4.12 四元數 201
4.12.1 複數與四元數 201
4.12.2 四元數與旋轉 202
4.13 小結 204
4.14 補充閱讀材料 205
4.15 習題 205
第5章 視圖 208
5.1 經典視圖和計算機視圖 208
5.1.1 經典視圖 210
5.1.2 正射投影 210
5.1.3 軸測法投影 211
5.1.4 斜投影 212
5.1.5 透視圖 213
5.2 計算機視圖 214
5.3 照相機定位 215
5.3.1 照相機標架的定位 215
5.3.2 兩個視圖處理API工具包 220
5.3.3 Look-At 函式 223
5.3.4 其他視圖API工具包 224
5.4 簡單投影 225
5.4.1 透視投影 225
5.4.2 正交投影 228
5.5 OpenGL的投影視圖 229
5.5.1 OpenGL的透視投影 230
5.5.2 OpenGL的平行視圖 232
5.6 隱藏面消除 232
5.7 互動式格線顯示 234
5.7.1 格線 234
5.7.2 在場景中漫遊 236
5.7.3 多邊形偏移 238
5.8 平行投影矩陣 239
5.8.1 投影歸一化 239
5.8.2 正交投影矩陣 240
5.8.3 斜投影 242
5.9 透視投影矩陣 244
5.9.1 透視正則化 245
5.9.2 OpenGL的透視變換 248
5.10 投影與陰影 249
5.11 小結 252
5.12 補充閱讀材料 253
5.13 習題 253
第6章 明暗處理 255
6.1 光與材質 255
6.2 光源 258
6.2.1 彩色光源 259
6.2.2 環境光 260
6.2.3 點光源 260
6.2.4 聚光燈 261
6.2.5 遠距離光源 262
6.3 Phong反射模型 263
6.3.1 環境反射 265
6.3.2 漫反射 265
6.3.3 鏡面反射 266
6.3.4 改進的Phong模型 268
6.4 矢量計算 269
6.4.1 法向矢量 270
6.4.2 反射角度 272
6.5 多邊形的明暗處理 273
6.5.1 平面明暗處理 274
6.5.2 插值和Gouraud明暗
處理方法 276
6.5.3 Phong明暗處理方法 277
6.6 球面的遞歸細分逼近 278
6.7 OpenGL中的光源 282
6.8 OpenGL程式中的材質設定 284
6.9 球體模型的明暗處理 285
6.10 全局照明 287
6.11 小結 288
6.12 補充閱讀材料 289
6.13 習題 290
第7章 從頂點到片元 292
7.1 繪製實現的基本策略 292
7.2 繪製實現過程的4個
主要任務 294
7.2.1 建模 295
7.2.2 幾何處理 295
7.2.3 光柵化 296
7.2.4 片元處理 297
7.3 裁剪 297
7.4 線段裁剪 298
7.4.1 Cohen-Sutherland
裁剪算法 298
7.4.2 Liang-Barsky裁剪算法 300
7.5 多邊形裁剪 301
7.6 其他圖元的裁剪 305
7.6.1 包圍盒與包圍體 305
7.6.2 曲線、曲面和字元 306
7.6.3 幀快取里的裁剪操作 307
7.7 三維裁剪 307
7.8 光柵化 310
7.9 Bresenham算法 313
7.10 多邊形光柵化 315
7.10.1 內外測試法 315
7.10.2 OpenGL與凹多邊形 317
7.10.3 填充與排序 318
7.10.4 泛洪填充法 318
7.10.5 奇異性 319
7.11 隱藏面消除 319
7.11.1 景物空間和圖像空間 319
7.11.2 排序與隱藏面消除 321
7.11.3 掃描線填充算法 321
7.11.4 背面剔除 323
7.11.5 Z-Buffer算法 324
7.11.6 帶Z-Buffer算法的
掃描轉換 326
7.11.7 深度排序和畫家算法 327
7.12 反走樣 330
7.13 顯示器因素 332
7.13.1 顏色系統 332
7.13.2 顏色矩陣 335
7.13.3 γ校正 336
7.13.4 抖動技術與半色調技術 336
7.14 小結 337
7.15 補充閱讀材料 339
7.16 習題 339
第8章 離散技術 342
8.1 快取 342
8.2 數字圖像 344
8.3 快取寫操作 346
8.3.1 寫入模式 347
8.3.2 異或寫入模式 349
8.4 OpenGL的位運算與
像素運算 349
8.4.1 OpenGL快取和像素管道 350
8.4.2 點陣圖 351
8.4.3 光柵字型 352
8.4.4 像素與圖像 353
8.4.5 查找表 354
8.5 示例 356
8.5.1 Mandelbrot 集合 356
8.5.2 驗證第7章的算法 358
8.5.3 用於拾取操作的快取 359
8.6 映射方法 359
8.7 紋理映射 361
8.8 OpenGL的紋理映射 366
8.8.1 二維紋理映射 367
8.8.2 紋理採樣 369
8.8.3 紋理坐標設定 372
8.8.4 紋理對象 374
8.8.5 多紋理通道 374
8.9 紋理生成過程 375
8.10 環境貼圖 376
8.11 合成技術 380
8.11.1 不透明性與融合 381
8.11.2 圖像合成 382
8.11.3 OpenGL中的融合與
圖像合成 382
8.11.4 反走樣 383
8.11.5 從後至前繪製與從前至
後繪製 385
8.11.6 景深提示和霧效果 386
8.12 多通道繪製與累加快取 387
8.12.1 場景反走樣 388
8.12.2 凹凸貼圖和浮雕效果 388
8.12.3 圖像處理 389
8.12.4 OpenGL的圖像處理
擴展集 390
8.12.5 其他多通道方法 390
8.13 採樣與走樣 391
8.13.1 採樣理論 391
8.13.2 重構 396
8.13.3 量化 398
8.14 小結 398
8.15 補充閱讀材料 399
8.16 習題 400
第9章 可程式著色器 402
9.1 可程式流水線 402
9.2 著色語言 403
9.3 OpenGL功能擴展 405
9.3.1 OpenGL版本和擴展集 405
9.3.2 GLSL和Cg 406
9.4 OpenGL著色語言(上) 406
9.4.1 頂點著色器 406
9.4.2 片元著色器 408
9.5 OpenGL著色語言(下) 409
9.5.1 GLSL執行過程 409
9.5.2 數據類型與修飾符 410
9.5.3 運算符與函式 412
9.6 著色器連線到OpenGL程式 413
9.7 頂點移動 415
9.7.1 縮放頂點位置 415
9.7.2 漸變效果 416
9.7.3 粒子系統 417
9.8 光照作用與著色器 418
9.8.1 Phong著色 418
9.8.2 非真實感著色 421
9.9 片元著色器 422
9.10 基於頂點與基於片元的
Phong著色模型 422
9.11 採樣器 424
9.12 立方體貼圖 427
9.12.1 反射貼圖 427
9.12.2 折射 429
9.12.3 法線貼圖 432
9.13 凹凸映射 433
9.13.1 凹凸貼圖的原理 433
9.13.2 高度場與凹凸映射 435
9.13.3 凹凸映射與片元著色器 436
9.13.4 示例 437
9.14 小結 438
9.15 補充閱讀材料 439
9.16 習題 439
第10章 建模 441
10.1 圖符與實例 441
10.2 層級模型 443
10.3 機器手 445
10.4 樹與樹的遍歷 448
10.5 樹形數據結構的套用 451
10.6 動畫 455
10.7 圖形對象 456
10.7.1 方法、屬性和訊息 457
10.7.2 一個立方體對象 458
10.7.3 實現立方體對象 460
10.7.4 對象與層級結構 460
10.7.5 幾何對象 461
10.8 場景圖 462
10.9 一個簡單的場景圖形
API工具包 464
10.9.1 結點類 464
10.9.2 幾何結點 466
10.9.3 照相機類 468
10.9.4 光源和材質 468
10.9.5 變換類 470
10.9.6 機器人類 470
10.9.7 實現觀察者類 472
10.9.8 實現結點類 475
10.10 其他的樹形結構 478
10.10.1 CSG樹 479
10.10.2 BSP樹 480
10.10.3 四叉樹和八叉樹 482
10.11 圖形與網際網路 484
10.11.1 網路與協定 484
10.11.2 超媒體與HTML語言 485
10.11.3 資料庫與VRML 486
10.11.4 Java與Java小程式 487
10.12 過程建模 487
10.13 基於物理模型和粒子系統 489
10.14 牛頓粒子 490
10.14.1 獨立粒子 491
10.14.2 彈簧力 492
10.14.3 吸引力與排斥力 493
10.15 粒子系統的求解方法 495
10.16 約束 497
10.16.1 碰撞 497
10.16.2 軟約束 499
10.17 小結 500
10.18 補充閱讀材料 501
10.19 習題 501
第11章 曲線與曲面 503
11.1 曲線和曲面的表示方法 503
11.1.1 顯式表示法 503
11.1.2 隱式表示 504
11.1.3 參數形式 505
11.1.4 參數多項式曲線 507
11.1.5 參數多項式曲面 508
11.2 設計準則 509
11.3 三次多項式參數曲線 511
11.4 插值 512
11.4.1 調和函式 514
11.4.2 三次插值面片 515
11.5 Hermite曲線和曲面 517
11.5.1 Hermite形式 517
11.5.2 幾何連續和參數連續 519
11.6 Bezier曲線和曲面 521
11.6.1 Bezier曲線 521
11.6.2 Bezier曲面面片 524
11.7 三次B-樣條 525
11.7.1 三次B-樣條曲線 525
11.7.2 B-樣條與基函式 528
11.7.3 樣條曲面 529
11.8 通用的B樣條函式 530
11.8.1 B-樣條的遞歸定義 530
11.8.2 均勻樣條 531
11.8.3 非均勻B-樣條 532
11.8.4 NURBS 532
11.9 曲線和曲面的繪製 533
11.9.1 多項式求值方法 534
11.9.2 Bezier多項式的
遞歸細分 535
11.9.3 其他多項式曲線的細分
繪製法 537
11.9.4 細分Bezier曲面 538
11.10 猶他大學的茶壺模型 540
11.11 代數曲面 541
11.11.1 二次曲面 542
11.11.2 曲面的光線跟蹤
繪製方法 542
11.11.3 曲線與曲面的
細分方法 543
11.11.4 格線的細分方法 544
11.12 OpenGL里的曲線與曲面 547
11.12.1 Bezier曲線 547
11.12.2 Bezier曲面 548
11.12.3 繪製茶壺 549
11.12.4 NURBS函式 550
11.12.5 二次曲面對象 551
11.13 小結 551
11.14 補充閱讀材料 552
11.15 習題 552
第12章 高級繪製 554
12.1 超越流水線繪製 554
12.2 光線跟蹤 555
12.3 建立一個簡單的光線
跟蹤器 558
12.3.1 光線跟蹤的遞歸算法 558
12.3.2 求交計算 560
12.3.3 光線跟蹤的變異形式 563
12.4 繪製方程 563
12.5 輻射度法 566
12.5.1 輻射度方程 566
12.5.2 求解輻射度方程 568
12.5.3 形狀因子的計算方法 569
12.5.4 實現輻射度算法 571
12.6 RenderMan 572
12.7 大規模場景繪製 573
12.7.1 中排序繪製法 575
12.7.2 後排序繪製 576
12.7.3 先排序繪製 579
12.8 基於圖像的繪製 580
12.9 小結 582
12.10 補充閱讀材料 583
12.11 習題 583
附錄A 實例程式 585
附錄B 空間 645
附錄C 矩陣 654
附錄D OpenGL函式簡介 663
參考文獻 678

相關詞條

熱門詞條

聯絡我們