很多遊戲幵發者認為自己能寫邏輯就等於掌握了遊戲開發技術,引擎對自己來說無足輕重,這種想法是有問題的。
首先你寫邏輯是在引擎的基礎上寫的,其次如果你對引擎一無所知,非常不利於你去深入理解邏輯開發。相反,如果你對引擎有深入的研究,你調用引擎提供的接口時可以很清楚地知道其內部是如何實現的,這樣有助於寫一些引擎的輔助功能算法,提升自己的編程能力。
我以前在 xxx 公司工作時,項目組就有一位邏輯程式設計師在做功能時,需要在原有引擎接口的基礎上增加一些算法編程以滿足遊戲玩法,當時他並沒有求助引擎組的同事,而是自己寫出來了,因為他自己平時就喜歡鑽研 3D 遊戲引擎,了解引擎接口內部是如何實現的,這本身就證明了他的編程能力。最後將其吸納到擁有公司最核心技術的引擎項目組,薪酬和職位同時得到了提升。
因為在公司裡面會寫算法,或者會 GPU 編程的人相對來說非常少,如果你掌握了 3D 引擎開發技術,不僅對於邏輯開發更加有利,而且對於你技能提升幫助非常大。
學習 3D 引擎需要經歷一個由淺入深的過程,首先要了解最基本的一些 3D 知識,比如固定流水線、可編程流水線、3D 模型結構、骨骼動畫等,並且能利用 Dirct3D 或 OPENGL 或 OPENGLES 這些圖形庫中任何一個,做個簡單的 Demo。
通過這個 Demo 了解程序運行的原理後,再嘗試封裝一些簡單算法,一些常用函數,利用這個簡單封裝做一款小的遊戲 Demo。
最後再研究一下 GPU 編程,比如 CG、HLSL 語言的語法,在 GPU 編程的基礎上再學習一些大型遊戲開發中常用的算法,比如 PSSM 實時陰影算法、Bloom 算法等,它們都是與 Shader 編程緊密相關的後處理渲染算法。
目前各大遊戲公司,比如網易、騰訊、EA、任天堂等國內外知名的 IT 公司,還有許多新興的 VR/AR 公司非常緊缺 3D 引擎資深程序或者圖形學引擎開發人員,開出了非常誘人的薪水和待遇,從中可以看出,目前遊戲市場對於這類人才需求還是非常緊缺的。這正是一個學習 3D 引擎幵發的好機會,俗話說「機不可失,時不我待」。
我曾經在國內知名 IT 遊戲公司參與過 3D 遊戲引擎項目組的研發,利用業餘時間也開發過3D遊戲引擎,從底層算法到架構設計都是一個人完成的,當然開發周期也是比較長的。
回到正題,3D 引擎這麼重要,那作為新手應該如何著手學習?換句話說,關於幵發 3D 引擎要具備哪些條件?網絡上有許多這方面的解答,我經過多年對 3D 遊戲引擎的開發研究和實踐經驗,在此主要總結了以下六點供大家學習參考。
1) 首先必須掌握主流幵發語言C語言、C++、Java 或 C# 至少一門程式語言。
2) 編程離不開數據結構,大學課程裡面學的數據結構對於遊戲開發非常重要,數據結構在遊戲開發中主要用於數據存儲及內存管理,開發 3D 引擎常用數據結構有數組、鍊表、哈希表等,以及常用的一些查找算法:快速排序、二叉樹查找、二分査找等,對於常用的數據結構要重點掌握。
為引起讀者重視,在此再重點強調一下,數據結構對於遊戲開發非常重要。
3) 線性代數對於開發同樣非常重要,掌握線性代數的目的是在遊戲開發中靈活地運用向量、矩陣、四元數,以及歐拉角這些基本的數學運算解決問題。3D 固定流水線中的坐標變換和可編程流水線的頂點和像素轉換都是使用線性代數運算完成的,運算主要涉及遊戲幵發中的物體移動、旋轉、縮放,以及點乘和差乘等。
4) 現在的 3D 遊戲引擎渲染都是基於 DirectX 或者 OPENGL、OPENGLES 這些圖形庫完成的,這就需要開發者能夠熟練地使用圖形庫的接口開發程序。在當前移動端跨平臺非常火熱的情況下,建議大家學習 OPENGL 圖形庫。
3D 引擎的核心功能就是對遊戲的場景渲染和物體的材質渲染。
對於材質中有 Alpha 通道的要做特殊處理,Alpha 通道就是說材質有透明的部分。在移動端為了減少透明材質的消耗,會通過 GPU 編程在 Shader 中進行處理,比如把有 Alpha 通道的圖片切分成無 Alpha 通道和有 Alpha 通道的圖片,通過 Shader 編程將其再合在一起。
場景渲染使用的是後處理渲染效果,比如 Bloom、Blur、 Ssao、Pssm 等。這些效果實現與 GPU 編程息息相關,要求大家至少掌握 GLSL、HLSL 或 CG 這些基於顯卡 GPU 程式語言的一種。
5) 學習圖形學算法,遊戲要實現一些逼真的效果離不開算法的支持,比如柔體的模擬、剛體碰撞效果及曲線插值算法等。
學習圖形學算法,建議大家看一下《算法導論》這本非常經典的書籍,以上說的這些是引擎中比較深層次的知識點。
6) 另外,在框架設計方面,需要掌握設計模式裡常用的如工廠模式、單件模式、狀態模式、MVC模式等。設計模式的使用不能靠死記硬背,需要將其靈活運用到項目幵發中,這樣才能逐步深入領會其設計精髄。
初學者在使用設計模式的過程中會出現一個誤區:千萬不要為了使用設計模式而使用設計模式,過度使用會得到適得其反的效果,凡事要把握一個度。以前公司的同事為了使用設計模式,不論設計什麼模塊都要用設計模式,最後導致在模塊擴充時出現了很多問題,舉這個例子的目的是告訴讀者好東西也不能亂用。
我從沒有在做架構設計時去特意考慮用哪種設計模式,都是順其自然地使用,真正的用劍高手,可以做到手中無劍,心中有劍的境界。
以上六點是筆者對 3D 遊戲引擎開發的心得體會,建議大家循序漸進、由易到難地學習。
遊戲開發最核心的技術是算法,在遊戲開發中佔非常大的比重,也可以說是引擎核心中的核心,以筆者親身開發項目經歷給大家分享一下,希望起到拋磚引玉的效果。
近期與高校科研機構合作研發了一款海水渲染 3D 引擎,可以逼真地模擬真實海浪,以及海浪在不同的天氣實現不同的效果,模擬船在海中隨海浪上下浮動和直升機在海浪上空懸停風力與海浪的作用效果等。
在實現的過程中使用了很多算法,比如 Perlin 噪聲算法、弗洛伊德算法,以及物理算法等。
如下圖所示,是基於 GPU 編程模擬的旋渦。
圖1:旋渦模擬
技術的掌握不是一朝一夕能夠完成的,關鍵在于堅持,首先要做的是打好基礎,在真正掌握了基礎知識後,再提升是非常快的。
做遊戲引擎也是知識積累的過程,雖然現在的 3D 引擎非常多,自己幵發遊戲引擎己經不現實,但要想真正地深入學習遊戲幵發核心技術,至少應該知道引擎的底層是如何實現的,換句話說就是其工作原理要搞清楚,這對於開發者來說非常重要。
不要再把自己局限於代碼操作工簡單地寫寫邏輯,這對自己的技術提升沒有任何幫助的。要做到對遊戲開發知其然知其所以然,就必須學習 3D 引擎開發技術,特別是對剛踏入遊戲行業的從業者,每天堅持不斷地學習,如果能持續不斷地學習 10000 小時,你肯定會成為 3D 引擎高手。
這就跟鍛鍊身體一樣,其實鍛鍊身體非常能夠磨鍊一個人的心性,鍛鍊一個人的意志力。
自己嘗試開發一款小的遊戲引擎,即使不能成功,但過程也是非常重要的,你從中可以學習到很多知識,經驗的積累對自己的發展幫助非常大,這也是為什麼遊戲公司招聘,首要的條件是應聘者要有實際開發項目工作經驗。