經驗分享:3D遊戲引擎開發研究與實踐

經驗分享:3D遊戲引擎開發研究與實踐

文:姜雪偉

【v5手遊4月12日消息】很多遊戲開發者認為自己能寫邏輯就等於掌握了遊戲開發技術,引擎對自己來說無足輕重,這種想法是有問題的。首先你寫邏輯是在引擎的基礎上寫,其次如果你對引擎一無所知,非常不利於你去深入理解邏輯開發。相反如果你對引擎有深入的研究,你調用引擎提供的接口時可以很清楚的知道其內部是如何實現的,這樣有助於寫一些引擎的輔助功能算法,提升自己的編程能力。

我以前在網龍工作時,項目組就有一位邏輯程序員在做功能時,需要在原有引擎接口的基礎上增加一些算法編程以滿足遊戲玩法,當時他並沒有求助引擎組的同事,而是自己寫出來了,因為他自己平時就喜歡鑽研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遊戲引擎的開發研究和實踐經驗,在此主要總結了以下四點供大家學習參考。

首先,必須要掌握主流開發語言C、C++、Java或者C#至少一門編程語言,編程離不開數據結構,大學課程裡面學的數據結構對於遊戲開發非常重要,數據結構在遊戲開發中主要用於數據存儲以及內存管理,開發3D引擎常用數據結構有數組、鏈表、哈希表等以及常用的一些查找算法:快速排序,二叉樹查找,二分查找等,對於常用的數據結構要重點掌握。為引起讀者重視,在此再重點強調一下,數據結構對於遊戲開發非常重要。

其次,線性代數對於開發同樣非常重要,掌握線性代數的目的是在遊戲開發中靈活的運用向量、矩陣、四元數以及歐拉角這些基本的數學運算解決問題。3D固定流水線中的座標變換和可編程流水線的頂點和像素轉換都是使用線性代數運算完成的,運算主要涉及遊戲開發中的物體移動、旋轉、縮放,以及點乘和差乘等。

再次,現在的3D遊戲引擎渲染都是基於DirectX或者是OPENGL、OPENGLES這些圖形庫完成的,這就需要開發者能夠熟練的使用圖形庫的接口開發程序,在當前移動端跨平臺非常火熱的情況下,建議大家學習OPENGL圖形庫。3D引擎的核心功能就是對遊戲的場景渲染和物體的材質渲染,對於材質中有Alpha通道的要做特殊處理,Alpha通道就是說材質有透明的部分。在移動端為了減少透明材質的消耗,會通過GPU編程在Shader中進行處理,比如把有Alpha通道的圖片切分成無Alpha通道和有Alpha通道的圖片,通過Shader編程將其再合在一起。場景渲染使用的是後處理渲染效果,比如Bloom、Blur、Ssao、Pssm等等。這些效果實現與GPU編程息息相關,要求大家至少掌握GLSL、HLSL或者CG這些基於顯卡GPU編程語言的一種。

最後是圖形學算法,遊戲要實現一些逼真的效果離不開算法的支持,比如柔體的模擬,剛體碰撞效果以及曲線插值算法等。學習圖形學算法,建議大家看一下《算法導論》這本非常經典的書籍,以上說的這些是引擎中比較深層次的知識點。另外在框架設計方面,需要掌握設計模式裡常用的比如工廠模式,單件模式,狀態模式,MVC模式等。設計模式的使用不是靠死記硬背,需要將其靈活運用到項目開發中,這樣才能逐步深入領會其設計精髓。初學者在使用設計模式的過程中會出現一個誤區:千萬不要為了使用設計模式而使用設計模式,過度的使用會得到適得其反的效果,凡事要把握一個度。以前公司的同事為了使用設計模式,不論設計什麼模塊都要用設計模式,最後導致在模塊擴充時出現了很多問題,舉這個例子是告訴讀者好東西也不能亂用。筆者從沒有在做架構設計時去特意考慮用哪種設計模式,都是順其自然的使用,真正的用劍高手,可以做到手中無劍,心中有劍的境界。

以上四點是筆者對3D遊戲引擎開發的心得體會,建議大家循序漸進的學習,優先掌握第一、第二點,其次第三點,最後是圖形學算法,由易到難的學習。希望讀者通過本書的學習,能夠對引擎開發有更深入的理解,寫出更好的3D遊戲引擎或者更好的渲染算法。

遊戲開發最核心的技術是算法,在遊戲開發中佔非常大的比重,也可以說是引擎核心中的核心,以筆者親身開發項目經歷給大家分享一下,希望起到拋磚引玉的效果。近期與高校科研機構合作研發了一款海水渲染3D引擎,可以逼真的模擬真實海浪,以及海浪在不同的天氣實現不同的效果,模擬船在海中隨海浪上下浮動和直升機在海浪上空懸停風力與海浪的作用效果等。在實現的過程中使用了很多算法比如Perlin噪音算法,弗洛伊德算法,以及物理算法等。

經驗分享:3D遊戲引擎開發研究與實踐經驗分享:3D遊戲引擎開發研究與實踐

技術的學習掌握不是一朝一夕能夠完成的,關鍵在於堅持,首先要做的是打好基礎,在真正掌握了基礎知識後,再提升是非常快的。做遊戲引擎也是知識積累的過程,雖然現在的3D引擎非常多,自己開發遊戲引擎已經不現實,但是要想真正的深入學習遊戲開發核心技術,至少應該知道引擎的底層是如何實現的,換句話說就是其工作原理要搞清楚,這對於開發者來說非常重要。不要再把自己侷限於代碼操作工簡單的寫寫邏輯,這對自己的技術提升沒有任何幫助的。

要做到對遊戲開發知其然知其所以然,就必須學習3D引擎開發技術,特別是對剛踏入遊戲行業的從業者,每天堅持不斷的學習,如果你能持續不斷的堅持10000個小時學習,你肯定會成為3D引擎高手。這就跟鍛鍊身體一樣,其實鍛鍊身體非常能夠磨練一個人的心性,鍛鍊一個人的意志力。自己嘗試開發一款小的遊戲引擎,即使不能成功但是過程也是非常重要的,你從中可以學習到很多知識,經驗的積累對自己的發展幫助非常大,這也是為什麼遊戲公司招聘,首要的條件是應聘者要有實際開發項目工作經驗。

from:GAD

相關推薦

推薦中...