"What math should I learn in order to study computer graphics?" This is perhaps the most common general question that students ask me about computer graphics. The answer depends on how deeply you wish to go into the field. If you wish to begin to use off-the-shelf graphics programs then the answer is that you probably do not need to know very much math at all. If you wish to take an introductory course in computer graphics, then you should read the first two sections below for my recommendations (algebra, trigonometry and linear algebra). If you want some day to be a researcher in graphics then I believe that you should consider your mathematics education to be an ongoing process throughout your career.
If you do not particularly care for mathematics, is there still a chance of working in the field? Yes, a few areas within computer graphics are not much concerned with mathematical ideas. You should not give up on graphics just because you are not a math wizard. It is likely, however, that you will have more freedom in choosing research topics if you have a willingness to learn about new mathematical ideas.
There is no absolute answer to what mathematics is important in computer graphics. Different areas within the field require different mathematical techniques, and your own interests will likely lead you towards some topics and may never touch others. Below are descriptions of a number of areas in mathematics that I believe are useful in computer graphics. Do not feel that you need to be an expert in each of these areas to become a graphics researcher! I deliberately included many areas below to give a fairly broad view of the mathematical ideas used in graphics. Many researchers, however, will never find the need to look at some of the topics that I mention below.
Finally, although it should be clear from reading this, the opinions given within this document are entirely my own. It is likely that you would get a different list of topics or at least different emphases from other people who work in computer graphics. Now on to the list of topics.
What about the geometry that we learn in high school? It may come as a surprise, but our high school geometry is not very often needed for most tasks in computer graphics. The reason for this is that geometry as it is taught in many schools actually is a course in how to construct mathematical proofs. While proof construction is definitely a valuable intellectual tool, the actual theorems and proofs from your geometry class are not often used in computer graphics. If you go to graduate school in a mathematics related field (including computer graphics) then you may well find yourself proving theorems, but this is not necessary in order to start out in graphics.
If you have a good understanding of algebra and trigonometry then you are quite prepared to begin reading an introductory book in computer graphics. Most such books contain at least an abbreviated introduction to the next important area of mathematics for computer graphics, namely linear algebra.
Book recommendation:
Book recommendation:
Calculus is the last of the topics that I will mention that is often introduced in high school. The topics to follow are almost always found in college courses.
Book recommendation:
Book recommendation:
Book recommendation:
Book recommendation:
In physical simulation, one breaks the world down into little pieces that are represented as large vectors. Then the relations between the parts of the world are captured in the entries in matrices. Solving the matrix equations that arise is not usually done exactly, but is instead performed by carrying out a long series of calculations that yields an approximate solution as a list of numbers. This is what numerical solutions of differential equations are about. Note that the solution of matrix equations is an intimate part of numerical solutions to differential equations.
Book recommendations:
There are a few areas of mathematics that seem as though they ought to be important and yet never really play a large part in computer graphics. Perhaps the most interesting of these areas is topology. The usual one-sentence description of topology is the study of why a doughnut and a coffee cup are the same. The answer is that they are both surfaces with one hole. Here we are talking about ideas from topology. Aren't surfaces a big part of computer graphics? Yes, but it turns out that most of the ideas in topology that are useful to graphics can be learned in a first course in differential geometry. Differential geometry studies the *shapes* of surfaces, whereas topology studies things such as which parts of a surface are next to which other parts. I have seen very little topology that is put to use in graphics, and I believe that this is because much of topology is concerned with rather abstract sets, and that much of topology is far removed from the concepts in three dimensional Euclidean space that is so central to most of graphics. There are times when the formalism of topology (the symbolic notation) is a convenient way to express ideas in graphics, but the actual tools from abstract topology so seldom play a role in graphics. Study this beautiful subject for its own sake, but don't expect an immediate payoff for graphics!
I have been asked a few times whether either abstract algebra (group theory, rings, etc.) or number theory play a role in computer graphics. Not much that I have seen. These subjects, like topology, are areas that are full of beautiful ideas. Unfortunately these ideas seldom find their way into computer graphics.
Mathematics for Computer Graphics
數學在計算機圖形學中的應用
Greg Turk, August 1997
“學習計算機圖形學需要多少的數學?”這是初學者最經常問的問題。答案取決于你想在計算機圖形學領域鉆研多深。如果僅僅使用周圍唾手可得的圖形軟件,你不需要知道多少數學知識。如果想學習計算機圖形學的入門知識,我建議你讀一讀下面所寫的前兩章(代數,三角學和線性代數)。如果想成為一名圖形學的研究者,那么對數學的學習將是活到老,學到老。
如果你并不特別喜歡數學,是否仍有在計算機圖形學領域工作的機會?是的,計算機圖形學的確有一些方面不需要考慮太多的數學問題。你不應該因為數學成績不好而放棄它。不過,如果學習了更多的數學知識,似乎你將在研究課題上有更多的選擇余地。
對于在計算機圖形學中哪些數學才是重要的還沒有明確的答案。這領域里不同的方面要求掌握不同的數學知識,也許興趣將會決定了你的方向。以下介紹我認為對于計算機圖形學有用的數學。別以為想成為一名圖形學的研究者就必須精通各門數學!為了對用于圖形學的數學有一個全面的看法,我特地列出了很多方面。但是許多研究者從不需要考慮下面提到的數學。
最后,雖然讀了這篇文章后,你應該會對數學在計算機圖形學中的應用有所了解,不過這些觀點完全是我自己的。也許你應該閱讀更多的此類文章,或者至少從其他從事計算機圖形學工作的人那里了解不同的學習重點?,F在開始切入正題。
代數和三角學
對于計算機圖形學的初學者來說,高中的代數和三角學可能是最重要的數學。日復一日,我從簡單的方程解出一個或更多的根。我時常還要解決類似求一些幾何圖形邊長的簡單三角學問題。代數和三角學是計算機圖形學的最基礎的知識。
那么高中的幾何學怎么樣呢?可能讓人驚訝,不過在多數計算機圖形學里,高中的幾何學并不經常被用到。原因是許多學校教的幾何學實際上是如何建立數學證明的課程。雖然證明題對提高智力顯然是有效的,但對于計算機圖形學來說,那些與幾何課有關的定理和證明并不常被用到。如果你畢業于數學相關領域(包括計算機圖形學),就會發現雖然你在證明定理,不過這對開始學習圖形學不是必要的。
如果精通代數和三角學,就可以開始讀一本計算機圖形學的入門書了。下一個重要的用于計算機圖形學的數學——線性代數,多數此類書籍至少包含了一個對線性代數的簡要介紹。
推薦的參考書:
Computer Graphics: Principles and Practice
James Foley, Andries van Dam, Steven Feiner, John Hughes
Addison-Wesley
[雖然厚重,可是我很喜歡]
線性代數
線性代數的思想貫穿于計算機圖形學。事實上,只要牽涉到幾何數值表示法,就常常抽象出例如x,y,z坐標之類的數值,我們稱之為矢量。圖形學自始至終離不開矢量和矩陣。用矢量和矩陣來描述旋轉,平移,或者縮放是再好不過了。高中和大學都有線性代數的課程。只要想在計算機圖形學領域工作,就應該打下堅實的線性代數基礎。我剛才提到,許多圖形學的書都有關于線性代數的簡要介紹——足夠教給你圖形學的第一門課。
推薦的參考書:
Linear Algebra and Its Applications
Gilbert Strang
Academic Press
微積分學
微積分學是高級計算機圖形學的重要成分。如果打算研究圖形學,我強烈建議你應該對微積分學有初步認識。理由不僅僅是微積分學是一種很有用的工具,還有許多研究者用微積分學的術語來描述他們的問題和解決辦法。另外,在許多重要的數學領域,微積分學被作為進一步學習的前提。學習了基本代數之后,微積分學又是一種能為你打開多數計算機圖形學與后繼的數學學習之門的課程。
微積分學是我介紹的最后一個中學課程,以下提及的科目幾乎全部是大學的課程。
微分幾何學
微分幾何學研究支配光滑曲線,曲面的方程組。如果你要計算出經過某個遠離曲面的點并垂直于曲面的矢量(法向矢量)就會用到微分幾何學。讓一輛汽車以特定速度在曲線上行駛也牽涉到微分幾何學。有一種通用的繪制光滑曲面的圖形學技術,叫做“凹凸帖圖”,這個技術用到了微分幾何學。如果要著手于用曲線和曲面來創造形體(在圖形學里稱之為建模)你至少應該學習微分幾何學的基礎。
推薦的參考書:
Elementary Differential Geometry
Barrett O'Neill
Academic Press
數值方法
幾乎任何時候,我們在計算機里用近似值代替精確值來表示和操作數值,所以計算過程總是會有誤差。而且對于給定的數值問題,常常有多種解決的方法,一些方法會更塊,更精確或者對內存的需求更少。數值方法研究的對象包括“計算方法”和“科學計算”等等。這是一個很廣闊的領域,而且我將提及的其他幾門數學其實是數值方法的一些分支。這些分支包括抽樣法理論,矩陣方程組,數值微分方程組和最優化。
推薦的參考書:
Numerical Recipes in C: The Art of Scientific Computing
William Press, Saul Teukolsky, William Vetterling and Brian Flannery
Cambridge University Press
[這本參考書很有價值可是很少作為教材使用]
抽樣法理論和信號處理
在計算機圖形學里我們反復使用儲存在正規二維數組里的數字集合來表示一些對象,例如圖片和曲面。這時,我們就要用抽樣法來表示這些對象。如果要控制這些對象的品質,抽樣法理論就變得尤為重要。抽樣法應用于圖形學的常見例子是當物體被繪制在屏幕上時,它的輪廓呈現鋸齒狀的邊緣。這鋸齒狀的邊緣(被認為是“混淆”現象)是非常讓人分散注意力的,用抽樣法中著名的技術例如回旋,傅立葉變換,空間和頻率的函數表示就能把這個現象減少到最小。這些思想在圖像和音頻處理領域是同樣重要的。
推薦的參考書:
The Fourier Transform and Its Applications
Ronald N. Bracewell
McGraw Hill
矩陣方程組
計算機圖形學的許多問題要用到矩陣方程組的數值解法。一些涉及矩陣的問題包括:找出最好的位置與方向以使對象們互相匹配(最小二乘法),創建一個覆蓋所給點集的曲面,并使皺折程度最小(薄板樣條算法),還有材質模擬,例如水和衣服等。在圖形學里矩陣表述相當流行,因此在用于圖形學的數學中我對矩陣方程組的評價是很高的。
推薦的參考書:
Matrix Computations
Gene Golub and Charles Van Loan
Johns Hopkins University Press
物理學
物理學顯然不是數學的分支,它是自成一家的學科。但是在計算機圖形學的某些領域,物理學和數學是緊密聯系的。在圖形學里,牽涉物理學的問題包括光與物體的表面是怎樣互相影響的,人與動物的移動方式,水與空氣的流動。為了模擬這些自然現象,物理學的知識是必不可少的。這和解微分方程緊密聯系,我將會在下一節提到微分方程。
微分方程的數值解法
我相信對于計算機圖形學來說,解微分方程的技巧是非常重要的。像我們剛才討論的,計算機圖形學致力于模擬源于真實世界的物理系統。波浪是怎樣在水里形成的,動物是怎樣在地面上行走的,這就是兩個模擬物理系統的例子。模擬物理系統的問題經常就是怎樣解微分方程的數值解。請注意,微分方程的數值解法與微分方程的符號解法是有很大差異的。符號解法求出沒有誤差的解,而且時常只用于一些非常簡單的方程。有時大學課程里的“微分方程”只教符號解法,不過這并不會對多數計算機圖形學的問題有幫助。
在對物理系統的模擬中,我們把世界細分為許多表示成矢量的小元素。然后這些元素之間的關系就可以用矩陣來描述。雖然要處理的矩陣方程組往往沒有很精確的解,但是取而代之的是執行了一系列的計算,這些計算產生一個表示成數列的近似解。這就是微分方程的數值解法。請注意,矩陣方程的解法與微分方程數值解法的關系是很密切的。
最優化
在計算機圖形學里,我們常常為了期望的目標尋求一種合適的描述對象或者對象集的方法。例如安排燈的位置使得房間的照明看起來有種特殊的“感覺”,動畫里的人物要怎樣活動四肢才能實現一個特殊的動作,怎樣排版才不會使頁面混亂。以上這些例子可以歸結為最優化問題。十年前的計算機圖形學幾乎沒有最優化技術的文獻,不過最近這個領域越來越重視最優化理論。我認為在計算機圖形學里,最優化的重要性將會日益增加。
概率論與統計學
計算機圖形學的許多領域都要用到概率論與統計學。當研究者涉足人類學科時,他們當然需要統計學來分析數據。圖形學相關領域涉及人類學科,例如虛擬現實和人機交互(HCI)。另外,許多用計算機描繪真實世界的問題牽涉到各種未知事件的概率。兩個例子:一棵成長期的樹,它的樹枝分杈的概率;虛擬的動物如何決定它的行走路線。最后,一些解高難度方程組的技巧用了隨機數來估計方程組的解。重要的例子:蒙特卡羅方法經常用于光如何傳播的問題。以上僅是一部分在計算機圖形學里使用概率論和統計學的方法。
計算幾何學
計算幾何學研究如何用計算機高效地表示與操作幾何體。典型問題如,碰撞檢測,把多邊形分解為三角形,找出最靠近某個位置的點,這個學科包括了運算法則,數據結構和數學。圖形學的研究者,只要涉足創建形體(建模),就要大量用到計算幾何學。
推薦的參考書:
Computational Geometry in C
Joseph O'Rourke
Cambridge University Press
[大學教材]
Computational Geometry: An Introduction
Franco Preparata and Michael Shamos
Springer-Verlag
[很經典,不過有點舊了]
總結:數學應用和數學理論
對于圖形學來說,以上提到的許多數學學科都有個共同點:比起這些數學的理論價值,我們更傾向于發掘它們的應用價值。不要驚訝。圖形學的許多問題和物理學者與工程師們研究的問題是緊密聯系的,并且物理學者與工程師們使用的數學工具正是圖形學研究者們使用的。多數研究純數學理論的學科從不被用于計算機圖形學。不過這不是絕對的。請注意這些特例:分子生物學正利用節理論來研究DNA分子動力學,亞原子物理學用到了抽象群論。也許有一天,純數學理論也能推動計算機圖形學的發展,誰知道呢?
有些看來重要的數學實際上在計算機圖形學里不常被用到。可能拓撲學是此類數學中最有意思的。用一句話來形容拓撲學,它研究油炸圈餅與咖啡杯為什么在本質上是相同的。答案是他們都是只有一個洞的曲面。我們來討論一下拓撲學的思想。雖然曲面是計算機圖形學的重要成分,不過微分幾何學的課程已經涵蓋了多數對圖形學有用的拓撲學知識。微分幾何學研究曲面的造型,可是拓撲學研究曲面的相鄰關系。我覺得拓撲學對于圖形學來說幾乎沒用,這是由于拓撲學關心抽象的事物,而且拓撲學遠離了多數圖形學的核心——三維歐氏空間的概念。對于圖形學來說,拓撲學的形式(符號表示法)是表達思想的簡便方法,不過圖形學很少用到抽象拓撲學的實際工具。對圖形學來說,拓撲學像一個好看的花瓶,不過別指望它能立即帶給你回報。
有人曾經這么問我,計算機圖形學是否用到了抽象代數(群論,環,等等….)或者數論。我沒怎么遇到過。和拓撲學一樣,這些學科有很多美好的思想??墒呛懿恍遥@些思想很少用于計算機圖形學。
--The End--
[小鵬翻譯 email: rggg_clp@163.com]
開發基于OpenGL的應用程序,必須先了解OpenGL的庫函數。它采用C語言風格,提供大量的函數來進行圖形的處理和顯示。OpenGL庫函數的命名方式非常有規律。所有OpenGL函數采用了以下格式:
<庫前綴><根命令><可選的參數個數><可選的參數類型>
庫前綴有gl、glu、aux、glut、wgl、glx、agl等等,分別表示該函數屬于OpenGL那個開 發庫,從函數名后面中還可以看出需要多少個參數以及參數的類型。I代表int型,f代表float型,d代表double型,u代表無符號整型。例如 glVertex3fv()表示了該函數屬于gl庫,參數是三個float型參數指針。我們用glVertex*()
來表示這一類函數。
OpenGL函數庫相關的API有核心庫(gl)、實用庫(glu)、輔助庫(aux)、實用工具庫(glut)、窗口庫(glx、 agl、wgl)和擴展函數庫等。從圖可以看出,gl是核心,glu是對gl的部分封裝。glx、agl、wgl 是針對不同窗口系統的函數。glut是為跨平臺的OpenGL程序的工具包,比aux功能強大。擴展函數庫是硬件廠商為實現硬件更新利用OpenGL的擴 展機制開發的函數。下面逐一對這些庫進行詳細介紹。
1.OpenGL核心庫
核心庫包含有115個函數,函數名的前綴為gl。這部分函數用于常規的、核心的圖形處理。此函數由gl.dll來負責解釋執行。由于許多函數可以接收不同數以下幾類。據類型的參數,因此派生出來的函數原形多達300多個。核心庫中的函數主要可以分為以下幾類函數:
2.OpenGL實用庫The OpenGL Utility Library (GLU)
包含有43個函數,函數名的前綴為glu。OpenGL提供了強大的但是為數不多的繪圖命令,所有較復雜的繪圖都必須從點、線、面開始。Glu 為了減輕繁重的編程工作,封裝了OpenGL函數,Glu函數通過調用核心庫的函數,為開發者提供相對簡單的用法,實現一些較為復雜的操作。此函數由 glu.dll來負責解釋執行。OpenGL中的核心庫和實用庫可以在所有的OpenGL平臺上運行。主要包括了以下幾種:
3.OpenGL輔助庫
包含有31個函數,函數名前綴為aux。這部分函數提供窗口管理、輸入輸出處理以及繪制一些簡單三維物體。此函數由glaux.dll來負責解釋執行。 創建aux庫是為了學習和編寫OpenGL程序,它更像是一個用于測試創意的預備基礎接管。Aux庫在windows實現有很多錯誤,因此很容易導致頻繁 的崩潰。在跨平臺的編程實例和演示中,aux很大程度上已經被glut庫取代。OpenGL中的輔助庫不能在所有的OpenGL平臺上運行。
輔助庫函數主要包括以下幾類:
4.OpenGL工具庫 OpenGL Utility Toolkit
包含大約30多個函數,函數名前綴為glut。glut是不依賴于窗口平臺的OpenGL工具包,由Mark KLilgrad在SGI編寫(現在在Nvidia),目的是隱藏不同窗口平臺API的復雜度。 函數以glut開頭,它們作為aux庫功能更強的替代品,提供更為復雜的繪制功能,此函數由glut.dll來負責解釋執行。由于glut中的窗口管理函 數是不依賴于運行環境的,因此OpenGL中的工具庫可以在X-Window, Windows NT, OS/2等系統下運行,特別適合于開發不需要復雜界面的OpenGL示例程序。對于有經驗的程序員來說,一般先用glut理順3D圖形代碼,然后再集成為 完整的應用程序。
這部分函數主要包括:
5.Windows專用庫
針對windows平臺的擴展,包含有16個函數,函數名前綴為wgl。這部分函數主要用于連接OpenGL和Windows ,以彌補OpenGL在文本方面的不足。 Windows專用庫只能用于Windows環境中。
這類函數主要包括以下幾類:
6.Win32 API函數庫
包含有6個函數,函數名無專用前綴,是win32擴展函數。這部分函數主要用于處理像素存儲格式和雙幀緩存;這6個函數將替換Windows GDI中原有的同樣的函數。Win32API函數庫只能用于Windows 95/98/NT環境中。
7.X窗口專用庫
是針對Unix和Linux的擴展函數。包括渲染上下文、繪制圖元、顯示列表、紋理貼圖等;
8.其他擴展庫
這些函數可能是新的OpenGL函數,并沒有在標準OpenGL庫中實現,或者它們是用來擴展已存在的OpenGL函數的功能。和glu、glx和 wgl一樣,這些OpenGL擴展是由硬件廠商和廠商組織開發的。OpenGL擴展(OpenGL Extention)包含了大量的擴展API函數。
隨著硬件的更新,硬件廠商首先向SGI申請登記新的擴展,編寫規格說明書(specification)。然后按照說明書進行開發擴展程序。不同的 OpenGL實現(OpenGL Implementation)支持的擴展可能不一樣,只有隨著某一擴展的推廣與應用以及硬件技術的提高該擴展才會在所有的OpenGL實現中被給予支 持,從而最終成為OpenGL標準庫的一部分。擴展由SGI維護,在SGI網站上列出了目前公開的已注冊的擴展及其官方說明書。擴展源由擴展函數的后綴來 指明(或使用擴展常量后綴)。例如,后綴WIN表明一個符合Windows規范的擴展,EXT或ARB后綴表明該擴展由多個賣主定義。
下面給出OpenGL官方規定的命名規則:
由于OpenGL擴展在針對不同平臺和不同驅動,OpenGL不可能把所有的接口程序全部放到gl.h、glx.h、wgl.h中,而是將這些函數頭放在了glext.h、glxext.h和wglext.h中。這些擴展被看作時OpenGL核心庫規范的增加和修改。
【引言】
什么是計算機圖形學? 本文盡量避免給它做嚴格的定義,但是通常來說,計算機圖形學是數字圖象處理的逆過程,這只是一個不確切的定義,后面我們會看到,實際上,計算機圖形學、數字圖象處理和計算機視覺在很多地方的區別不是非常清晰的,很多概念是相通的。
計算機圖形學是用計算機來畫東西的學科,數字圖象處理是把外界獲得的圖象用計算機進行處理的學科。在法國,圖形圖象是一門課程。
如何學習計算機圖形學呢?除了計算機圖形學的基礎知識以外,你還需要有以下的知識,你懂的越多,當然做的越好。
* 英語, 你一定要把英語學好,如果你想學習計算機圖形學的話,盡量看英文的書籍和資料
* 數學, 計算機圖形學里面的數學用的比較多,,我們可以列舉一些常用的:
高等數學,數值分析,微分幾何,拓撲,概率, 插值理論,(偏)微分方程…
* 物理, 如果你要進行基于物理的建模,一些物理理論是要學習的:
力學(運動學,動力學,流體力學…),光學,有限元…
* 編程語言: C或C++是計算機圖形學最通用的‘普通話’,
* 數據結構: 你需要數據結構來描述你的圖形對象,除了通用的鏈表、樹等數據結構外,圖形學還有自己特殊的數據結構
* 其他類別: 有的時候你需要其他學科的知識,根據你的需要去學習吧
上面列舉的不是你必須學習的東西,而是計算機圖形學可能會用到的東西,一定要記住,不要指望通過一本教材就學會計算機圖形學,它比你想象的要復雜的多。
【圖形學的問題】
每個學科都有自己學科的特定問題,圖形學要解決的是如何畫出圖來,得到需要的效果,當然這是圖形學最大的一個問題。
在開始學習計算機圖形學的時候,找一本簡單的書看,對計算機圖形學有個大概的認識,你就可以開始圖形學之旅了:
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大部分:建模和渲染
(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) 渲染
有了模型,怎么把這個幾何模型畫出來呢?這個步驟就是渲染。
如
果你看了上面的OpenGL的書,那么你就知道一些渲染的知識了,但是別高興的太早,OpenGL使用的是局部光照模型(Local
Illumination Model)。Local illumination
Model指的是在做渲染的時候只考慮光源和物體之間的相互作用,不考慮物體和物體之間的影響,所以OpenGL不支持陰影,一個(半)透明物體的效果,
這些需要考慮物體之間的影響才可以實現。
(*OpenGL本身不支持,但是通過一些方法可以實現的,用Google搜索一下
Shadow Volume, OpenGL就找到答案。)
Global Illumination Model 這類模型考慮的就比較全?,F在關于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變成實際可用。
Francois X. Sillion的Radiosity and Global Illumination , Sillion是法國人,他的主要研究方向是Radiosity,這本書寫的很不錯的,非常清晰。
Philip Dutre 的新書Advanced Global Illumination ,看起來還不錯,剛拿到手,還沒看,呵呵,所以不好評價。
Ian Ashdown的Radiosity: A Programmer's Perspective
有源代碼的書??!
Photon mapping
這個我也不知道怎么翻譯,呵呵。這個技術出現的比較晚,一本好書!
Henrik Wann Jensen的Realistic Image Synthesis Using Photon Mapping
Henrik Wann Jensen是Photon mapping技術的發明者
【非真實性圖形學】(Non-Photorealistic Graphics)
真實性不是計算機圖形學的唯一要求,比如:你給我畫一個卡通效果的圖出來,或者我要用計算機畫水彩畫怎么辦?或者:把圖象用文字拼出來怎么做?,解決這些問題要用到非真實性圖形學, 好書繼續推薦!
Bruce Gooch, Amy Ashurst Gooch的 Non-Photorealistic Rendering
【體圖形學】(Volume Graphics)
用CT機做很多切片(比如頭骨),那么能通過這些切片得到3D的頭骨嗎?Volume Graphics就是解決這樣的問題的
Min Chen 編著的Volume Graphics
上面的2個圖形學技術就和圖象的界限不明顯了,實際上他們是圖形圖象的綜合。
【其他的書】
還有一些好書啊,呵呵,好書看不完的,繼續放送:
Graphics Gems I ~ V,一大幫子人寫的書,包括研究人員,程序員…有計算機圖形學的各種數據結構,編程技巧。
Tomas Akenine-Moller 等人編著的Real-Time Rendering (2nd Edition)
許多最新的計算機圖形學進展。
David Ebert等人的Texturing & Modeling: A Procedural Approach, Third Edition
講述如何通過程序實現紋理、山、地形等圖形學要素。
關于圖形學的特定對象,有特定的專題圖書,
Evan Pipho Focus On 3D Models,對于圖形學的常用模型格式,進行了講解
Trent Polack的 Focus On 3D Terrain Programming ,講地形的
Donald H. House 的Cloth Modeling and Animation ,講布料的
Nik Lever的Real-time 3D Character Animation with Visual C++ ,講角色動畫的
Richard Parent的 Computer Animation: Algorithms and Techniques,當然是講動畫的啦,呵呵。
David H. Eberly的3D Game Engine Design : A Practical Approach to Real-Time Computer Graphics ,有代碼的?。『呛牵海?
最后,沒事情的時候,看看下面的書吧
Alan H. Watt, 3D Computer Graphics (3rd Edition)
James D. Foley等人的 Computer Graphics: Principles and Practice in C (2nd Edition) ,這本圣經沒事的時候再看吧,呵呵。
累了:( 不說了,上面的書差不多了,還有一些shader的書,我不了解,以后會補上的:)
4. 資源
從哪里找到這些書???還有什么資源???
我保證,上面的書在www.amazon.com 都可以買到:) 別打我
那好,大部分的書在國家圖書館可以復印到,北京的兄弟有福啦,3年前的書借出來復印,1角/頁,但是新書要早圖書館里復印,5~6角/頁,還是比Amazon便宜啊,呵呵。
不行大家就到國外買,合買吧,還負擔的起。
我對DirectX不了解,所以沒有涉及關于DirectX的內容:)
一個圖形愛好者的書架.-也來介紹一下我的藏書.
早幾天看到有人把自己在大學四年的書列了出來.招來一頓懷疑.我是開發圖形程序的.我現在也把我的書列出來.不怕大家懷疑吧.希望能有點啟示作用.
綠色的是我看完了的。紅色的是沒怎么看的。黃色的是看了一半以上的。
首先是基礎部分:
語言類:
C++ Programming Language (Special Edition). C++的圣經級別的書.我只看原文的。不看翻譯的.對球教授的翻譯表示一定的保留意見.
Effictive/More Effictive C++. 工程實踐的最佳經驗書籍.
Inside C++ Object Model .好書.看完了。你對C++的理解會變的很深刻的。
設計模式 .好書.買了看就是了。別問我為什么啊。
More Excpetion C++ 和Effective C++有同工之處.
STL 源代碼破析 。正在看的過程中。不過最近最Loki Boost的興趣大點。
STL 中文版 一本參考手冊。
Moden C++ Design 看完了這本書。我估計會吐血。但是還是要看。經典啊,書的例子Loki的代碼
C++自學通 ,我入門的書 。不過現在已經找不到了。
潭浩強的C程序設計 。經典。C教材里這本最好。不許大家B4他。
C++Template : 有人說翻譯的不好。我覺得還可以.
Python 語言入門 。我拿來做游戲腳本用的。
Unix Shell編程 。
算法和基礎類。
程序設計實踐 給你一個很好的經驗.很薄的,去買來看看。
C++分形程序設計 。當年給一個JJ做畢業設計?;税雮€月看完的。
數據結構(C++語言描述) 影印版。好書,但是沒看完。教材來著的。
數據結構(用面向對象方法與C++描述)。 清華出的??赐炅恕?br> 人工智能 Nilson的書??床欢?。呵呵。
開發工具和平臺的書
Unix 環境高級編程 : 學Unix編程.就從這里開始吧.現在在看X-Window編程.可惜沒有介紹XLib的書.因為要用OpenGL.最好還是從XLib開始.痛苦.只能看Xlib.pdf
Unix 高級編程 : 我真不相信我能檢到這么一本好書.想買.但是沒錢.呵呵。檢一本.不錯.
VC++技術內幕 ,翻譯的好爛啊。不過當時我不知道。最后還是看完了。
Windows下的C語言編程 。我的 Win32入門書籍。
Win32程序員指南 ,我的Win32提高書籍。10塊一本。呵呵。
Windows 核心編程 ??赐炅诉@個。大家說我是個高手了。
深入淺出MFC . 看了一半后,我自己去看MFC的代碼了.
ATL 開發人員指南 沒怎么看.很實用的樣子.
COM 本質論 ?。赐炅舜箝L見識,我就是看了他后,才知道接口的概念的.
ATL 本質論 ,看了后讓我模板水平有不少提高.
Linux內核編程 沒什么好說的。
X86的體系結構和匯編 :忘記了具體名字了。大概 是這個名字.我的匯編知識都是從這里來的。只看了前面的部分
匯編語言程序設 計: 錢曉捷主編.有介紹SSE和MMX的。很不錯哦。 也很便宜
應用程序調試技巧 : 很經典的調試書.Numega公司的工程師寫的.(出品SoftICE的那個公司).有些技巧只能用神奇來形容.
專業的圖形書
圖形開發人員指南 著名的黑皮書.我是懷著崇拜的心情收藏這本書的。John Carmack做的序.Micheal Abrash的書.偶像啊。
計算機圖形學 (清華大學)。爛書。不過也差不多看完了。現在在一個 MM手里。
圖形學 (電子工業出版社)老外的書。不錯。正在看。
計算機圖形學算法基礎 :經典。沒看完。看了1/3了。翻了一遍。
計算機真實感圖形的算法基礎 。國內最好的圖形學的書。剛拿到。正在看。
非真實感計算機圖形學 : 剛買到的.不是太有用。太學術了。
游戲編程精粹 1/2/3. 中文版 。偶爾翻一兩篇不錯的。不過我要對著英文的看才看的懂。
OpenGL Red Book .中文版還可以.非讀不可.
OpenGL 超級寶典 比較好.很實用,對初學者很好.
3D Games Vol1 . 就是介紹Fly 3D 的書??戳艘话肓?。很不錯。
Real-Time Rendering 1 . 正在看。很好的書
Real-Time Rendering 2 : 中文版和英文版都有:
CG 教程 : 推薦你學好圖形學后再來看.
OpenGL Shading Languge : 看了前面的大半了。
GPU Gems : 剛買到的.花了我350大元.不過好看.
3D Math Primer For Computer Graphics and 3D Games . 數學書里就這本好一點了。
3D Game Engine Design 正在看。對著書寫自己的物理引擎。
ShaderX 2 Tricks . 沒看。剛拿到。經典到不用介紹的程度了。
還有其他打印的資料無數 :-)