關於電腦圖形學的學習
注意:
本文盡量避免理論化的描述,試圖用最通俗的語言介紹一下電腦圖形學的學習,以及一些參考書目和網路資源;
本文不涉及對概念的定義,以免陷入學術討論之中
本文是作者學習電腦圖形學的體會,如果有不同的意見,請不要攻擊和漫罵
本文合適的題目應當是:白話說學電腦圖形學?
1. 引言
什麼是電腦圖形學? 本文盡量避免給它做嚴格的定義,但是通常來說,電腦圖形學是數字圖象處理的逆過程,這隻是一個不確切的定義,後面我們會看到,實際上,電腦圖形學、數字圖象處理和電腦視覺在很多地方的區別不是非常清晰的,很多概念是相通的。
電腦圖形學是用電腦來畫東西的學科,數字圖象處理是把外界獲得的圖象用電腦進行處理的學科。在法國,圖形圖象是一門課程。
如何學習電腦圖形學呢?除了電腦圖形學的基礎知識以外,你還需要有以下的知識,你懂的越多,當然做的越好。
* 英語, 你一定要把英語學好,如果你想學習電腦圖形學的話,盡量看英文的書籍和資料
* 數學, 電腦圖形學裡面的數學用的比較多,,我們可以列舉一些常用的:
高等數學,數值分析,微分幾何,拓撲,機率, 插值理論,(偏)微分方程…
* 物理, 如果你要進行基於物理的建模,一些物理理論是要學習的:
力學(運動學,動力學,流體力學…),光學,有限元…
* 程式設計語言: C或C++是電腦圖形學最通用的‘普通話’,
* 資料結構: 你需要資料結構來描述你的繪圖物件,除了通用的鏈表、樹等資料結構外,圖形學還有自己特殊的資料結構
* 其他類別: 有的時候你需要其他學科的知識,根據你的需要去學習吧
上面列舉的不是你必須學習的東西,而是電腦圖形學可能會用到的東西,一定要記住,不要指望通過一本教材就學會電腦圖形學,它比你想象的要複雜的多。
2. 圖形學的問題
每個學科都有自己學科的特定問題,圖形學要解決的是如何畫出圖來,得到需要的效果,當然這是圖形學最大的一個問題。
在開始學習電腦圖形學的時候,找一本簡單的書看,對電腦圖形學有個大概的認識,你就可以開始圖形學之旅了:
OpenGL Programming Guide: The Official Guide to Learning OpenGL, Version 1.4, Fourth Edition
OpenGL SuperBible (3rd Edition)
是比較好的學習電腦圖形學的入門教材,在練中去學,一開始就去啃
Foley的
Computer Graphics: Principles and Practice, Second Edition in C
不是好主意,會看的一頭霧水,一本什麼都講的書的結果往往是什麼都沒講清楚。
當你把OpenGL的基本內容掌握之後,你對圖形學就有了大概的瞭解了
那麼下面你可以來學習一下電腦圖形學的資料結構和演算法,下面的書比較適合
Joseph O'Rourke 的Computational Geometry in C,書裡面有C的原始碼,講述簡單,清晰,適合程式員學習
總的來說,電腦圖形學涉及到2大部分:建模和渲染
2.1建模
你想畫一個東西,首先要有它的幾何模型,那麼這個幾何模型從什麼地方來呢?下面的書很不錯的:
Gerald Farin 的Curves and Surfaces for CAGD: A Practical Guide
這本書就有一點的難度了,呵呵,要努力看啊
這本書算是CAGD (電腦輔助幾何設計)的經典圖書,CAGD方面的全貌,還有2本很好的講述曲面的書Bezier和Nurbs的書
Les A. Piegl, Wayne Tiller 的The Nurbs Book
書裡面有NURBS曲線、曲面的程式虛擬碼,很容易改成C的,書講的通俗、易懂,但是你要有耐心看的:)
曲線與曲面的數學
這本書是法國人寫的中文翻譯版,裡面還有Bezie本人寫的序J,翻譯的很不錯的,看了你就掌握Bezier曲面技術了
//另外一些你想知道的事情:其他的造型方式-開始
注意:在後面會有這樣的章節,標明
//另外一些你想知道的事情:其他的造型方式-開始
//另外一些你想知道的事情:其他的造型方式-結束
裡面是我認為的一些進階話題,跳過他們不影響你學習電腦圖形學,但是要學好就要注意了,呵呵
還有其他的一些造型技術,比如:
隱式曲面(Implicit Surface)的造型:
就是用函數形式為F( x ,y ,z ) = 0的曲面進行造型,這樣的造型技術適合描述動物器官一樣的肉乎乎的東西,有2本書推薦大家
Jules Bloomenthal編輯的Introduction to Implicit Surfaces,是一本專著,講述了Implicit Surface建模型(Modeling),面片化(Polygonization),渲染(Rendering)的問題
Luiz Velho 的 Implicit Objects Computer Graphics 也是一本專著,講述個更新的一些進展
細分曲面(Subdivision Surface)造型
當用NURBS做造型的時候,曲面拼接是複雜的問題,在動畫的時候,可能產生撕裂或者褶皺,Subdivision Surface用來解決這個問題
Joe Warren的Subdivision Methods for Geometric Design: A Constructive Approach就是這方面的專著
從實際物體中得到造型,現在的技術可以用三維掃描器得到物體表面的點,然後根據這些點把物體的表面計算出來,稱為重建(Reconstruction),因為這些技術之在文章中論述,所以我們省略對它的描述
//另外一些你想知道的事情:其他的造型方式-結束
下面還是一個進階話題:)
//另外一些你想知道的事情:光有造型是不夠的!-開始
在你的幾何模型做好之後,有一些問題需要對這個模型進一步處理,得到適合的模型,當面片很多的時候,或者模型很複雜的時候,需要對幾何模型進行簡化,才可以滿足一些即時繪製的需要,這個技術叫做層次細節(LOD-Level of Detail)。下面的書就是講這個的:
David Luebke編著的 Level of Detail for 3D Graphics
//另外一些你想知道的事情:光有造型是不夠的!-結束
2.2渲染
有了模型,怎麼把這個幾何模型畫出來呢?這個步驟就是渲染啦
如果你看了上面的OpenGL的書,那麼你就知道一些渲染的知識了,但是別高興的太早,OpenGL使用的是局部光照模型(Local Illumination Model),不要被這個詞嚇住了
Local illumination Model指的是在做渲染的時候只考慮光源和物體之間的相互作用,不考慮物體和物體之間的影響,所以OpenGL不支援陰影,一個(半)透明物體的效果..,這些需要考慮物體之間的影響才可以實現。
//另外一些你想知道的事情:OpenGL可以實現陰影-開始
OpenGL本身不支援,但是通過一些方法可以實現的:),用Google搜尋一下
Shadow Volume, OpenGL就找到答案啦
//另外一些你想知道的事情:OpenGL可以實現陰影-結束
Global Illumination Model 這類模型考慮的就比較全啦。現在關於Global Illumination的技術有3大類,具體的技術就不在這裡介紹了,如果想瞭解,可以聯絡我,大家一起討論:
光線追蹤(Ray Tracing)
關於Ray Tracing的好書有2本:
Andrew Glassner 的An Introduction to Ray tracing
Glasser是圖形界的名人,這本書也是Ray Tracing的經典
R. Keith Morley, Peter Shirley 的Realistic Ray Tracing, Second Edition
這本書第一版是虛擬碼,第二版是C代碼。它的結構不是很清楚,虎頭蛇尾的感覺。
輻射度(Radiosity)
關於Radiosity的好書有4本:
Michael Cohen 的Radiosity and Realistic Image Synthesis , Cohen獲得SIGGRAPH 1998電腦圖形學成就獎,他把Radiosity變成實際可用,現在Cohen在MSR圖形<img align=absmiddle src=images/url.gif><a target=_blank href=http://research.microsoft.com/~cohen/CohenSmallBW2.jpg>http://research.microsoft.com/~cohen/CohenSmallBW2.jpg</a>
Francois X. Sillion的Radiosity and Global Illumination , Sillion是法國人,他的主要研究方向是Radiosity,這本書寫的很不錯的,非常清晰
Philip Dutre 的新書Advanced Global Illumination ,看起來還不錯,剛拿到手,還沒看,呵呵,所以不好評價
Ian Ashdown的Radiosity: A Programmer's Perspective
有原始碼的書啊!! 就憑這個,得給5*****
Photon mapping
這個我也不知道怎麼翻譯,呵呵。這個技術出現的比較晚,一本好書!
Henrik Wann Jensen的Realistic Image Synthesis Using Photon Mapping
Henrik Wann Jensen是Photon mapping技術的發明者