如何系統掌握遊戲編程中3D圖形學相關的基礎?

利用Unity3D或者其他遊戲引擎開發3D遊戲過程中,需要掌握3D圖形學相關的基礎。1.哪些相關基礎知識是必不可少的?2.如何由淺入深地系統掌握這些基礎?

順便求推薦各個階段圖書,謝謝。


之前在公司內做的培訓計劃中,基礎內容大概有以下這些:

三維幾何學基礎:

  1. 三維坐標系統

  2. 點與矢量

  3. 矩陣與幾何變換

  4. 四元數與三維旋轉

實時渲染管道:

  1. 應用階段(場景管理、可見性剔除、分組排序、提交圖元)

  2. 幾何階段(頂點著色、圖元組裝、面向剔除、三角形裁剪、透視除法、視區變換)

  3. 光柵化階段(掃瞄轉換、scissor/stencil/alpha 測試、alpha 混合)

遊戲中的光照與陰影:

  1. 實時光照分類(正向渲染、延遲渲染、Tile 正向/延遲渲染)
  2. 局部光照中的光源(環境光、方向光、點光、聚光、cookie)

  3. 陰影(平面陰影、陰影體積、陰影貼圖、PCF、VSM、CSM)

  4. 全局光照(光照貼圖、幅照度環境貼圖、球諧函數)

材質著色原理與實踐:

  1. 材質反射模型(渲染方程、BRDF、Lambertian、Phong、Blinn-Phong)

  2. 材質著色器編程(環境光、環境遮蔽、發光物體、貼圖採樣、環境貼圖、法線貼圖、輪廓光、紋理坐標動畫)

  3. 特殊著色器(卡通渲染、Kajiya-Kay、??)

由淺入深可先看[1],然後[2]。數學方面可參考[3]。

[1] 《遊戲引擎架構》,葉勁峰譯,電子工業出版社,2014

[2] Akenine-M?ller, Tomas, Eric Haines, and Naty Hoffman. Real-time rendering Third Edition, CRC Press, 2008.

[3] Lengyel, Eric. Mathematics for 3D game programming and computer graphics. Cengage Learning, 2012.


啊哈哈~ 上圖嘍~

這是這十幾天寫的soft pipeline渲染的立方體

黑色三角形是滑鼠點選效果,嗯,精確度高高?~

左面三角形使用透視紋理映射,右面的是線性映射,還是左面的給力啊(尼瑪,計算量翻了好幾倍啊~!)

為了感謝大家的謬讚,來~小的們,把新出爐的乾貨給各位兄台抬上來~

(1)http://blog.csdn.net/popy007/article/category/640562

這大牛把幾個關鍵的矩陣用初中生都能看懂的數學知識給推!!倒!!了!!受益良多啊。唯一的一點點小遺憾是沒有把CVV裁剪介紹一下,導致在頂點乘以透視矩陣後,進行投影操作之前出現了一段真空期,下面提到的《計算機圖形學(opengl版)》說明了這個問題。但是大牛的光環還是那麼耀眼!

(2)目前我看到的介紹流水線的資料中,在推導攝像機矩陣時,基本上沒有提到一個很重要的線性代數上的基本概念,如下:

world coordinate 是世界坐標系

  coordinate frame 是局部坐標系 也叫坐標架 類似於物體坐標系,或者攝像機坐標。

  第一部分:這裡用到得一個線性代數里的概念 叫做 過度矩陣: 從一個坐標基 到 另個一坐標基之間有一個過度矩陣 如 從坐標基A到坐標基B 有個過度矩陣C 則有 A*C = B 。如果有一個向量在世界坐標系下的坐標為a,有兩在世界坐標系下的坐標基(coordinate frame)A和B,且從A到B的過度矩陣為C,a在A和B兩個坐標基下的坐標是a『和b『。那麼有

a = A*a『 = B*b『 由 A*C=B 帶入得 A*a『 = B*b『=A*C *b『 其中 A為可逆矩陣 有 a『 = C*b『。這樣就得到了兩個在不同坐標基,且由A可逆還可知C = B*(A-1)。(A-1)時A矩陣的逆。

http://www.cnblogs.com/BlackWalnut/articles/4194956.html

第二部分在上面的鏈接里,由於公式編輯不下來,看著太疼了。

上面數學知識的重要性在於,給定任意一個向量可以快速構建一個坐標系。。。。。。用途有多廣?!?!?!你把它用在物體繞任意軸旋轉上試試,你把它用在攝像機坐標系推導上試試,你把它用在求射線和三角形焦點上試試(搜搜這個吧《Fast Minimum Storage Ray Triangle Intersection》),你把它用在normal map上試試(據說可以,我回頭看看,嘻嘻~),當然,你要是發現其他用途也私信一下我,嘿嘿。

要不是考研!!這個定理我踏馬也發現不了啊!!線性代數老師壓根就沒有提過!!話說那天我懶洋洋的看著數二數三不考,數一要考的線性代數部分,看到這個定理後,突然感覺比雷劈輕,比電擊爽的一絲電流在大腦里蔓延。。。。。。我靠~我找的你好苦啊!!!

得了~就這麼多吧,今天剛把xcode上的和glsl相關的代碼寫完,明天開始研究光照,隨後更新光照部分,手頭已經有兩本書了,不過學習思路還是不太明朗。回頭聊~

-----------------------------------這東西真叫分割線???------------------------------------------

謝(沒人)邀。。。。。

學3D開發也有兩三年了,彎路走了不少就當給大家提個醒吧。

3D圖形學剛開始學的時候最難的部分其實是渲染流水線,要搞清楚流水線每一步做了什麼,用到了那些矩陣,以及矩陣背後的數學原理還真是要了親命。折騰了死去活來好久以後,發現好書就那麼幾本:

1.《3D數學基礎:圖形與遊戲開發》 這個可以當參考手冊使用

2.《3D遊戲編程大師技巧》 很多人說它過時了,但是讓你徒手寫個流水線,我還沒有發現比這本代碼更完整,系統的書。不過這本書的缺點是,透視變換和投影變換完全是亂七八糟的一大坨坨!下面這本書就好很多。

3.《計算機圖形學(opengl版)》第三版 最近才發現的,目前中文網站上所有關於3D流水線敘述比較熱門的博客,帖子基本上都能從這本書上找到出處,很系統,也基本完整,概念,術語,圖例等等也比較到位,有些不太清楚的地方可以上網查查,基本上沒有什麼太大的遺漏。

4.紅寶書

以下所有前提都要求你明白簡單的線性代數運算,比如向量和矩陣的左右乘法,矩陣轉置,正交矩陣的逆矩陣等於其轉置矩陣等等。

如果你不知道3D是啥,建議從紅寶書開始。

如果對3D有一定了解,會一點opengl,建議從《計算機圖形學(opengl版)》開始,跟著徒手寫一個渲染流水出來,寫的過程中,《計算機圖形學(opengl版)》裡面有數學原理的介紹不太完整的,查查《3D數學基礎:圖形與遊戲開發》相關章節,不知道具體數據結構怎麼設計的,查查《3D遊戲編程大師技巧》。

這個階段,如果最後能寫出來一個軟的光柵化流水線,渲染出來線框就算成功。這是我的學習過程,可能對於不同的人,學習過程不太相同,但是,3D渲染流水線上關於幾何變換的東西,這三本書都包含的差不多了。

關於光照部分,我這個寒假想研究一下,主要是shader的使用,已經有幾本資料了,我看看了再來更新吧。

好吧。。。。。我回答這個問題的原因是有沒有人能幫我回答一下

點經過透視矩陣變化後得到齊次坐標,經行裁剪時w分量的含義? - 數學

這個問題啊!!!急死人了都!!很多資料都「巧妙」(還是我傻傻的沒有看見)避開了這個問題!!!三天了!!代碼改了十幾次!!!猜的,蒙的,算的都試了個遍!!流水線就差這一小步!!還讓不讓人開心的寫代碼了!!!快摔啤酒瓶了都!!!

----------------------------------------------------他們管這東西叫分割線---------------------------------------------------

那個問題解決了,是我的疏忽,給大家帶來了麻煩,很抱歉。答案我就寫在那個問題下面了。


這裡寫一個自底向上的學習步驟,具體學習情況因人而異。

1.毫無懸念的3D幾何數學基礎

這個部分是無論如何都跳不過的基本中的基本

坐標系統

向量

矩陣

角位移

等等...

這個部分,推薦一本書《3D數學基礎:圖形與遊戲開發》。

2.擼一個軟光柵渲染器

這個部分可能存在爭議,大多數可能會覺得為什麼不直接用Unity的ShaderLab去搞呢,那不是方便很多麼。 話這麼說是沒錯,但是 是題主自己問的「系統掌握3D圖形學相關基礎的」,那麼不寫個軟渲染,去徹底理解渲染管線中的每個環節,實在是說不過去。

重點重點:這一步只是因為題主要系統學習的前提了, 如果只是工作寫寫Shader的話,其實確實不用這麼做。

這個部分,推薦圖書《3D遊戲編程大師技巧 上/下》這本書推薦的比較牽強,因為內容其實很老了,但這塊確實也沒有什麼其他好書了, 還有就是自己上網搜相關的東西了 。

3.延伸至遊戲引擎

幾何檢測(各種相交性檢測,AABB, 球,射線,平面等等)

空間分割可見性檢測(四叉樹,八叉樹,BSP等等)

圖形API(推薦DX)

渲染框架/路徑(Forward ,Deferred等等)

這一步就是結合之前的學習,搭一個架子,為後續學習做準備。

這一部分書多且雜, 但是更重要的是要多讀源碼,寫代碼。

4.填充細節

光照

陰影

等等...

經過了前三步的學習,基本的知識結構已經搭好了,這一步就各種東西往上填充就可以了。

不過這一步中的一些基礎部分,在前三步中肯定也會提前學習到,但到這裡又可以深入學習,填充更多了。


Scratchapixel這個網站很好,我看了目前寫完的內容的70%了,還在繼續看。


3D圖形學需要少量的數學基礎,例如:

  1. 三角函數(最重要)
  2. 立體幾何
  3. 線性代數
  4. 複數
  5. 微積分

這些都是高中和大學會講到的知識,拿起課本複習一下就可以了。

推薦書籍:《Essential Mathematics for Games and Interactive Applications》

有了相關數學知識後,就可以通過網上的一些OpenGL教程來入門了。

這裡推薦:Learn OpenGL, extensive tutorial resource for learning Modern OpenGL

還有中文版:https://learnopengl-cn.github.io/

這個教程會講到坐標變換、投影、光柵化、光照、PBR等基礎知識,而且是一步一步教你去寫,應該不會太難。

以上基礎打好後,就可以更進一步學習渲染知識了,這裡推薦《Real-Time Rendering》

以上是學習3D渲染基礎知識的一種方法。相比紅寶書什麼的,這個入門更快,難度曲線更平滑。

如果你不滿足這些基礎知識,還可以看Shader X系列,GPU Gem系列,GPU Pro系列。


基礎篇:繪製流水線,知道opengl的就差不多了。推薦 OpenGL。實現個z buffer掃描線演算法更好,也就是opengl 流水線的簡化軟體實現。還可以再實現下全局光照明演算法,如光線跟蹤或輻射度演算法。上面清楚了,在看看shader 編程應該容易入門。

中級篇:選看開源繪製引擎和遊戲引擎的源代碼,如ogre, cocoas2d-x

高級篇:看看《GPU Gems》之類的書,再看看遊戲編程裡面有哪些經典或者很酷的演算法? - C++


推薦一本書《3D 遊戲編程大師技巧》

作者: 拉莫澤


寫軟渲染 寫ray tracing 寫DS DL 然後就輻射開來了。


這個,我覺得首先要先過語言關就是對一門程序語言要有一定了解。不然,對那些也許很簡單的圖形學知識,一旦通過計算機語言描述你可能就要蒙,這樣就會很難繼續下去。我覺得,c就最好啦,再隨便看看java也不錯。其次,在此基礎上就需要去手寫一些代碼,opengl directx的都可以,當然版本肯定不能再是固定管線的了。所以opengl3.0以上。至於怎麼寫,我覺得應該結合書本或者視頻教學,推薦一個youtube上的視頻教學,我覺得很好,是opengl的,語言是java。大概五六十個視頻,不過講解由淺到深。可以youtube搜索thinmatrix這個播主就可以。


推薦閱讀:

你遇到過哪些代碼優雅的C#項目?
除了收費的軟體或者庫以外,如何解析doc格式word文件,C++或C#語言的?
使用 C# 開發 iOS 程序是一種怎樣的體驗?
值得看的C#的開源項目有哪些?
如何看待CE5繼Unity之後又一個支持C#?

TAG:Unity遊戲引擎 | C | C# | Cocos2d-x | 遊戲編程 |