袁瓊,劉立(武漢東湖學院 計算機科學學院,武漢 430212)
?
DX 11高級渲染技術(shù)下3D游戲引擎①
袁瓊,劉立
(武漢東湖學院 計算機科學學院,武漢 430212)
摘 要:研究了DirectX 11高級渲染技術(shù)并成功應用于3D游戲引擎中.DirectX 11高級渲染技術(shù)包括MultiTex、CubeMap、NormalMap、ShadowMap等.引擎運用了MultiTex技術(shù)繪制3D地形; 使用了CubeMap技術(shù)進行環(huán)境貼圖渲染; 使用了NormalMap技術(shù)進行特殊紋理處理; 使用了ShadowMap技術(shù)實現(xiàn)了成熟逼真的陰影效果.文中還詳細給出了引擎的解釋器框架和多分支渲染核心框架設(shè)計,并對引擎完成了相關(guān)技術(shù)用例測試,結(jié)果表明了其逼真的圖形效果.
關(guān)鍵詞:DirectX 11; MultiTex; CubeMap; ShadowMap; 3D游戲引擎
計算機軟硬件發(fā)展日新月異,現(xiàn)代計算機軟件以游戲為代表的高品質(zhì)程序為達到逼真的圖形效果,紛紛加強了程序?qū)PU圖形顯卡的應用.程序與顯卡之間的接口目前有兩種,一個是OpenGL[1],另一個則是DirectX(簡稱DX)[2],在Windows/Xbox平臺游戲開發(fā),絕大多數(shù)均采用DX,在移動平臺(跨平臺)則多用OpenGL,它們除了API有所不同,就其實質(zhì)而言,算法與基礎(chǔ)理論均是大同小異.在計算機領(lǐng)域,最復雜的莫過于次世代游戲[3],它集合了幾乎所有計算機相關(guān)技術(shù),包括對多而大的文件的讀寫加密解密處理、復雜的CPU/GPU實時運算、以及聲光輸出處理、最嚴格的優(yōu)化需求等,幾乎榨干計算機硬件的一切性能.區(qū)別于普通的游戲軟件,次世代游戲一方面能帶給用戶更加完美的體驗,另一方面更能促進普通游戲行業(yè)與相關(guān)產(chǎn)業(yè)(如3D仿真、CG影視等)發(fā)展.
本文的研究正是在這種背景下正式提出的,目標是研究DX11高級渲染技術(shù)并應用于3D游戲引擎的開發(fā)中.
本文引擎所使用的每一個高級條目都屬次世代技術(shù)類,又稱為高級技術(shù)類.包含MultiTex、CubeMap、NormalMap、ShadowMap[4]等.
2.1MultiTex
MultiTex即多紋理混合,如果要求繪制一幅包含草地、沙地、泥地、青石板等細致的廣袤地形圖,怎么做,繪制一幅真實超大紋理鋪在地表多邊形上嗎?在2D時代,有很多的確就是這么干的,然而3D時代,單純依賴拼塊的方式已經(jīng)行不通,因為在超大仿真地圖繪制上,不可能也不允許使用如此高昂的代價來完成,這時候就需要運用到MultiTex技術(shù),本文以引擎工程中的地表編輯器(如圖1所示)中實際的一副地表(如圖2所示)為例進行論述.
圖1 地圖紋理編輯器
圖2 局部最終成像(左)與fix混合紋理(右)
圖3 兩幅混色紋理素材一(左)與素材二(右)
圖2(左)這幅地形圖只使用了圖3中的兩種素材,然而做到了無縫拼接的效果,其實現(xiàn)過程如下:
首先,假設(shè)有一塊多邊形地圖塊域采用了圖3中的素材一和素材二,按照逐像素著色方式分別讀取素材中每個點p的顏色值,假設(shè)素材一在點p對應的顏色為C1,素材二在點p的顏色為C2; 然后載入其匹配的fix混色紋理點p的顏色,假設(shè)找到該點對應位置顏色C3; 最后依據(jù)以下公式,得到其最終顏色成像:
其中g(shù)為C3的灰度值.
2.2CubeMap
計算機圖形學中紋理不僅僅是貼圖,它還包含很多特殊的紋理.貼圖只是2D紋理,還有3D紋理,CubeMap就是典型的一種3D紋理,主要用于模擬天空盒以及環(huán)境反射.
圖4 具備環(huán)境反射技術(shù)的物體繪制
如圖4所示,環(huán)境反射就是讓一個模型反射周圍場景,就好像鏡子的效果,它是相當逼真而且代價極低的一種技術(shù).使用過程包括兩個部分,一是制作立方體環(huán)境貼圖,二是應用到渲染計算階段.
圖5 一個預制作的立方體環(huán)境貼圖展開樣式
立方體環(huán)境貼圖可以如圖5中預制作,然后直接投入使用,也可以實時渲染制作.實時制作代價會稍高一些,如果不縮減立方體環(huán)境貼圖每個面的分辨率,理論上渲染代價額外高6倍.不過一般會將其縮放得很小,因為作為反射,不需要太高分辨率.得到立方體環(huán)境貼圖后就要應用它.
在本引擎中,環(huán)境貼圖渲染的實現(xiàn)方案如下:
圖6 算法草圖
如圖6所示,請把外框想象作立方體環(huán)境貼圖,P是要渲染的點,e是視點位置,首先要得到V這條向量,然后把V看作查找向量,找到SampledTexel.
在著色器中核心代碼:
這里的samLinear是一種點采樣方式.
圖7 水面反射天空的渲染
圖7的水面即采取了這種辦法反射了環(huán)境天空的效果.
2.3NormalMap
圖8 NormalMap圖例
本引擎中采用了NormalMap后的效果如圖8所示,注意手臂和樹干部分的不光滑特性.
圖9 手臂NormalMap技術(shù)使用前(左)后(右)對比
如果沒有NormalMap,如圖9(左)所示,你看到的人物手臂會非常平滑,絲毫不會有凹凸不平的材質(zhì)感;同樣,你看到的樹干樹葉也不會呈現(xiàn)高光效果,你看到的水面將是平的或者呈明顯多邊形化.NormalMap也是一種特殊紋理技術(shù),是一項次世代圖形基礎(chǔ)標準.其實現(xiàn)過程如下:
首先需要法線貼圖,然后獲取紋理的正切空間、頂點的正切空間、在切線空間和物體空間之間變化,解壓縮獲得新的法線擾動值等,不同于以往的紋理只可以用于2D表面,它可以應用到3D表面的特殊紋理.作為凹凸紋理的擴展,它使每個平面的各像素擁有了高度值,包含了許多細節(jié)的表面信息,能夠在平平無奇的物體外形上,創(chuàng)建出許多種特殊的立體視覺效果.法線貼圖是最近比較被關(guān)注的技術(shù),也將成為以后CG領(lǐng)域的一大主流技術(shù),也就是游戲界被稱為的次世代技術(shù).圖10中給出了圖8中使用到的NormalMap紋理(局部).
圖10 NormalMap紋理(局部)
2.4Shadow Map
這也是一個復雜技術(shù),可以用來實現(xiàn)現(xiàn)有最成熟逼真的陰影效果.與之對應的是Shadow Volume,它原理更為復雜,運算復雜度與場景復雜度有關(guān)而不可預測.
對于方向性燈光,如太陽光,其過程如下:
(1)需要把視點(camera view)的視椎體(camera frustum)搬到光源的view space.
5.試做填空。聽力材料播放完后,學生要進行歸納總結(jié),判斷是否聽懂并明白大概意思,在明白的基礎(chǔ)上,作相關(guān)方面的練習,以修正學生的聽力,提升他們對學習材料的理解。
(2)求得view matrix的各個參數(shù): farZ參數(shù)為在view space中視椎體的maxZ-minZ; nearZ為0.0; upVector是方向光的任意一個垂直向量; lookAt是視椎體的“質(zhì)心”.
(3)計算view matrix,把veiw matrix搬到平行投影坐標系(orthographic projection space).
(4)再次渲染場景的過程中,將每個片斷(像素)變換到前述眼坐標系中,并縮放到[0,1]的范圍內(nèi)以便查詢紋理.
(5)以當前片斷在眼坐標中的S、T坐標查詢深度紋理獲得深度值,將此深度值與當前片斷的R坐標進行比較,若R坐標大于深度值,則當前片斷在陰影中; 否則當前片斷受光照.
具體在實現(xiàn)時,還會遇到各種意想不到的問題,比如Z-fighting、各矩陣調(diào)節(jié)等.
3.1引擎解釋器框架
引擎[5][6]的質(zhì)量決定整個最終產(chǎn)品所能達到的品質(zhì),采用C++編碼能確保更加容易發(fā)揮硬件性能,在主循環(huán)過程中能承受更大壓力,更小的延遲.這也意味著將有更加穩(wěn)定的幀率.
引擎核心采取與世界水平保持一致的DX11 API版本[7]與HLSL5.0,相比DX9,雖然可參考內(nèi)容更加匱乏,但更容易擴展,對未來硬件更加契合.
引擎還運用到XNA數(shù)學庫,用以方便地支持各種矩陣操作運算.
音頻視頻這兩項不是本文重點討論內(nèi)容,故而采取Win32下的MCI.
為了模擬3D世界,一些物理數(shù)學概念也必須了解,包括各項矩陣轉(zhuǎn)換、物理光照、力學系統(tǒng)等.它們將用于展現(xiàn)模型世界到屏幕、模擬光照、陰影以及物體的受力運動、粒子群等.
引擎中的模型系統(tǒng)處于精簡考慮,采用自定義的文件系統(tǒng),模型原件來自3DSMAX,通過PandaDirectX導出.x文件,經(jīng)引擎編碼編輯器修改,從文本格式文件修改為二進制文件.紋理由Nvidia開發(fā)的Normal Texture Tools 通過Photoshop制作.
本系統(tǒng)的引擎解釋器框架如圖11所示.
0.讀取配置文件
-包括開啟游戲時的分辨率,是否是全屏,渲染質(zhì)量等設(shè)定.
-預載入運鏡攝像機軌道配置文件、粒子系統(tǒng)的產(chǎn)生、運動配置文件.
1.依據(jù)配置文件,進行初始化窗口InitWindow和初始化3D設(shè)備InitDecice操作.
InitWindow 通過調(diào)用AdjustWindowRect函數(shù)創(chuàng)建Win32窗體.
InitDecice 創(chuàng)建DXGI_SWAP_CHAIN_DESC并填充結(jié)構(gòu),通過D3D11CreateDeviceAndSwapChain執(zhí)行交換鏈、設(shè)備、渲染環(huán)境的創(chuàng)建,隨后創(chuàng)建設(shè)定各種不同的深度模板紋理視圖、各depthstencilstate、rasterozer裁剪以及Shader載入編譯,然后為各個Shader創(chuàng)建紋理與常量緩沖區(qū).
2.初始化腳本系統(tǒng),它將執(zhí)行main入口腳本內(nèi)的內(nèi)容,包括載入播放音視頻、模型、地圖等.
本文設(shè)計的腳本系統(tǒng)是一種解釋性語言.腳本中的所有關(guān)鍵字、函數(shù)、邏輯系統(tǒng)均實際在C++程序中寫好,通過匹配,按照既定參數(shù)讀取方法讀取腳本并執(zhí)行,在效率上,唯一額外的操作就是I/O.
3.消息循環(huán)、渲染循環(huán)、程序結(jié)束的While結(jié)構(gòu),如果收到按鍵、鼠標消息則跳到4執(zhí)行對應操作,可能包括腳本的操作.如果收到退出游戲、關(guān)閉程序的消息則執(zhí)行6退出.其他情景下跳轉(zhuǎn)到5執(zhí)行渲染.
4.在這里執(zhí)行引擎腳本中預設(shè)的操作,例如鏡頭操作、讀取新場景等.在執(zhí)行完畢后將立刻再執(zhí)行3的主循環(huán)過程.為了保證渲染幀數(shù)的穩(wěn)定性,此處要求的延時不能超過16ms,如果超過這個值,游戲?qū)⒉豢杀苊獾漠a(chǎn)生跳幀、抖動感.
5.通過幀數(shù)限制決定是否進行渲染,如滿足條件則對場景按照要求進行渲染.待渲染結(jié)束后返回主循環(huán)等待下一幀.通常為了保持60fps,需要控制一個渲染循環(huán)時間在16.67ms內(nèi).無論是否進行渲染,函數(shù)均會執(zhí)行Timer操作,用以執(zhí)行延時類函數(shù).
6.當收到結(jié)束程序的消息則執(zhí)行退出消息.在此處需要負責清空內(nèi)存、保存存檔等操作.
圖11 引擎解釋器框架
3.2多分支渲染核心框架
將內(nèi)存中的數(shù)據(jù)在處理后傳輸給GPU的顯存,通過一系列技術(shù)手段將畫面以預期的方式呈現(xiàn)在屏幕上,其核心在于各式各樣的算法與技巧.
本系統(tǒng)的渲染核心框架如圖12所示.
圖12 多分支渲染核心框架
Timer_Fun()將執(zhí)行一些在腳本中定義的延時相關(guān)函數(shù),它能實現(xiàn)一些預定動畫、預定時觸發(fā)的動作等.因此無論這一幀是否執(zhí)行,它都要處理,在主線程中,它通常不適合執(zhí)行大量復雜的操作.
CheckAble()中需要計算當前幀是否達到繪制點,否則程序會執(zhí)行極限頻率Render()操作,對于超過60fps,人眼已經(jīng)無法感受到差別,考慮到GPU負載發(fā)熱、用戶將程序置于后臺等行為,有必要對幀率進行限制.
CleanBackBuffer()操作是用以清理上一個交換鏈上的紋理頁,它不是必須的,因為在大部分情景下,會完整繪制整個畫面.如此,舊頁面會被覆蓋.它能降低少量GPU負擔.
多分支渲染是整個引擎最復雜,也是衡量引擎質(zhì)量權(quán)重最大的部分.下面將具體闡述.
3.3多分支渲染過程及其效果
本項目使用修改的Shadow Map技術(shù),首先從光源方向構(gòu)建ShadowTransform,對所有物體(Clip掉近透明像素)進行渲染到最低1024、最高達4096分辨率,渲染Radius依Camera所見范圍動態(tài)調(diào)整在20-110的超級采樣深度圖中,然后再進行正常渲染,將像素點于燈光視角深度信息比對,并對邊緣進行多次采樣執(zhí)行高斯模糊計算實現(xiàn)平滑.
基于引擎對應的游戲類型,渲染按照層級模式反向渲染,即優(yōu)先渲染子對象,其后考慮渲染父對象,在渲染子對象時,同時進行相對屏幕的Z軸排序,優(yōu)先渲染距離屏幕近的,完全被遮蔽的物件則直接進行剔除操作,與一般2D圖形的畫家算法不同,這樣做節(jié)省頂點處理和像素處理,能極大限度的降低像素著色器的負載,從而達到在不影響畫面的情況下優(yōu)化性能的目的.
首先進行Shadow渲染,以最低質(zhì)量標準繪制場景,不繪制半透物體,從燈光視角對物體進行深度渲染,將紋理保存,然后通過這張燈光視角下的深度紋理,執(zhí)行光照渲染.測試效果如圖13所示,左圖無Shadow陰影,右圖開啟Shadow陰影,光源在圖示的右上角.
圖13 Shadow渲染效果對比圖
在渲染同層次物件時,優(yōu)先處理完全不透明物體,隨后處理半透明物體,在對半透明進行渲染時,關(guān)閉其深度寫入,以此解決渲染順序問題.
渲染完成后,進入PostRendering階段,在此階段,將執(zhí)行HDR渲染.HDR渲染技術(shù)全稱是High dynamic range,即高動態(tài)范圍渲染,由于現(xiàn)代計算機屏幕理論最大只能呈現(xiàn)0-255總計256個階的亮度色域,然而世界實際亮度范圍卻遠超于此,人眼對此會有一個瞳孔適應過程,類似于相機曝光,將所見場景亮度壓縮到可適應區(qū)域.HDR為模擬這樣一個適應過程應運而生.將場景渲染到一副較小解析度的紋理中,計算得到該紋理的最大亮度/最小亮度/以及平均亮度,接下來,將實際畫面中的所有亮度動態(tài)調(diào)節(jié)映射到0~1區(qū)間中來,以此實現(xiàn)該效果.通常Bloom也會在此同步運算,即獲得紋理中亮度大于某個值的點顏色保留,其他則設(shè)置為黑色,再將此紋理高斯模糊處理,最后同HDR結(jié)果相疊加,即可產(chǎn)生閃光區(qū)效果.如圖14所示,左圖無HDR,右圖開啟HDR渲染,右圖能看清楚更多細節(jié).再如圖15所示,左圖無HDR+BLOOM,右圖開啟HDR+BLOOM渲染,右圖能看到水面的波光粼粼.
圖14 HDR渲染效果對比圖
圖15 HDR+BLOOM渲染效果對比圖
接著是景深渲染,用以模擬攝像機鏡頭,人眼晶狀體視距.如圖16所示,左圖無景深效果,右圖為開啟景深,右圖呈現(xiàn)出了遠處模糊,近處清晰的逼真效果.
圖16 景深渲染效果對比圖
要達到這樣的效果,需要保存當前頁面的深度視圖,并將其存入紋理中,接下來讀取該深度紋理,通過腳本或者默認的視圖中心,得到默認“期望視距”,再在像素著色器中,根據(jù)該期望視距和實際深度值的比較,進行不同程度的高斯模糊,即可實現(xiàn)上述效果.
最后,在開啟NormalMap、CubeMap、ShadowMap、HDR、Bloom、景深后同一場景渲染對比效果如圖17所示,左為僅開啟多光源光照,右為開啟所有特效,明顯右圖效果更逼真.
以上實現(xiàn)效果只是和未進行渲染的圖像進行比較,下面以陰影為例考察其他引擎處理效果進行對比.
如圖18所示,來自于COMCAP平臺下的鬼泣4中人物場景效果.第一副圖片中,長椅上沒有主角尼祿的陰影,第二幅圖中,主角的武器、身后的建筑均沒有在背部產(chǎn)生應有的陰影.
圖17 最終渲染對比圖
圖18 觀察鬼泣4的紋理
事實上,由于鬼泣4中沒有動態(tài)光源,地圖所見大部分的建筑陰影,經(jīng)破解后觀察紋理發(fā)現(xiàn)均是美工提前渲染好的效果(非實時渲染),如圖19所示,如有動態(tài)光源,這種辦法顯然就不適用了.
圖19 使用動態(tài)光源前后
圖20來自于steam平臺下的DOTA2.放大圖片觀察,“卡爾”背部明顯可見到因Z-Fighting導致的陰影鋸齒,右圖近視角可見地面陰影鋸齒明顯.
圖20 DOTA2中“卡爾”場景效果圖
可見 ,本文在DX11高級渲染技術(shù)下的影子在表達效果上較很多3D游戲均有所改進,例如發(fā)行于steam平臺下的DOTA2及COMCAP下的鬼泣4等等.
本文在DirectX 11高級渲染技術(shù)的基礎(chǔ)上實現(xiàn)了一個3D游戲引擎,該引擎的開發(fā)具有如下特點:
使用C++制作了游戲引擎解釋器核心,它將執(zhí)行負擔最重的最終客戶端,直接呈現(xiàn)出游戲效果,同時大量基于HLSL的引擎研發(fā)技術(shù)將在此程序中得以體現(xiàn).
使用C開發(fā)了游戲編碼工具,執(zhí)行開發(fā)過程中極其復雜的處理請求.例如3D模型格式轉(zhuǎn)換,紋理拼接、代碼快速加密技術(shù)等.
使用C#進行了各項引擎編輯器工具集的快速開發(fā),它具備UI界面系統(tǒng),便于操作,各項配置系統(tǒng)由它產(chǎn)生與維護,例如UI系統(tǒng)編輯器、關(guān)卡、地圖設(shè)計系統(tǒng)等.
然而,游戲引擎研發(fā)包含了大量3D圖形核心技術(shù),包括陰影算法、光照系統(tǒng)、視差、法線紋理、模型系統(tǒng)、以及大量Post-Rendering渲染技術(shù)[8][9]等,都較為復雜,將作為后期進一步研究的方向.
參考文獻
1董槐林,徐天茂等.OGRE引擎中基于BVH的角色動畫的實現(xiàn)研究.計算機與現(xiàn)代化,2011(10).
2Sherrod A,Jones W.Beginning DirectX 11 game programming.Course Technology PTR,2011.
3Valdetaro A,Nunes G,Raposo A.Understanding shader model 5.0 with directx11.Course Technology PTR,2010.
4Pinheiro RB.Introduction to multithreaded rendering and the usage of deferred contexts in DirectX 11.Course Technology PTR,2011.
5耿衛(wèi)東.三維游戲引擎設(shè)計與實現(xiàn).杭州:浙江大學出版社,2008.
6陳占鋒,譚會辛.基于Direct的飛行射擊游戲引擎實現(xiàn)要點.重慶工學院學報,2008,22(10).
7李建波.DirectX 3D HLSL高級實例精講.北京:清華大學出版社,2013.
8Walsh P.DirectX 10 3D游戲編程深度探索.北京:清華大學出版社,2010.
9Luna FD.Introduction to 3D game programming with DirectX 11.Mercury Learning & Information,2012.
3D Game Engine with Advanced Rendering Technology in DX 11
YUAN Qiong,LIU Li
(Computer Science Institute,Wuhan Donghu University,Wuhan 430212,China)
Abstract:The advanced rendering technologies of DirectX 11 were studied and applied to the 3D game engine.Advanced rendering technologies of DirectX 11 included MultiTex,CubeMap,NormalMap and ShadowMap,etc..MultiTex was used to implement 3D terrain rendering,CubeMap was used to do environment map rendering,NormalMap was used to do special texture processing and ShadowMap is used to achieve the effect of mature realistic shadow.The paper also gave a detailed framework of interpreter and multi-branch of rendering core framework design,and completed the related technical cases to test on the engine.The result showed that the engine was true to life and effective in processing graphics.
Key words:DirectX 11; MultiTex; CubeMap; ShadowMap; 3D game engine
基金項目:①武漢東湖學院青年基金(2014)
收稿時間:2015-07-13;收到修改稿時間:2015-09-21