游戏引擎算法探究:游戏核心之固定流水线
3D游戲或者是虛擬現實逐步成為市場主流,由于IT行業的薪資普遍比較高,很多IT開發者轉行到游戲開發或者說是虛擬現實開發中。但是大部分人只限于會使用引擎開發工具,比如使用Unity3D引擎或者是UE4虛幻引擎,它們能利用引擎提供的編輯器和組件快速的搭建出一款游戲,但是在遇到一些棘手問題時卻是束手無策,出現這樣的問題主要是因為對于一些3D的基本原理不是很清楚,接下來給讀者詳細介紹一下固定流水線中的矩陣算法。 固定流水線主要原理是3D模型在屏幕上的顯示是按照一個固定的流程完成的,這個流程就是固定流水線。接下來主要是給讀者介紹流水線中涉及到的矩陣算法,3D游戲中的模型都是美術制作的,美術制作的模型給程序使用,這個模型相對它自身來說就是局部坐標,制作的模型需要放到引擎的編輯器中這樣才能制作出游戲場景也就是世界坐標系。美術制作的模型是有材質貼圖,法線貼圖,高光貼圖等。將它們放到游戲場景中,這個過程中不影響模型自身的顏色,材質,texture坐標,但會影響模型的頂點,法線,和光線的幾何分布。在世界坐標系中的物體是可以進行旋轉,縮放,平移變換,這些變換都會涉及到矩陣運算,矩陣公式如下所示:
平移變換矩陣
?
縮放矩陣
?
繞X軸旋轉矩陣
?
繞Y軸旋轉矩陣
?
繞Z軸旋轉矩陣
?
OpenGL 是使用列主序矩陣,即列矩陣,因此我們總是倒過來算的(左乘矩陣,變換效果是按從右向左的順序進行)。物體在世界坐標系中變換就需要模型中的頂點與上述矩陣相乘得到,當然我們現在不需要自己去實現這些底層的運算,完成了矩陣變換后,接下來進入可視坐標系中,玩家要看到場景中的模型必須將模型放到攝像機下面,在可視坐標系中是要改變模型的頂點,法線和光線,所以這個階段的輸出是更改了模型的所有幾何信息以適配出的標準視角空間。所有深度信息都來自這個視角坐標系的Z值。一旦可視坐標系確定,這個時候模型頂點顏色會被設定,任何指定的光線操作都會完成,所有這些光線參數,位置,方向,法線,頂點材質都會決定頂點的顏色,而這個階段處理之后,每個頂點也已經有一個顏色值。可視坐標系有兩種變換方式:一是透視攝像機,另一種是正交攝像機。這兩種攝像機對應兩個變換矩陣,一是透視變換矩陣如下所示:假設:l = left, r = right, b = bottom, t = top, n = zNear, f = zFar,有:
?
攝像機效果圖如下所示:
?
接著再看看正交攝像機矩陣示意圖:
?
假設:xmax = right, xmin = left, ymax = top, ymin = bottom, zmax = far, zmin = near,正交投影的計算可分為兩步:首先平移到視錐體的中心,然后縮放。
平移矩陣:
?
縮放矩陣
?
正交投影矩陣R = S X T
?
提示一下,裁剪空間也是在進入可視坐標系之前完成的,再看一下視口變換如下圖所示:
?
解釋一下,clipSpace是相機裁剪完成后,讀者如果QQ靚號轉讓使用過Unity3D引擎知道,它的視口大小是0,0,1,1,這個是被標準化處理過了,也就是圖中的Normalized Device Space。但是屏幕上的坐標數值不是用0,1表示的,也就是圖中的Window Space,屏幕的大小尺寸比如 640 * 480,720 * 640,1280 * 720等,它們之間有個對應關系,對應公式如下所示:
公式中的參數(xw, yw)是屏幕坐標,(x, y, width, height)是傳入的參數,(xnd, ynd)是投影之后經歸一化之后的點,這樣你可以計算出屏幕上的點坐標。如果讀者對矩陣變換不理解可以查看《線性代數》和《3D數學基礎:圖形與游戲開發》這兩本書。固定流水線示意圖如下所示:
?
在編程時經常會用到MVP,MV等這種系統代碼定義的變量,M表示Model局部坐標系,View可視坐標系,P表示投影坐標系也就是裁剪。它是引擎已經實現好的,提供了接口給開發者使用。在程序中實現的效果如下圖所示:
?
CPU是單線程的,它只能一步一步處理的,按照這個固定的流程就可以渲染出游戲場景在屏幕上顯示出來。
總結:
上述講述的是固定流水線,其實由于引擎已經為開發者封裝好了,這些實現都是在引擎內部處理的,對外只提供了接口,開發者只需要調用接口就可以實現,筆者認為要想學好一門技術,必須做到精才可以,后面再給讀者介紹一下可編程流水線。
總結
以上是生活随笔為你收集整理的游戏引擎算法探究:游戏核心之固定流水线的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 写给游戏编程自学者的入门指南
- 下一篇: 游戏中的实时光线追踪技术与技巧