王建華
(四川大學計算機學院,成都 610065)
游戲引擎[1],是經過精心設計,可以對游戲進行基礎支持的一系列實時處理模塊的有機結合,是游戲的核心程序。在游戲中,玩家所體驗到的場景的運行速度、絢麗的特效,真實的渲染效果等各方面都是由游戲引擎決定的。3D游戲引擎是游戲引擎中的一個難點,是為3D游戲量身定做的一系列工具的總和,要比2D環境下的引擎的設計復雜得多。
3D游戲引擎是很復雜的,實現一個完整的3D游戲引擎不是一件易事,為了簡化項目復雜度并且保證引擎能進行正常的工作,只實現3D游戲引擎的基礎圖形部分。因為這個部分可以將游戲的輸入數據轉化為輸出圖形,并在屏幕上進行顯示,人們所能接收的經過處理的信息就是顯示在屏幕上的圖形,這個部分的好壞直接影響到了使用該3D圖形渲染引擎開發的游戲的體驗。
由于包含著色器的3D渲染引擎的實現比較復雜,不便于初學者理解,本文采用比較容易實現的固定管線,雖然固定管線的渲染效果比著色器的渲染效果差,但是其工作流程十分清晰,原理也比較容易理解,便于初學者掌握,并激發其在這個方向上繼續研究下去的動力。管線最終的流程如圖1所示。

圖1
(1)頂點緩沖區
用于存儲用戶輸入頂點的位置數據,顏色數據,法線數據,并存儲各頂點在攝相機坐標系下的深度值,為三角形繪制時的插值計算提供必須的深度值。頂點緩沖區還應提供復制的功能,以及能對頂點進行變換的接口。
(2)索引緩沖區
用于存儲由頂點所構成的平面的面數據(為了便于計算,統一采用三角形平面)這些數據有:構成三角形的三個頂點的序號,三角形的頂點的卷繞方式,三角形平面的面顏色,三角形平面的紋理以及其各頂點的紋理坐標。索引緩沖區還應提供平面的背面剪裁功能,及時剔除不需要進行繪制的平面,減少不必要的計算開銷,提升引擎的渲染效率。
(3)屏幕緩沖區
用于存儲屏幕某點最終應該顯示的顏色,對于有多個3D空間中的點都會變換到同一屏幕上的點的情況,為了簡化問題,認為所有的平面都是不透明的,不進行顏色遮罩處理,而是簡單地選取距離攝相機最近的點的顏色作為此點的最終色,在一次繪制完成后,清空屏幕緩沖區,然后進行下一次繪制。
(4)幾何變換中的基本工具
為固定管線提供基本的功能支持,這些工具包括,三維向量,四維向量,三階矩陣,四階矩陣,攝相機,管線中經常要使用這些工具,例如,可用其進行所需的各種變換,將3D空間中的點映射到屏幕空間上。
(5)圖片采樣器
用于讀取資源圖片,并生成MipMap所需的減采樣后的紋理,并負責對圖片的存儲結構進行分析,得到所需要的像素的顏色,在圖片使用完后,負責資源的釋放工作,防止內存資源過于緊張。
(6)場景圖
用于處理多對象之間有層次關系的情境,只需對頂層實體進行變換,即可實現對其子實體的級連變換,很大程度上簡化了使用此3D圖形渲染引擎的游戲開發者的工作,使其將更多的精力投入到游戲其他方面的設計與制作中,提升開發游戲的效率,縮短游戲的開發周期。
(1)世界空間變換
在3D圖形程序中,有些物體的位置在整個程序運行期間都不會變化(相對于游戲世界),我們稱其為靜態對象;而有些物體不是靜止不動的,而是需要根據輸入的參數或根據自身的運行狀態進行動態調整的,我們稱其為動態對象。對于后者,我們應提供一些必要的動態變換功能,例如對象的平移和旋轉,有了這個功能以后,用戶就可以很方便地對動態對象進行控制,使對象能按設定的模式進行工作,而不用在每幀更新時輸入對象在新位置的數據,因為其在新位置的數據會自動計算,在很在程度上減少了用戶的工作量。
(2)視點空間變換
我們需要通過模擬人眼觀察物體的過程或模擬照相機攝像的過程來實現較為真實的渲染,因此需要將全部對象轉換到視點坐標系下,在這個坐標系下,攝相機處在原點位置,攝相機的朝向向量,攝相機的俯仰程度向量,以及一個側向向量構成了此坐標系的三個基向量,這樣做符合人們的日常生活經驗,便于人們理解和接受。在攝相機空間中,我們需要進行平面的背面剪裁,及時剔除無需考慮的內容,提升系統的效率。
(3)剪裁空間變換
對視角空間進行進一步的變換,將由近平面,遠平面,左平面,右平面,上平面和下平面組成的一個平頭視錐體轉化為一個立方體,由于對立方體的剪裁效率要遠遠大于不規則形體的剪裁效率[4],所以通過這個變換,降低了后續的視椎體剪裁操作的計算量,減少了資源的消耗。
(4)標準空間變換
將剪裁空間的非標準立方體轉化為一個標準立方體,標準化的好處是可以更好地表現出各點的位置關系,并且為后續工作的進行奠定了基礎。
(5)屏幕空間變換
將標準空間中的點變換到屏幕空間中用以顯示,這個過程的一個非常重要的任務是進行相應的左右手系的變換以便正確顯示計算結果。
在此示例中,存在一個天空盒,天空盒[5]實際上是在立方體的內部觀察立方體,并且將圖片貼在立方體內側而形成的。在立方體的中心放置了一個攝相機用于觀察,攝相機會不停地進行水平旋轉,因此可見內容會隨著時間而出現周期性變化,實驗總共使用了3張圖片用來進行貼圖操作,其中,一張用于地面貼圖,一張用于天空貼圖,還有一張用于四周景色的貼圖。在此示例中采用透視投影,因此會出現近大遠小的感覺,距離攝相機近的貼圖會有明顯的拉伸感,見圖2:從中可以看出,總體渲染效果能滿足一般的3D圖形程序的要求,但是由于浮點數的誤差,在兩個平面的交接處,有可能會出現一點黑色的縫隙。

圖2
本文利用C++語言[3]和Visual Studio 2015開發工具,實現了3D游戲引擎中的渲染部分,并通過對圖形渲染部分的詳細說明,使讀者對3D游戲引擎中的渲染部分有了更深入的了解。
當前完成的3D渲染引擎實現了進行3D渲染時所用的基本功能,還可以完成一些較為高級的功能,但是這僅僅是一個示例性質的引擎,并沒有諸如資源管理、配套的開發工具和與硬件良好結合等在商業用的高端引擎中存在的一些特性,因此這個引擎是不完善的,有著很大的改進空間,但是此示范性引擎的優點在于以通俗易懂的方式向讀者闡明了3D渲染引擎的一種實現方式,達到了便于理解和掌握這一目的。
參考文獻:
[1]David.H.Eberly.3D游戲引擎設計,實時計算機圖形學的應用方法[M].北京:清華大學出版社,2013.
[2]王長波,高巖.3D計算機圖形學[M].北京:機械工業出版社,2010:10-90.
[3]Charles.Petzold著.Windows程序設計.方敏,張勝等譯.北京:清華大學出版社,2010:506-642.
[4]David.F.Rogers著.計算機圖形算法基礎[M].石教英,彭群生等譯.北京:機械工業出版社,2005.
[5]石教英.虛擬現實基礎及使用算法[M].北京:科學出版社,2002.