王建華
(四川大學(xué)計算機學(xué)院,成都 610065)
游戲引擎[1],是經(jīng)過精心設(shè)計,可以對游戲進(jìn)行基礎(chǔ)支持的一系列實時處理模塊的有機結(jié)合,是游戲的核心程序。在游戲中,玩家所體驗到的場景的運行速度、絢麗的特效,真實的渲染效果等各方面都是由游戲引擎決定的。3D游戲引擎是游戲引擎中的一個難點,是為3D游戲量身定做的一系列工具的總和,要比2D環(huán)境下的引擎的設(shè)計復(fù)雜得多。
3D游戲引擎是很復(fù)雜的,實現(xiàn)一個完整的3D游戲引擎不是一件易事,為了簡化項目復(fù)雜度并且保證引擎能進(jìn)行正常的工作,只實現(xiàn)3D游戲引擎的基礎(chǔ)圖形部分。因為這個部分可以將游戲的輸入數(shù)據(jù)轉(zhuǎn)化為輸出圖形,并在屏幕上進(jìn)行顯示,人們所能接收的經(jīng)過處理的信息就是顯示在屏幕上的圖形,這個部分的好壞直接影響到了使用該3D圖形渲染引擎開發(fā)的游戲的體驗。
由于包含著色器的3D渲染引擎的實現(xiàn)比較復(fù)雜,不便于初學(xué)者理解,本文采用比較容易實現(xiàn)的固定管線,雖然固定管線的渲染效果比著色器的渲染效果差,但是其工作流程十分清晰,原理也比較容易理解,便于初學(xué)者掌握,并激發(fā)其在這個方向上繼續(xù)研究下去的動力。管線最終的流程如圖1所示。
圖1
(1)頂點緩沖區(qū)
用于存儲用戶輸入頂點的位置數(shù)據(jù),顏色數(shù)據(jù),法線數(shù)據(jù),并存儲各頂點在攝相機坐標(biāo)系下的深度值,為三角形繪制時的插值計算提供必須的深度值。頂點緩沖區(qū)還應(yīng)提供復(fù)制的功能,以及能對頂點進(jìn)行變換的接口。
(2)索引緩沖區(qū)
用于存儲由頂點所構(gòu)成的平面的面數(shù)據(jù)(為了便于計算,統(tǒng)一采用三角形平面)這些數(shù)據(jù)有:構(gòu)成三角形的三個頂點的序號,三角形的頂點的卷繞方式,三角形平面的面顏色,三角形平面的紋理以及其各頂點的紋理坐標(biāo)。索引緩沖區(qū)還應(yīng)提供平面的背面剪裁功能,及時剔除不需要進(jìn)行繪制的平面,減少不必要的計算開銷,提升引擎的渲染效率。
(3)屏幕緩沖區(qū)
用于存儲屏幕某點最終應(yīng)該顯示的顏色,對于有多個3D空間中的點都會變換到同一屏幕上的點的情況,為了簡化問題,認(rèn)為所有的平面都是不透明的,不進(jìn)行顏色遮罩處理,而是簡單地選取距離攝相機最近的點的顏色作為此點的最終色,在一次繪制完成后,清空屏幕緩沖區(qū),然后進(jìn)行下一次繪制。
(4)幾何變換中的基本工具
為固定管線提供基本的功能支持,這些工具包括,三維向量,四維向量,三階矩陣,四階矩陣,攝相機,管線中經(jīng)常要使用這些工具,例如,可用其進(jìn)行所需的各種變換,將3D空間中的點映射到屏幕空間上。
(5)圖片采樣器
用于讀取資源圖片,并生成MipMap所需的減采樣后的紋理,并負(fù)責(zé)對圖片的存儲結(jié)構(gòu)進(jìn)行分析,得到所需要的像素的顏色,在圖片使用完后,負(fù)責(zé)資源的釋放工作,防止內(nèi)存資源過于緊張。
(6)場景圖
用于處理多對象之間有層次關(guān)系的情境,只需對頂層實體進(jìn)行變換,即可實現(xiàn)對其子實體的級連變換,很大程度上簡化了使用此3D圖形渲染引擎的游戲開發(fā)者的工作,使其將更多的精力投入到游戲其他方面的設(shè)計與制作中,提升開發(fā)游戲的效率,縮短游戲的開發(fā)周期。
(1)世界空間變換
在3D圖形程序中,有些物體的位置在整個程序運行期間都不會變化(相對于游戲世界),我們稱其為靜態(tài)對象;而有些物體不是靜止不動的,而是需要根據(jù)輸入的參數(shù)或根據(jù)自身的運行狀態(tài)進(jìn)行動態(tài)調(diào)整的,我們稱其為動態(tài)對象。對于后者,我們應(yīng)提供一些必要的動態(tài)變換功能,例如對象的平移和旋轉(zhuǎn),有了這個功能以后,用戶就可以很方便地對動態(tài)對象進(jìn)行控制,使對象能按設(shè)定的模式進(jìn)行工作,而不用在每幀更新時輸入對象在新位置的數(shù)據(jù),因為其在新位置的數(shù)據(jù)會自動計算,在很在程度上減少了用戶的工作量。
(2)視點空間變換
我們需要通過模擬人眼觀察物體的過程或模擬照相機攝像的過程來實現(xiàn)較為真實的渲染,因此需要將全部對象轉(zhuǎn)換到視點坐標(biāo)系下,在這個坐標(biāo)系下,攝相機處在原點位置,攝相機的朝向向量,攝相機的俯仰程度向量,以及一個側(cè)向向量構(gòu)成了此坐標(biāo)系的三個基向量,這樣做符合人們的日常生活經(jīng)驗,便于人們理解和接受。在攝相機空間中,我們需要進(jìn)行平面的背面剪裁,及時剔除無需考慮的內(nèi)容,提升系統(tǒng)的效率。
(3)剪裁空間變換
對視角空間進(jìn)行進(jìn)一步的變換,將由近平面,遠(yuǎn)平面,左平面,右平面,上平面和下平面組成的一個平頭視錐體轉(zhuǎn)化為一個立方體,由于對立方體的剪裁效率要遠(yuǎn)遠(yuǎn)大于不規(guī)則形體的剪裁效率[4],所以通過這個變換,降低了后續(xù)的視椎體剪裁操作的計算量,減少了資源的消耗。
(4)標(biāo)準(zhǔn)空間變換
將剪裁空間的非標(biāo)準(zhǔn)立方體轉(zhuǎn)化為一個標(biāo)準(zhǔn)立方體,標(biāo)準(zhǔn)化的好處是可以更好地表現(xiàn)出各點的位置關(guān)系,并且為后續(xù)工作的進(jìn)行奠定了基礎(chǔ)。
(5)屏幕空間變換
將標(biāo)準(zhǔn)空間中的點變換到屏幕空間中用以顯示,這個過程的一個非常重要的任務(wù)是進(jìn)行相應(yīng)的左右手系的變換以便正確顯示計算結(jié)果。
在此示例中,存在一個天空盒,天空盒[5]實際上是在立方體的內(nèi)部觀察立方體,并且將圖片貼在立方體內(nèi)側(cè)而形成的。在立方體的中心放置了一個攝相機用于觀察,攝相機會不停地進(jìn)行水平旋轉(zhuǎn),因此可見內(nèi)容會隨著時間而出現(xiàn)周期性變化,實驗總共使用了3張圖片用來進(jìn)行貼圖操作,其中,一張用于地面貼圖,一張用于天空貼圖,還有一張用于四周景色的貼圖。在此示例中采用透視投影,因此會出現(xiàn)近大遠(yuǎn)小的感覺,距離攝相機近的貼圖會有明顯的拉伸感,見圖2:從中可以看出,總體渲染效果能滿足一般的3D圖形程序的要求,但是由于浮點數(shù)的誤差,在兩個平面的交接處,有可能會出現(xiàn)一點黑色的縫隙。
圖2
本文利用C++語言[3]和Visual Studio 2015開發(fā)工具,實現(xiàn)了3D游戲引擎中的渲染部分,并通過對圖形渲染部分的詳細(xì)說明,使讀者對3D游戲引擎中的渲染部分有了更深入的了解。
當(dāng)前完成的3D渲染引擎實現(xiàn)了進(jìn)行3D渲染時所用的基本功能,還可以完成一些較為高級的功能,但是這僅僅是一個示例性質(zhì)的引擎,并沒有諸如資源管理、配套的開發(fā)工具和與硬件良好結(jié)合等在商業(yè)用的高端引擎中存在的一些特性,因此這個引擎是不完善的,有著很大的改進(jìn)空間,但是此示范性引擎的優(yōu)點在于以通俗易懂的方式向讀者闡明了3D渲染引擎的一種實現(xiàn)方式,達(dá)到了便于理解和掌握這一目的。
參考文獻(xiàn):
[1]David.H.Eberly.3D游戲引擎設(shè)計,實時計算機圖形學(xué)的應(yīng)用方法[M].北京:清華大學(xué)出版社,2013.
[2]王長波,高巖.3D計算機圖形學(xué)[M].北京:機械工業(yè)出版社,2010:10-90.
[3]Charles.Petzold著.Windows程序設(shè)計.方敏,張勝等譯.北京:清華大學(xué)出版社,2010:506-642.
[4]David.F.Rogers著.計算機圖形算法基礎(chǔ)[M].石教英,彭群生等譯.北京:機械工業(yè)出版社,2005.
[5]石教英.虛擬現(xiàn)實基礎(chǔ)及使用算法[M].北京:科學(xué)出版社,2002.