第二章 起航(同樣感謝大食堂校驗本章)

第二章 起航(同樣感謝大食堂校驗本章)

目錄

1.遊戲編程.

2.遊戲引擎的組成部分.

3遊戲引擎編輯器的組成.

4.數學...

(1)向量

(2)矩陣

(3)四元數

(4)幾何體

(5)歐拉角

5.空間變換

(1)坐標系

(2)不同空間的轉換

6.3D流水線

7.OPENGL 和DX

8.彙編指令

9.引擎工作流

習題


現今,想要從頭寫一個功能強大的3D引擎,個人的力量恐將難以勝任,即使能力足夠,時間恐怕也不允許。在這個美好的開源時代,你只需具備修改各種引擎能力便足以滿足你開發遊戲的各項需求。現代遊戲引擎的複雜級別已不同於以往,引擎中錯綜複雜的功能模塊,再配合著同樣重要且複雜的遊戲編輯器,這其中的任何一項內容都足以獨立成書,以本書有限的篇幅,實在難以面面俱到。所以我們將在這裡邁出我們的第一步,在遊戲開發的海洋中,揚帆起航。

當然,在出發之前,我相信本書的讀者也已經具有了基本的編程概念和基礎的開發能力,因為這是我們出海的信心所在。如果現在的你還不具備這些,那麼請先做些必要的自我修鍊,然後再回來隨我們一起踏上征程。

1.遊戲編程

既然要開始遊戲編程,首先要選擇語言工具,C和C++是開發遊戲引擎的首選。

以作者的理解,遊戲編程廣義上講可以分成遊戲邏輯編程和遊戲引擎編程。但是他們兩者之間的邊界卻往往又沒有那麼涇渭分明。

遊戲邏輯開發是集中力量開發遊戲中的劇情和玩法,你要決定的是什麼時候顯示什麼內容,什麼時候放出什麼聲音,什麼時候通過網路傳輸什麼數據,什麼時候這個物體或者人物做什麼動作。至於圖像如何顯示,聲音如何處理,數據如何傳輸,物體動作如何實現,你其實並不用關心,這些歸遊戲引擎來處理。所以說遊戲邏輯負責遊戲核心玩法方面的內容,而遊戲引擎負責底層方面的處理。

這裡有人可能會有疑問:「既然你解釋成做什麼和怎麼做,那麼可不可以理解為,我想做一個已經寫好了劇本的遊戲,既然內容確定了,遊戲引擎就應該能給我馬上做出來,至於怎麼做,我可以不關心?」是的,沒錯,只要你選擇的遊戲引擎足夠強大。

成功的遊戲是以好的遊戲邏輯為基礎的,雖然引擎並不能說是一款遊戲成敗與否的決定性因素,但好的遊戲內容通過好的遊戲引擎來實現,會給人一種全新視覺和聽覺感受,會更加震撼人心,這就好比傳統的2D電影和3D乃至4D電影的效果對比。

至於遊戲邏輯,就像電影的劇本,至於能否拍攝出預期的效果,不但取決於導演對劇本的理解和演員的演繹,也更決定於用於拍攝的技術和後期的特效處理。

2.遊戲引擎的組成

現在的遊戲引擎比早些年的遊戲引擎更加規範,通常

包括:

(1)遊戲圖形引擎

(2)聲音引擎

(3)網路引擎

(4)腳本引擎

(5)圖形用戶界面

(6)人工智慧引擎

(7)物理引擎

(8)各種編輯器。

遊戲畫面能正常顯示是最基本的要求,所以圖形引擎是遊戲的基石,其他模塊則是為遊戲添磚加瓦。

如果一個引擎同時具備上面8個模塊,至少說明這個引擎功能是比較強的。

現在少有引擎全部自研所有模塊,很多都以第三方技術授權形式來實現相應模塊的功能。

1.圖形引擎:作為遊戲的基石模塊,圖形引擎還是以各自實現開發為主,畢竟圖形引擎還沒能夠抽象的那麼完美。為了達到更好的畫面效果和各自遊戲的功能需要,再研發必不可少。

2.聲音引擎:市面上用的最多的插件就是FMOD,除了可以播放音樂音效,還包括底層支持及各種聲音資源的管理工作。

3.網路引擎:筆者覺得目前的網路引擎並沒有一套完全成熟的解決方案,能同時滿足各種遊戲伺服器類型,並且便於接入和開發。單從開發便捷來說,個人還是覺得Unreal網路比較好,既可用於客戶端開發也可以做網路端支持,不過它的架構只適合做開房間的遊戲。

4.腳本引擎:這裡我不想說大家經常使用的lua,javascrip等腳本語言,它們還是太高級了,主要是由程序員來使用的。我說的腳本語言是面向遊戲策劃或是用戶,可以是指令形式,也可以是簡單語句。大家玩過的《魔獸爭霸3》(如圖2-1)就可以使用腳本寫出很多有趣的遊戲內容,還有當年的《紅色警戒2》(如圖2-2),甚至是《國家的崛起》(如圖2-3),玩家可以自己用腳本寫AI。如果希望更深入的了解這些高級的腳本語言,筆者推薦《遊戲腳本高級編程》這本書,當然你最好具備些編譯原理的知識,這樣看起來會更容易。

圖2-1 魔獸爭霸 圖2-2 紅色警戒 圖2-3 國家的崛起

5.圖形用戶界面:也就是咱們常說的GUI,血條、分數等在屏幕位置固定不變的2D圖案。UI也可以做的很炫,不要小看UI,它也算是遊戲里最重要的組成部分。。

不過現在很多以故事為背景的歐美遊戲,都會弱化UI,以求讓玩家達到身臨其境的感覺。

6.人工智慧引擎:AI這塊筆者在開發中所遇不多,一般使用自動機,行為樹,博弈樹,A*等演算法。對其他演算法,比如神經網路,遺傳演算法實際開發中接觸比較少,多以書本了解為主。現在Unreal內部有自己集成的AI,並且帶編輯器的。Unity也有專門的AI插件,可以去商店購買。這裡推薦大家一些關於遊戲AI的書籍,《遊戲人工智慧編程案例精粹》、《遊戲編程中的人工智慧技術》、《遊戲開發中的人工智慧》,如果你英文水平足夠,建議去看英文版本。

7.物理引擎:多數遊戲開發中遇到的都是剛體和剛體運動,碰撞和碰撞反應,射線檢測等,還有一些布料系統。軟體和真實流體,氣體物理等則相對較少。現在世面上有三大物理引擎:Physx、Havok、Bullet(Physx和Bullet開源了),如果讀者想要零起步學習物理引擎,推薦以下書籍,《遊戲物理引擎開發》、《遊戲開發物理學》、《遊戲中的數學與物理學》、《實施碰撞檢測演算法技術》。

3遊戲引擎編輯器的組成

引擎編輯器常用的包含場景編輯器,粒子特效編輯器,模型瀏覽器,材質編輯器,動畫編輯器。除了前面這些常規的,還包括物理編輯器,AI行為樹編輯器,腳本編輯器,技能編輯器。引擎編輯器除了可以編輯各種資源,還負責對各種資源管理和整理。現在引擎的設計理念,編輯器還包括了性能分析,打包和部署以及版本發布等功能。

以Unity和Unreal引擎為例,下面列出一些功能編輯的界面,向大家展示些初步的概念。

1.場景編輯器,負責擺放模型物體,光源,攝像機等等。(如圖2-4)

圖2-4

2.粒子編輯器,負責製作各種特效。(如圖2-5)

圖2-5

3.模型瀏覽器,負責瀏覽和編輯模型。(如圖2-6)

圖2-6

4.動畫編輯器,負責編輯動畫功能,並和遊戲邏輯關聯促發。(如圖2-7)

圖2-7

5.材質編輯器,給模型編輯效果的。(如圖2-8)

圖2-8

6.資源管理,管理各種遊戲中資源。(如圖2-9)

圖2-9

上面只是簡單羅列了Unity和Unreal的一些常用編輯器。開發過3D遊戲的人基本都用過Unity,對於新手而言,我的建議是,先看看Unity官方的開發書籍,嘗試開發個簡單遊戲來入門。

接下來幾個部分,我們回顧一下做遊戲引擎所需的基礎知識。這裡並不會詳細的介紹每個部分,大多點到為止。當然想要詳細了解的話,文中會提及從哪裡可以學習到這些知識,當然這並非本書重點。

4.數學

數學可以說是引擎的根基,它的作用是不言而喻的。不光是引擎裡面需要,有時候遊戲邏輯裡面也是需要,其要求基本覆蓋了大學裡數學相關的所有課程——《高等數學》、《線性代數》、《概率與數理統計》。很多人可以把這些課程學的精通,但能創造性的應用在遊戲引擎裡面卻寥寥無幾,能把那些高深的論文在遊戲中真正實現出來的更是鳳毛麟角。被加入到遊戲引擎里的數學演算法,大多是已經非常成熟的技術,並且已經被標準程序庫化 ,會有效的使用他們其實這已經足夠。除非你在這個領域有所突破,否則能做好物盡其用的話,我們可以把更多的精力放在我們擅長的領域上。

另外這裡提及的數學,大部分是一些基礎的數學知識,也是引擎中最常用到的,那種複雜的多重微積分的應用,這裡並不涉及。下面將要列出的都是我們需要掌握的基本內容,為了我們後續能更加愉快的交流,強烈推薦研讀《3D數學基礎:圖形與遊戲開發》這本書。

(1)向量

向量在數學中,向量(也稱幾何向量、矢量),指具有大小(magnitude)和方向的量。這是圖形學和物理學中經常用到的概念,希望大家能了解2D、3D、4D向量,標量和點的含義。在遊戲中,3D向量既可以表示一個方向,也可以表示一個點。

還要了解向量之間的運算以及對應的含義。向量與標量加減乘除,向量長度,向量點積,向量叉乘,向量單位化,向量加法,向量減法,點到點向量,點到點距離等。

(2)矩陣

矩陣也是圖形學中最常用的,它的一個作用就是空間變換。對於沒有學過線性代數的人來說,可能有些難以理解,不過也沒關係,引擎中最常用的就是3×3矩陣和4×4矩陣。我後面在空間變換會詳細說它們的功能。

不過這裡還是要有你需要了解關於矩陣的一些特性,矩陣的維度,矩陣的逆,矩陣的轉置,單位矩陣,方陣,標量和矩陣相乘,矩陣和矩陣相乘,矩陣和向量相乘,向量和矩陣相乘(不同順序得到結果可不一樣哦),正交矩陣,向量與基向量關係。

(3)四元數

四元數我在大學裡並沒有涉及,也是後來學習圖形學的時候才接觸到的。需要你了解四元數的定義,還有四元數的模,單位四元數,四元數的逆,四元數的共軛,四元數的點乘和叉乘,相關的知識網上也非常容易查到。

(4)幾何體

引擎中的幾何體基本都是用來做碰撞檢測和相交檢測的,和求相互距離。所有的幾何體都是參數化表示。

你需要弄清楚的是:直線、射線、線段、圓、三角形、矩形、平面,球體、立方體(AABB OBB)、膠囊體。

然後你需要弄清楚的就是他們之間的相交檢測,點到他們的距離。

不得不說上面是最基礎的數學知識,這些是你一定要弄懂的,不要求你當場會把一個射線和三角形的交點演算法寫出來,但起碼你要知道什麼時候需要這個演算法

(5)歐拉角

歐拉角和坐標軸的指向沒什麼關係,它是按照方位來定義的,按照前向量(Roll)、右向量(Pitch)、上向量(Yaw)作為軸向旋轉來分類。按不同旋轉順序會導致結果是不一樣的,一般都有兩種旋轉順序分別為:Roll-Pitch-Yaw和Yaw-Pitch-Roll,本引擎中採樣的的第一種旋轉順序。

讀者要深刻了解歐拉角——矩陣——四元數之間的相互轉換關係。在本引擎中的轉換關係為:

1.分別繞Z、X、Y軸旋轉AngleZ、AngleX、AngleY角度的矩陣和構建歐拉角的矩陣一樣。

Matrix(Z Axis, AngleZ) * Matrix(X Axis, AngleX) * Matrix(Y Axis, AngleY) = Matrix(Roll_AngleZ, Pitch_AngleX,Yaw_AngleY)

2.分別繞Z、X、Y軸旋轉AngleZ、AngleX、AngleY角度的四元數和建歐拉角四元數一樣。

Quaternion (Z Axis, AngleZ) * Quaternion (X Axis, AngleX) * Quaternion (Y Axis, AngleY) = Quaternion (Roll_AngleZ, Pitch_AngleX,Yaw_AngleY)

3.歐拉到四元數和矩陣並不一定可逆,前提是AngleZ、AngleY的範圍在[-π,π],AngleX的範圍在[-π/2,π/2],至於為什麼這樣,這裡我不明確解釋,讀者可以根據公式自己去推導吧。

讀者務必要搞清楚,它們之間的關係,自己用公式推導一下,然後搞清楚乘積的順序。

5.空間變換

接下來到了3D引擎中重要部分了,也是好多初學者經常搞不懂的地方。

(1)坐標系

這裡我只說3D坐標系,誰叫咱們是3D引擎了。在這小節中,你只需要知道坐標系的定義,還一個就是左手坐標系和右手坐標系。3D坐標系是由一個點加三個正交的方向組成,也就是說這個坐標系下任何一個點v都可以由這個3個正交的軸向表示(向量與基向量)。

圖2-10 本引擎坐標系和Unreal引擎坐標系

大部分引擎都是左手坐標系,當然也有些引擎是右手坐標系的(如圖2-10),所以你知道這個引擎是哪類坐標系後,你對接下來的運算才能正確的進行。不一定非要食指指向y軸,只要那個坐標系符合你3個手指的方向就可以,有些人可能發現有的坐標系既不是左手坐標系也不是右手坐標系,拜託!你們把自己手轉一轉,靈活的轉,實在不行身子動起來,肯定有一個手能對上的。

圖2-11 原諒我這一生不羈放縱愛畫畫

我一般喜歡大拇指指向y軸,大部分引擎也y軸向上,當然也有z軸向上的,但無論什麼樣,我希望你能區分開。

(2)不同空間的轉換

到你最關鍵的時刻了,好多人一到這個地方就會矇頭轉向,本質原因還沒有掌握空間變化的基本原理。

線性變換:F(a+b)=F(a)+F(b) 並且 F(ka)=kF(a) 其中a、b是變數,k是常量,F是函數。

我舉個簡單的例子比如一個函數F(x)=3*x,則這個函數就是線性變換

因為它滿足F(a+b)=3*(a+b)=3a+3b=F(a)+F(b) 同理 F(2a)=3*2*a=2F(a);

到這裡我想大家都知道了什麼叫做線性變換,下面我就開始給大家介紹3D中最常用的兩個線性變換。

縮放變換:F(x,y,z)=ax+by+cz,簡單說就是把一個點或者一個向量v(x,y,z)每個分量乘以一個比例係數。

如果有人覺得它不是線性變換,那麼可以自己驗證。無論什麼樣的線性變換,都是相對於當前坐標軸和當前坐標原點來說的,我後面要提到的仿射變換也是這樣。一般情況下,都是這樣,如果不是,那它的題目描述應該類似這種——相對某個點A來進行縮放。

圖2-12 同一個單位正方形相對原點縮放2倍和相對於(2,0)點縮放2倍

圖2-12說明了這一切,相對於(2,0)縮放的時候,相當於(2,0)為原點,原來正方形(1,1)(1,-1)(-1,-1)(-1,1)變成了(-1,1)(-1,-1)(-3,-1)(-3,1)然後擴大兩倍。

其實這裡第2個縮放已經不滿足線性變換的條件了,這個是後面要說的仿射變換。

旋轉變換:F(a) = Ma。a是變數,F是函數,在3D空間中,M是一個3×3的旋轉矩陣,也就是說它要滿足單位正交化,就滿足線性變換。

之所以寫成矩陣的形式完全是為了方便。而且矩陣運算滿足對空間縮放的變換。在旋轉變換中,最常用的就是繞X,Y,Z軸旋轉或者說是歐拉角旋轉,還有一個就是繞某個方向旋轉,其實他們直接是可以互相轉換的。也就是說繞某個方向旋轉可以用繞X,Y,Z軸3個旋轉來完成。

在準備自己寫引擎的時候,一定要規定好自己歐拉角和XYZ軸向的關係,我的引擎裡面用歐拉角構造矩陣的順序是roll pith yaw (ZXY),不同的旋轉順序得到的結果也不同。在用引擎的時候,也要找到它們之間的關係,自己實驗下引擎中提供的矩陣和歐拉角函數就知道了。還有一個更重要的是,旋轉方向,不同引擎可能也不同,本書中規定正角度旋轉是順著軸向看是逆時針的,也就是逆著軸向看順時針的(如圖2-13)。

圖2-13正角度的旋轉

仿射變換是指線性變換後接著平移。也就是說F(a)=Ma + T,T表示平移。

在3D空間中的大部分變換都是仿射變換,當然也有非仿射變換,比如投影變換,Normal的切空間變換。無論你是先平移再縮放後旋轉,還是先旋轉再縮放後平移,其實最後都可以化解成先縮放再旋轉後平移。

這種形式F(a) = aSM+T,其中S為縮放,M為旋轉,T為平移。

比如先平移再縮放後旋轉 F(a)=(a+T)SM=aSM+TSM,其中S為縮放,M為旋轉,TSM為新的平移。

所以定義一個標準的順序進行3D空間的仿射變換很重要,基本所有的引擎都是用先縮放再旋轉後平移這樣的順序。

前面說過其實仿射變換沒有道理一定用矩陣表示,完全可以用3D向量S表示縮放,四元數表示旋轉,3D向量表示平移。但矩陣有一個好處是,它可以整合縮放旋轉和平移,統一用矩陣表示,並且對於父子級節點的空間變換更要方便很多,再一個就是用矩陣對頂點變換在現在GPU寄存器中計算是十分友好的。

M=縮放矩陣*旋轉矩陣呢*平移矩陣。

a 0 0 0

縮放矩陣=(0 b 0 0 )

0 0 c 0

0 0 0 1

m01 m02 m03 0

旋轉矩陣=( m11 m12 m13 0 ) 其中m 組成的3×3矩陣是正交矩陣

m21 m22 m23 0

0 0 0 1

1 0 0 0

平移矩陣=(0 1 0 0 )

0 0 1 0

Tx Ty Tz 1

一般情況下,導出骨架層級都是用矩陣表示,動作一般都是用縮放、四元數和平移表示,在計算GPU蒙皮的時候也是用矩陣表示。

另一個重要的就是矩陣和向量左乘還是右乘的問題,每個引擎都有自己的規定,這個要先弄清楚,如果弄錯得到結果就不是想要的,這本書講的都是左乘,也就是說矩陣始終在向量右面,比如一個頂點v通過矩陣變換v』= v M;

這裡面有很多細節都未涉及,比如四元數、矩陣、歐拉角之間的變換,還有正交投影,透視投影矩陣是如何求得。這些內容從我介紹的那本書中,可以得到清楚的解釋。

一般使用引擎理解了仿射變換就足夠,但要是寫引擎還要理解很多變態的變換,除了正交和透視變換,用到這種變態變換的就是計算陰影。

6.3D流水線

3D流水線通常是指一個模型或者說一個三角形,受到各種效果影響,最後如何呈現在屏幕上的過程。3D流水線最早定義確定後,慢慢又出現了軟體渲染器,硬體渲染器。但無論怎樣,它的處理流程是基本不變的。下面讓我們簡單了解下這個過程:

1.三角形(頂點位置,紋理坐標,每個點或者面的Normal)組成模型,這個時候模型的所有數據都是在物體的模型空間的,如圖2-14。

圖2-14 正方形在編輯模型軟體中,是按照物體模型空間製作的,再導入到引擎資源管理器中

2.然後把這個模型導入到引擎裡面,放在引擎場景中,這個時候模型所有頂點就完成從模型空間到世界空間的轉換,如圖2-15。

圖2-15 正方形從資源管理器中拖拽到場景中,其實就變換到世界空間,再平移,也是在世界空間移動

3.場景裡面有一個相機,在這個相機視區範圍內,把模型從世界空間轉換到相機空間,然後把不可見的面消除掉。如圖2-16

圖2-16 把模型從世界空間坐標系轉換到相機空間坐標系

4.因為實際我們看到的物體都是近大遠小的,要經過投影變換,把這些三角形變換到投影空間,如圖2-17。

圖2-17 把模型從相機空間坐標系轉換到相機投影空間坐標系

5.然後把投影空間的三角形,變換到2D的屏幕空間中,根據深度值來判斷遮擋關係,然後處理stencil模板判斷那些像素可以通過,最後進行光照,霧化,Alpha Blend 或者 Alpha Test,如圖2-18。

圖2-18 把模型從投影坐標系轉換到屏幕空間坐標系

這是一個差不多標準的3D流水線過程,不過自從shader出來後,頂點變換和像素著色過程都可以用shader來控制,根據你自己需要,不一定要嚴格按照這個流程來。比如光照我可以在頂點計算的時候就算出來。

雖然shader已經成為標準,但也不一定非要著急去學習他,我覺得大家把《3D遊戲編程大師技巧》這本書完全看明白,才適合看第三章及其以後知識。

7.OPENGL 和DX

很多人都聽過這兩個名詞,其實他們是一個函數庫,這個函數庫為我們做了一些最基本的和底層打交道的處理。像DX還提供了一些常用的3D函數庫,算是一個二次開發。微軟在DX中做了很多二次開發,勉強也能算是一個引擎,用這些提供的功能來做小遊戲還可以,但用來直接支持大型遊戲開發的話還是差很遠。

下面主要說說和底層打交道那部分,DX和OPGL最大功勞在於充分調度和發揮了顯卡性能,把顯卡的特性用介面的形式提供出來,它們各自都有自己的管理層次、管理方法、管理管線。當使用和顯卡資源相關的API時,要仔細看這個函數各個參數說明,它會根據你的設定,來管理顯卡。它的管理只是一部分,還有很大一部分要引擎裡面自己處理。

如果你不想自己寫驅動或者調用驅動程序介面,但還想控制顯卡,這時就要用到這些API了。D3D(DX中主要處理3D的)和OPGL使用上還是有很大不同,學習他們也要花費一些時間。筆者當初學習時,由於不了解3D渲染流程,學起來特別困難,於是我轉而先學習製作「軟引擎」(用CPU來實現顯卡提供的硬體功能),然後回來再學D3D,就很容易理解了。

至於選擇學習D3D還是OPGL,按現在的勢頭,隨著移動端的興起,OPGL用的要多些,但它們本質是差不多的。

8.彙編指令

我們已經離原始的計算機時代很遙遠了,現在寫遊戲基本都用C#和JS等非常安全的高級語言,即使出現錯誤,程序也不會因崩潰停止運行。雖然這些高級語言方便很多,但如果你要寫引擎,我相信C和C++還是首選。業界對C和C++哪個高效的爭論我這裡不想去談,依個人觀點,對大型軟體工程來說,架構優先,哪怕犧牲一點點效率也是可以的,但記住是一點點。

上面說到那麼多,那麼彙編還有什麼用處呢?筆者覺得現在的環境下,至少還有3個用處:

1.數學庫用到的算不上彙編指令,但也算是指令級別的,為了加速數學運算,用CPU提供的單指令多數據流指令來計算。

2.很多外網崩潰,你沒有debug信息,你只有崩潰當時的那段的彙編指令代碼和寄存器裡面的值,這對找到崩潰根源有很大幫助,哪怕是找不到也還有預測到的可能。

3.shader反編譯還原實現效果。有時候有些遊戲有很酷的效果,你想知道它是怎麼實現的,這個就要通過圖形工具截取出一幀,找到這個效果的實現,其中一個最重要的就是得到彙編的shader,反彙編出真正高級圖形編程語言,得到它實現的原理。

如果你感興趣,可以學習下彙編指令,掌握函數在彙編中是如何運作的,當然這部分是選學內容。數學庫中,有非指令形式語句可以使用,它們相對彙編更簡單,基本來說,現學現用足矣。

9.引擎工作流

所謂引擎的工作流就是引擎在製作遊戲過程中的工作流程。不同的引擎有著不同的工作流程。

早期製作遊戲的一種方式,就是所有的模型,特效,還有場景,燈光等都在建模軟體中製作,因為當時的對遊戲的需求並沒有現在這麼強,建模軟體的功能就足夠滿足遊戲的需要。然後把所有這些都導出成文件,引擎來讀取文件,把這些都還原回來。後來隨著引擎的不斷的發展和製作流程改進,遊戲的複雜度增加,建模軟體不能滿足所有功能的需求,就開始有了場景編輯器(比如地形或者植被等,在建模軟體裡面很難高效的做出來,不過目前已經出現專門編輯地形的軟體可以完成這些)。在慢慢的,就分離出來,特效編輯器,材質編輯器,技能編輯器,資源管理等等。

圖2-19 引擎的工作流程

建模軟體負責製作模型(就是一堆三角形頂點數據),常用的就是3DMAX,貼圖軟體負責製作貼圖 常用的就是Photoshop。

高模軟體負責製作Normal貼圖 ,常用的是Zbrush。

動作軟體負責給模型蒙皮和製作動作 ,常用的就是3DMAX。

其實外部導入到引擎的資源基本上只有這些,因為這些東西需要很強的專業軟體去做,也有些貼圖和模型都是通過引擎製作。任何東西都是在發展進化的,現在引擎的工作流逐漸趨於成熟化,這也極大的提升了製作遊戲的效率。無論是Unreal還是Unity,差不多都是這樣的一個架構。也許未來的引擎工作流會更加先進,可以更快的製作出遊戲來。

當然不同的引擎有著不同的資源類型,任何東西的都可以稱為資源,這個就看引擎的具體組織了,大部分資源都是可以復用的,也就是內存裡面只有一份拷貝。

沒有接觸過引擎的人可能對圖2-19裡面的術語比較陌生,甚至不知道它是怎麼回事。別擔心,讀完本書,我想你會有一個深刻的認識。

習題

1.算出一個點到一個平面的距離?

2.求2個向量的夾角。

3.3D流水線中,與相機近平面相交的三角形為什麼要切割? 如果三角形和遠平面相交呢?如果三角形和相機上下左右的面相交呢?

4.嘗試用Unity3D做個小遊戲,體驗一些書中所說的引擎工作流。


推薦閱讀:

[GDC17] FrameGraph Extensible Rendering Architecture in Frostbite
《Exploring in UE4》Session與Onlinesubsystem[概念理解]
[DOD Series][GCAP09] Pitfalls of Object Oriented Programming
從紋理中生成法線貼圖
從零開始手敲次世代遊戲引擎(五十二)

TAG:遊戲引擎 | 遊戲編程 |