1. 程式人生 > >學習3D引擎架構技術概述

學習3D引擎架構技術概述

      近期對3D引擎的架構設計做了一個梳理總結,現在開發遊戲都離不開引擎,這些引擎包括Unity引擎,虛幻引擎,Cocos2dx引擎,自研引擎等等。很多開發者只會利用他們寫邏輯,遇到優化問題就束手無策了,遇到Shader程式設計以及優化就感到頭疼,長此以往對自己技術提升非常不利的。要改變現有的狀態,就必須要系統的學習相關3D引擎技術,這樣才能在使用引擎開發產品時得心應手。本篇部落格從三個方面給讀者做講解,一是學習3D引擎;二是選擇引擎開發產品,三是如何學習一款引擎,下面先從學習3D引擎開始。

學習3D引擎

   經歷過多年的引擎研發和引擎使用,在此我先把學習引擎以及相關技術模組給讀者列出來,技術框架圖如下所示:


在上述框架圖中共分為七部分,每一部分所包含的技術點並不侷限於圖中所列,在此一一給讀者解釋一下:

第一部分內容:是告訴讀者學習3D引擎架構知識的前提,就是要掌握引擎的編寫語言和引擎使用的圖形庫API介面,以及圖形學渲染也就是GPU程式設計使用的Shader語言,基礎知識是必須要掌握的。學習時可以參考這些API提供的Demo,把執行流程搞清楚,自己除錯一下就可以了。

第二部分內容: 3D基礎知識,比如一個3D模型要在二維螢幕上顯示出來,這中間要經歷一些矩陣變換才能將其在二維螢幕上顯示出來,這種變換過程通常稱為固定流水線,就是告訴讀者它的顯示是按照固定流程,它的計算都是在CPU中完成的;對應的就是可程式設計流水線,也就是在GPU中完成,其實就是將矩陣變換放到GPU中計算了。

第三部分內容:3D遊戲引擎的技術點,在掌握了第二部分內容後,再開始學習第三部分內容,該部分內容針對的是DX的SDK或者OpenGL的SDK,二者都提供了Demo供讀者學習,我們要把這些基礎的3D引擎技術掌握,最好的方式是自己用手把程式碼敲一遍,除錯一下。

第四部分內容:需要一定的數學知識,引擎的開發或者遊戲的開發離不開演算法的支援,當然大家也不用對其產生畏懼心理,學習任何事情都不是一蹴而就的,循序漸進的,先從基本的資料結構入手,逐步深入,圖中列出的幾種演算法是引擎中常用的演算法,四叉樹或者八叉樹可以用作地形的繪製,插值演算法可以用於實現刀光拖尾等等,A*演算法比較經典是尋路使用的,另外還有後處理演算法實時陰影的網上都有很多現成的案例。

第五部分內容:這部分內容是核心的架構設計,圖中所顯示的是組成引擎的各個模組,場景管理模組,該模組非常重要,地形的載入通常是通過分塊的方式處理的,比如魔獸地圖,顯示的是9塊,在緩衝中的是16塊,隨時提供載入,場景中少不了水的渲染,這個也體現了引擎的技術層次,大家可以看看虛幻水的渲染,達到了一個頂級水準。模型外掛也是必須的,Unity和現在開源的虛幻使用的都是AutoDesk提供的FBX模型,AutoDesk提供了FBX的API可以直接使用,當然自己也可以開發適用於自己引擎的模型外掛,自定義格式。AI模組這裡主要是指行為樹演算法,各種各樣的燈光模組也是必須的,對應的就是相機模組,比較常用的是透視攝像機和正交攝像機,特效和UI也是引擎的組成部分,剩下最重要的是物理引擎模組,碰撞檢測處理,常用的碰撞演算法:Mesh碰撞,球體碰撞,膠囊體碰撞,立方體碰撞,這些碰撞演算法的核心是OBB或者AABB演算法,當然還有肉體碰撞處理,另外,引擎很重要的部分是關於記憶體管理,這部分內容將在後面的部落格中介紹。

第六部分內容:3D引擎中的GPU程式設計,這個是令大部分程式設計師頭疼的問題,不同的引擎使用的渲染演算法是不一樣的,它們主要區別還是在細節貼圖方面的區別,以UE4為例,他渲染一個物體使用的材質相比Unity多一些,通過它們渲染的物體就可以看出來。快速的學習GPU程式設計,網上都有對應的Shader程式碼,可以直接在此基礎上修改。還有可以直接使用Shader編輯器用於Shader的編寫,調Shader效果我們可以參考Max或者Maya模型工具中的渲染效果,Max或者Maya中都有渲染Shader,它們功能很強大,引擎是無法與其攀比的,只能與其無限靠近。而且Max和Maya可以為我們提供使用了哪些Shader。該部分內容主要是針對模型的材質渲染。

第七部分內容:主要是針對引擎的後處理渲染,常用的有PSSM,HDR,Blur,Deferred等等,這些效果是在遊戲的每幀影象顯示之前再進行一遍後處理渲染,然後顯示出來,這就是後處理渲染效果。

上圖只列舉了七部分內容,還有一個技術點,開發者要掌握——設計模式,與引擎開發相關的設計模式比如:單例模式,工廠模式,觀察者模式,狀態模式等等吧,只要能熟練掌握這些就足夠了。上面框架圖是給想學習引擎的讀者推薦的,作為遊戲開發者來說,學習引擎對自己技術提升幫助還是非常大的,不要只侷限於邏輯的編寫,要想成為主程,技術經理,技術總監必須要學習引擎技術。

以上是關於讀者自己學習引擎的內容,現在網上有很多開源引擎,比如:Ogre引擎,虛幻引擎。。。。。

面對這麼多開源引擎,作為讀者如何去選擇一款適合自己產品研發的引擎至關重要。

選擇適合專案的引擎

  開發產品首先要做的事情是選擇引擎,市面上很多引擎供讀者使用,遊戲產品從大的方面說是頁遊,端遊,手遊;從表現形式來說有2D,3D之分。不同的產品設計對應著不同的引擎選擇,現在H5遊戲逐步出現了,相關的H5引擎也跟著出來了,比如:白鷺,layaBox,cocos-js。2D引擎目前還是cocos2dx引領,3D引擎的選擇有Unity3D引擎和虛幻引擎,二者最大的區別是一個開源,一個不開源,當然掌握難度要看不同的人使用。選擇引擎首先要考慮的問題是:

一、是該引擎是否有對應的上線產品出來,可以去下載玩玩,體驗一下。

二、與該引擎相關的工具是否完備,比如場景編輯器,特效編輯器。。。。

三、該引擎上手是否比較快,這個也是重點考量的;

四、該引擎相關的文件是否完整或者詳細,另外對應的論壇或者社群是否能夠快速響應;

五、不同的機型適配性是否滿足專案需求;

六、功能擴充套件性,這個涉及到程式碼的開源了,有第三方庫並且支援第三方庫開發;

七、對引擎支援的場景面數以及骨骼動畫,特效做一個壓力測試;

選擇引擎一定要根據自身專案需求來定,這個也關係到專案成敗,比如做一些3D模擬專案,要求品質比較高,這個就要考慮虛幻引擎了,當然使用的人必須具備C++程式設計能力,否則即使你選擇對了引擎,但是專案組的人不會用也是不行的。

3D手遊開發,這個選擇Unity引擎開發,Unity引擎的優點這個大家都知道,就不介紹了,當然缺點也比較明顯。

選擇好了引擎,如何學習一款引擎,因為你不能保證專案組的每一個人都會使用。

學習一款引擎

 選擇好了引擎後,下面就要開始學習了,學習一款引擎可以從先整體後部分,或者說先粗後細的原則。

首先,看一下這款引擎的文件,它主要能解決啥問題。

其次,引擎的架構設計圖,從整體上對整個引擎有所瞭解,以及類層次關係。

以上是粗看,目的是至少做到對引擎有個整體的概念。下面就是細看了,

先從引擎提供的官方Demo入手,把整個執行流程通過除錯的方式學習一下,在此過程中也能瞭解引擎使用的座標系以及模型格式,模型外掛等等吧。而且能對場景的載入處理都有所瞭解,通過除錯的方式可以深入到引擎內部,假設該引擎提供了原始碼。下一步再demo的基礎上嘗試做一些修改,加一些功能,加深對引擎的理解。

對於程式開發者來說,市面上比較常用的引擎技術都是相通的,深入理解了一款引擎,再學習其他引擎就很容易了。我以前是做端遊開發的,端遊開發的經驗對我開發手遊幫助很大,我自己也寫過引擎,自研引擎的經驗對於使用Unity引擎和虛幻引擎這些成熟引擎開發產品就非常容易了。

  開發者在學習引擎時,可以先從Ogre引擎入手,該引擎對與渲染做的比較好,而且該引擎沒有其他雜七雜八的東西,比較乾淨非常有助於開發者學習。以前用Ogre引擎開發過比較著名的端遊是《天龍八部》,效果也是不錯的,證明該引擎可以用於商業開發,本篇部落格只是從大的方面給讀者聊了聊3D引擎技術,下一篇給讀者介紹關於GPU程式設計優化的問題。