如何系統掌握遊戲編程中3D圖形學相關的基礎?
利用Unity3D或者其他遊戲引擎開發3D遊戲過程中,需要掌握3D圖形學相關的基礎。1.哪些相關基礎知識是必不可少的?2.如何由淺入深地系統掌握這些基礎?
順便求推薦各個階段圖書,謝謝。
之前在公司內做的培訓計劃中,基礎內容大概有以下這些:
三維幾何學基礎:- 三維坐標系統
- 點與矢量
- 矩陣與幾何變換
- 四元數與三維旋轉
- 應用階段(場景管理、可見性剔除、分組排序、提交圖元)
- 幾何階段(頂點著色、圖元組裝、面向剔除、三角形裁剪、透視除法、視區變換)
- 光柵化階段(掃瞄轉換、scissor/stencil/alpha 測試、alpha 混合)
- 實時光照分類(正向渲染、延遲渲染、Tile 正向/延遲渲染)
- 局部光照中的光源(環境光、方向光、點光、聚光、cookie)
- 陰影(平面陰影、陰影體積、陰影貼圖、PCF、VSM、CSM)
- 全局光照(光照貼圖、幅照度環境貼圖、球諧函數)
- 材質反射模型(渲染方程、BRDF、Lambertian、Phong、Blinn-Phong)
- 材質著色器編程(環境光、環境遮蔽、發光物體、貼圖採樣、環境貼圖、法線貼圖、輪廓光、紋理坐標動畫)
- 特殊著色器(卡通渲染、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圖形學需要少量的數學基礎,例如:
- 三角函數(最重要)
- 立體幾何
- 線性代數
- 複數
- 微積分
這些都是高中和大學會講到的知識,拿起課本複習一下就可以了。
推薦書籍:《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#?