1. 程式人生 > >圖形學入門

圖形學入門

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

               

轉載自http://www.cppblog.com/lai3d/archive/2008/12/30/70796.htmltemp_span3D圖形學的學習策略 

感謝七星重劍 from http://www.cppblog.com/

 

以我現在的水平觀之,3D圖形學分3大塊的學習內容:
  a.
空間幾何數學:    空間幾何變換加速演算法多邊形技術曲線和曲面相交測試碰撞測試。
  b.
光照著色系統:    光照紋理貼圖高階象素著色光照藝術性渲染.
  c.
程式技術性應用公告板精靈天空盒體繪製材質系統場景圖渲染佇列.
   

2.在實際學習過程中,3個部分相互制約,故不能單方面突進,應保持一種平衡發展,使得相互促進,深化理解,達到比較流暢的學習曲線.
3.相對重要性以a,b,c序減(時間將無情淘汰現有的程式技術性應用),深刻掌握圖形學基礎才是王道。
4.3個部分都略有小成後,大量快速閱讀網上各方面的雜家資料,應用基礎知識去分析理解,在短時間內掌握各種程式性技巧。
5.再次通觀全域性基礎,遍覽所有細節,以圖有更深的理解.

如何學習API (OpenGL/Direct3D)

    最近很多人在問,我該如何學習OpenGL?我學完了OpenGL了,該怎麼用?我想在回答這些類似的問題以前先和大家談談怎麼學習

API的方法,或許談完了,我就不需要回答了。 
     
  
首先,我認為API是工具,不是本質,OpenGL/Direct3D的本質是圖形學,而不是OpenGL/Direct3D的本身,API的本身只是一些Interface而已.如果你明白圖形學的原理.那麼你很容易這些介面的作用,以及為什麼要有這些介面的存在.所以,我要說的第一點是:你要學習3D程式設計,不是學會了OpenGL/Direct3D就可以了。甚至會不會這些API都不是那麼的重要(雖然這麼說,或許很多人不太贊同).最重要的,最根本的是,你要明白這些API背後的圖形學的原理---因為那才是根本中的根本.
   
  
下面我來介紹我對API學習的看法.

   我認為API的學習有兩種方法:一是正向學習.二是反向學習.
    
  
:正向學習,所謂的正向學習,就是學習API的本身.我覺得這種方法是一種Brute Force行為.不是很好.我們只要看看API的特性,有那些部分.就可以了。比如學習Direct3D的時候,我們要知道它如何初始化,以及它和作業系統的結合.它在Direct3D8裡引入了VS/PS.最後就是建立一個Direct3D應用的步驟和方法.這些就足夠了。要不然.Direct3D那麼多的函式,一個幾十個引數。每一個都會要了我的命.
    
  
正向學習的第二個作用就是你在熟悉了圖形學和大概瞭解了API,有空就來看看API的細節,然後思索一下API裡提供的一些特性對你的程式有什麼作用.比如Direct3D裡的Two Side Stencil.OpenGL裡的TextureCombine等。

   :逆向學習.這是根本的方法,到了這一步,你就可以真正的算是圖形學入門了。這要求你要有一定的圖形學基礎.比如,你現在開始做一個demo.你預計你的demo裡有一堆眩眩的效果,當然你也要明白你的這些眩眩的效果要怎麼實現的.然後你去找API裡對應的功能,我想如果你的想法正常,一般的功能在Direct3D/OpenGL裡應該都會有的.當然你也會碰到你想要的功能在這些API裡沒有,但是這不重要,重要的是你又學到新東西了---這個特性在XX API裡不支援^_^.

    通常我是採用先正向,再逆向,同時再進行正向學習的方法.希望以上的建議,對各位初學者有一定的幫助.


 

關於計算機圖形學的學習 原創 FatGarfield

關於計算機圖形學的學習
注意:
本文儘量避免理論化的描述,試圖用最通俗的語言介紹一下計算機圖形學的學習,以及一些參考書目和網路資源;
本文不涉及對概念的定義,以免陷入學術討論之中
本文是作者學習計算機圖形學的體會,如果有不同的意見,請不要攻擊和漫罵

本文合適的題目應當是:白話說學計算機圖形學?

1
 引言
 什麼是計算機圖形學? 本文儘量避免給它做嚴格的定義,但是通常來說,計算機圖形學是數字圖象處理的逆過程,這只是一個不確切的定義,後面我們會看到,實際上,計算機圖形學、數字圖象處理和計算機視覺在很多地方的區別不是非常清晰的,很多概念是相通的。
 計算機圖形學是用計算機來畫東西的學科,數字圖象處理是把外界獲得的圖象用計算機進行處理的學科。在法國,圖形圖象是一門課程。
 如何學習計算機圖形學呢?除了計算機圖形學的基礎知識以外,你還需要有以下的知識,你懂的越多,當然做的越好。
英語, 你一定要把英語學好,如果你想學習計算機圖形學的話,儘量看英文的書籍和資料
數學, 計算機圖形學裡面的數學用的比較多,,我們可以列舉一些常用的:
高等數學,數值分析,微分幾何,拓撲,概率, 插值理論,(偏)微分方程
物理, 如果你要進行基於物理的建模,一些物理理論是要學習的:
力學(運動學,動力學,流體力學),光學,有限元
程式語言: CC++是計算機圖形學最通用的普通話
資料結構: 你需要資料結構來描述你的圖形物件,除了通用的連結串列、樹等資料結構外,圖形學還有自己特殊的資料結構
其他類別: 有的時候你需要其他學科的知識,根據你的需要去學習吧

上面列舉的不是你必須學習的東西,而是計算機圖形學可能會用到的東西,一定要記住,不要指望通過一本教材就學會計算機圖形學,它比你想象的要複雜的多。

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本很好的講述曲面的書BezierNurbs的書

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變成實際可用,現在CohenMSR圖形 http://research.microsoft.com/~cohen/CohenSmallBW2.jpg

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技術的發明者

3.3
這些也是圖形學嗎? 圖形和圖象的區別模糊了:(
除了上面講的經典的計算機圖形學,還有下面的一些東西,它們也叫計算機圖形學嗎?是的!!!
3.3.1
非真實性圖形學(Non-Photorealistic Graphics
真實性不是計算機圖形學的唯一要求,比如:你給我畫一個卡通效果的圖出來,或者我要用計算機畫水彩畫怎麼辦?或者:把圖象用文字拼出來怎麼做?,解決這些問題要用到非真實性圖形學, 好書繼續推薦!!!
Bruce Gooch, Amy Ashurst Gooch
 Non-Photorealistic Rendering 

3.3.2
體圖形學(Volume Graphics)
CT機做很多切片(比如頭骨),那麼能通過這些切片得到3D的頭骨嗎?Volume Graphics就是解決這樣的問題的
Min Chen 
編著的Volume Graphics 

上面的2個圖形學技術就和圖象的界限不明顯了,實際上他們是圖形圖象的綜合


4 .
還有其他的書嗎?
還有一些好書啊,呵呵,好書看不完的:),繼續放送:

Graphics Gems I ~ V
,一大幫子人寫的書,包括研究人員,程式設計師
有計算機圖形學的各種資料結構,程式設計技巧

Tomas Akenine-Moller 
等人編著的Real-Time Rendering (2nd Edition) 
許多最新的計算機圖形學進展

David Ebert
等人的Texturing & Modeling: A Procedural Approach, Third Edition 
講述如何通過程式實現紋理、山、地形等圖形學要素
F. Kenton Musgrave
號稱分形狂(Fractal Mania)
Ken Perlin
就是Perlin噪聲的發明者,用過3d軟體的人對Perlin Noise不會陌生的

關於圖形學的特定物件,有特定的專題圖書,
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的書,我不瞭解,以後會補上的:)

5.
從哪裡找到這些書啊?還有什麼資源啊?
我保證,上面的書在www.amazon.com 都可以買到:) 別打我

那好,大部分的書在國家圖書館可以影印到,北京的兄弟有福啦,3年前的書借出來影印,1/頁,但是新書要早圖書館裡影印,5~6/頁,還是比Amazon便宜啊,呵呵。

不行大家就到國外買,合買吧,還負擔的起。
我對DirectX不瞭解,所以沒有涉及關於DirectX的內容:)


遊戲程式設計師養成計劃 【重劍注:clayman寫的這個很贊】

 

        與玩遊戲相比,寫遊戲要複雜上千萬倍,除了需要掌握通用的程式設計技巧以外,還要有相當的圖形學,物理,數學基礎,特別是在國內,由於相關資料的缺乏,更是讓初學者無從下手。下面總結了一些入門方法和比較容易入手的資料。

         首先你要精通一門高階語言,比如C++或者C#,其次,要有良好的英文閱讀能力。對遊戲開發者來說英文閱讀能力是最重要也是最基本的工具之一,因為你遇到的大部分資源都將是英文的,不要總等著別人為你翻譯。慢慢嘗試著閱讀英文資料,你會發現其實也並沒有那麼難:)

         剛開始,你要做的就是選擇一門圖形API,一般就是DirectX或者OpenGL之間選一個。如果考慮到跨平臺,那麼OGL是首選. 如果只在ms的平臺,則DX是首選。我對OGL並不是很瞭解,所以下面大部門資料都是和DX相關的。

         當然,作為準備工作之一,你首先要到DirectX Develop Center下載最新版的DirectX SDK

         入門書籍非常重要,推薦<<Introduction to 3D Game Programming with DirectX 9.0>>(好像去年出了中文版)也就是傳說中的龍書,這可以說是最好的DX入門教材,Frank Luna從淺入深,討論了DX的方方面面。另外再配上<< Advanced 3D Game Programming With DirectX 9.0>>,書名雖然是advanced,但實際上沒有多少advanced級別的內容。看完這兩本書,你基本上已經對DirectX比較熟悉了。如果你希望學習XNA,也是一樣的,畢竟XNA是以DX為基礎。

         不要一開始就看圖形學的書,這個時候你對圖形程式設計還沒有一個基本的感性認識,因此八成看的雲裡霧裡。不要以網上的教程和論壇提問作為主要學習途徑,找一本好書,系統學習,效率才最高。不要馬上看SDK裡的例子,很多圖形學的基本原理僅僅通過讀程式碼是不會明白的。某些年代太過久遠的書就不要看了,比如《windows遊戲程式設計大師技巧》(總看到有人在找這本書)。有人說基本的思想總是不變的,可惜對於現代GPU來說,很多早期的技術和優化技巧早就過時了。圖形程式設計是發展的非常快的技術,看看GPU的發展速度,1~2年就是一代產品的革新。

          好了,入門之後,是你鞏固和拓展視野的階段。現在看計算機圖形學就比較合適了。吐血推薦<<Real-Time-Rendering>>,z這本書算得上是所有圖形程式設計師的必讀書籍和參考手冊了。最近剛出了第三版。可惜國內只有第二版,稍微有點老,如果實在找不到第三版,還是值得一讀。國內其他所有以圖形學命名的書都有一個共同點:枯燥,過時。只需看看其中二維三維變換和曲線曲面表示的部分即可。如果這個時候發現你當年數學沒有學好,那麼有三本數學書是為遊戲程式設計師量身定製的:<<3D Math Primer for Graphics and Game Development>>, <<Mathematics for 3D Game Programming and Computer Graphics>><<Essential Mathematics Guide 2nd Edition>>,第一本書有中文版,最後一本則是08年才出的新書。

         其實入門之後,就沒有固定的學習路線了,最好根據你感興趣的方向來學習。

Shader方面:《Cg_tutorial》和《The Complete Effect and HLSL Guide》都是不錯的入門材料,當然還有SDK文件。<<Shaders for Game Programmers and Artists>>有大量入門的例子。<<Advanced Lighting And Materials With Shaders>>詳細介紹了各種光照模型和技術。<<GPU Gems>> 1~3冊肯定是必讀的,雖然有12有中文版,但某些翻譯並不是很理想,強烈建議直接看英文版。ShaderX系列也是很經典的系列,每年出版一本,包含了最新的實時渲染技術,如今已經出了第6冊了。不過網路上只能找到1~3冊。12冊大部分shader都是用asm寫的,不過看懂原理,轉換為HLSL也並不難。另外Nvidia SDKATI SDK也是學習shader的重要資源。最後還有剛出的<< Programming Vertex, Geometry, and Pixel Shaders>>

地形:<<Real Time 3D Terrain Engines Using C++ And DX9>>非常全面的討論了關於地形渲染的各種技術,至少應該把第5~9章都瀏覽一遍。之後便可以 virtual terrain查閱近期的地形渲染技術。

模型匯入和動畫:<<Advanced Animation with DirectX>>,僅此一本足以。

物理:<<Game Physics>><<Game Physics Engine Development>>都不錯。<<Real-time Collision Detection>>是碰撞檢測方面最好的書,可惜目前還沒有電子版。

LOD<<Level of Detail for 3D Graphics>>

Ray tracing:<< Physical-Based Rendering - From Theory to Implementation>>

引擎設計:說實話,這方面還沒有特別好的書,大概越是核心的內容,越少有人願意寫吧。<<3D Game Engine Architecture Engineering Real-Time Applications with Wild Magic>>只有第三章值得一讀。<<3D Game Engine Programming>>可以選部分感興趣的章節看看,不過總的來說,講的比較淺。

AI<<Programming Game AI by Example>>非常不錯,好像還有中文版,備選<<Artificial Intelligence for Games>>。當然<<AI Programming Wisdom>>系列也是必讀作品,不過目前網路上只有12冊。

網路:%##@%...(本人是網路白痴 +_+........)

綜合:<<Game Programming Gems>>系列,不過由於內容涉及的過於廣泛,文章質量參差不齊,選擇性閱讀就可以了。歷年GDC, Gamefest t,Siggraph等大型會議的paper也是應該關注的。

         至於那些“All in one”或者n天較你寫出個FPS遊戲的書就不要讀了,這類書的通病是什麼都說了,結果什麼也沒說清楚。

         除了書以外,再推薦一些不錯的網路資源:

www.GameDev.net 除了大量教程以外,論壇裡多年累計下來的內容保羅永珍。好好利用論壇搜尋,你會發不管你多厲害,那裡總有一些比你強大的人在很久以前就遇到了和你同樣的問題,並且給出瞭解決方案。

NvidiaATI的開發者中心

creators.xna.com XNA官方網站

www.gamasutra.com GameDev類似

www.beyond3d.com 這裡的除了討論軟體以外,還能看到對硬體構架的分析

www.ziggyware.com 最好的XNA教程網站

www.gameres.com 國內唯一比較專業的遊戲程式設計網站,可惜和GameDev相比就顯得太寒磣了-_-#

         當然,不要忘了收集各大論壇裡牛人們的blog:)

         最後,僅僅靠看書是不夠的,多寫多練才是王道。

           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述