王全占,吳 博
(西南交通大學(xué) 電氣工程學(xué)院,成都 610031)
大規(guī)模場景模型動輒數(shù)GB、甚至數(shù)十GB的超大數(shù)據(jù)量與計算機內(nèi)存以及計算性能嚴(yán)重不匹配,引起了國內(nèi)外虛擬現(xiàn)實、視景仿真領(lǐng)域的極大重視。文獻(xiàn)[1]對大規(guī)模場景的實時繪制技術(shù)進(jìn)行了綜述,但未就單一技術(shù)進(jìn)行深入探討。文獻(xiàn)[2]對單一巨大模型的核外簡化及實時繪制技術(shù)進(jìn)行了詳細(xì)的闡述,但是很遺憾該文獻(xiàn)中的方式更適用于單個的巨大物體,而對于如數(shù)字地球、虛擬現(xiàn)實等領(lǐng)域的眾多小模型組合而來的大規(guī)模復(fù)雜場景模型顯得不太合適,并且不太適用于多紋理模型的繪制。文獻(xiàn)[3][4]等則是從核外計算的角度對數(shù)據(jù)的I/O優(yōu)化策略進(jìn)行了對比研究,并未就場景繪制這一方面進(jìn)行研究。本文對文獻(xiàn)中的核外資源處理的思想進(jìn)行繼承,并提出了基于OGRE圖形引擎的、更適用于大規(guī)模多紋理場景模型的實時繪制的新思路。該方法首先將仿真業(yè)界的事實標(biāo)準(zhǔn)Open Flight格式的三維場景模型按照區(qū)域劃分,分割成若干適合圖形工作站內(nèi)存大小、能夠達(dá)到數(shù)據(jù)預(yù)取要求的小模型,然后利用模型轉(zhuǎn)換工具將該小模型從Open Flight格式轉(zhuǎn)化為OGRE引擎支持的MESH模型,最后利用數(shù)據(jù)預(yù)取技術(shù)以及多線程編程技術(shù)完成大規(guī)模場景數(shù)據(jù)的實時讀取、實時渲染。
OGRE(object-oriented graphic render engine,面向?qū)ο蟮膱D形渲染引擎)是用C++開發(fā)的面向?qū)ο笄沂褂渺`活的3D引擎。其目的是讓開發(fā)者能更方便和直接地開發(fā)基于3D硬件設(shè)備的應(yīng)用程序或游戲。引擎中的類庫對更底層的系統(tǒng)庫(如:Direct3D和OpenGL)的全部使用細(xì)節(jié)進(jìn)行了抽象,并提供了基于現(xiàn)實世界對象的接口。引擎中資源加載與渲染是分離的兩部分,因此能夠支持后臺加載。
OGRE能直接利用的模型文件為:.mesh文件,與之對應(yīng)有一個.materail文件,以及若干紋理圖片(png,jpg,tga等)。其中.materail文件中存儲了若干個材質(zhì),每個材質(zhì)包含有折射率、反射率、紋理圖片名稱等信息。.mesh文件中包含有若干submesh(子網(wǎng)格),每個子網(wǎng)格與一個材質(zhì)名相對應(yīng),每個子網(wǎng)格里有應(yīng)用該材質(zhì)的頂點的坐標(biāo)、法向量、紋理貼圖uv值等信息。
當(dāng)代的GPU更適合于渲染少數(shù)的大批次的幾何體,而不是許多小的批次。這里的批次是指GPU渲染狀態(tài)的改變,包括折射、反射、紋理等。也正是如此,單純的三角形數(shù)目已經(jīng)不是GPU關(guān)注的熱點,渲染一個單一批次的100萬個三角形的場景,可能到300幀/s以上,然而渲染1 000個批次,每個批次中有1 000個三角形的場景卻可能只有30幀/s。
為了防止材質(zhì)的頻繁切換,OGRE的.mesh文件以材質(zhì)為單位進(jìn)行組織,極大限度的減少材質(zhì)的切換。
核外算法的I/O策略包括數(shù)據(jù)篩選、數(shù)據(jù)預(yù)取、數(shù)據(jù)重用等方式。數(shù)據(jù)篩選主要指為了降低外存訪問次數(shù)、提高內(nèi)外存交換的有效數(shù)據(jù)量而采取的一系列措施。數(shù)據(jù)預(yù)取技術(shù)的主要思想是利用數(shù)據(jù)處理的時間,并行地預(yù)取下一時間段需要處理的數(shù)據(jù)。這就要求I/O操作的數(shù)據(jù)與CPU/GPU處理的數(shù)據(jù)不重疊,并且需要保證數(shù)據(jù)預(yù)取的時間要小于數(shù)據(jù)處理的時間。數(shù)據(jù)重用主要是指為實現(xiàn)內(nèi)存中數(shù)據(jù)的重復(fù)利用率而采取的一系列措施。
基于以上討論,OGRE支持.mesh格式的網(wǎng)格模型的渲染,并且在渲染期間會按照不同的材質(zhì)重新排列,按照批次進(jìn)行渲染,以實現(xiàn)更適合當(dāng)代GPU渲染的渲染隊列。而核外渲染的I/O優(yōu)化策略包括數(shù)據(jù)篩選、數(shù)據(jù)預(yù)取、數(shù)據(jù)重用3種方式。大規(guī)模的場景數(shù)據(jù)都是存在外存(硬盤等)中的,讀取到內(nèi)存中的數(shù)據(jù)必須包括當(dāng)前幀所需要的模型數(shù)據(jù)以及預(yù)取的在一個時間段內(nèi)需要的模型數(shù)據(jù)冗余。
首先需要將大的場景模型按照三維空間分塊成小的模型,用以動態(tài)加載/卸載,這里有2個問題,一是小模型如何存儲,二是切分的小模型的大小如何確定。由于OGRE是以資源組的形式進(jìn)行資源管理,因此只需將切分好的模型數(shù)據(jù),包括三角形數(shù)據(jù)、材質(zhì)文件、紋理文件均放到同一文件夾下,然后聲明該文件夾為一個資源組,這樣就可以實現(xiàn)該模型的所有數(shù)據(jù)同時加載/卸載。
圖1 模型的大小
至于如何確定小模型的大小,由于需要將同一三維空間內(nèi)的模型數(shù)據(jù)單獨放到一個文件夾內(nèi),這就無形中增加了不少冗余數(shù)據(jù),比如同一張紋理在區(qū)域A中要用到,同時也在區(qū)域B中也要用到。因此切分的小模型必須在保證渲染的實時性的前提下,越少越好。因此將模型劃分為34個小模型,模型大小以及所含紋理數(shù)量如圖1、圖2所示。
圖2 模型的紋理數(shù)量
相對應(yīng)的出現(xiàn)卡幀現(xiàn)象的區(qū)域塊如表1所示:
表1 出現(xiàn)卡幀現(xiàn)象的區(qū)域塊
由表1可見,發(fā)生卡幀現(xiàn)象的區(qū)域編號全是與較大模型塊相對應(yīng)的。由于動態(tài)優(yōu)化是有代價的,尤其是尋求全局最優(yōu)解,更由于不同紋理、不同組織結(jié)構(gòu)的模型等使得尋求全局最優(yōu)基本不可能。因此根據(jù)反復(fù)測試,歸納出適用于當(dāng)前使用機器的模型大小為:單個模型大小不超過3 MB,紋理數(shù)量不超過200張。該結(jié)構(gòu)可作為以后在該計算機上實時大模型時的經(jīng)驗數(shù)據(jù)。
實時渲染的同時,啟動一個資源管理線程,完成資源的后臺調(diào)度功能。處理流程如圖3所示。
渲染線程根據(jù)當(dāng)前漫游方向以及速度來計算當(dāng)前視點參數(shù),并進(jìn)行相應(yīng)渲染操作,同時將當(dāng)前速度、方向、視點位置等數(shù)據(jù)寫入公共數(shù)據(jù)區(qū)。資源管理線程負(fù)責(zé)判斷當(dāng)前視點下,是否需要進(jìn)行I/O操作并及時更新場景圖。
具體的資源管理策略,選用了OGRE的后臺加載隊列進(jìn)行后臺加載。這個類提供了一個簡單的接口,可自動創(chuàng)建一個后臺線程去加載/卸載資源,并在處理完畢后返回到主線程一個ID編號。由于返回的信息太少,因此在OGRE主線程中創(chuàng)建了一個專門用于調(diào)度的資源管理線程,該線程負(fù)責(zé)加載/卸載資源組,并建立資源組編號與后臺處理隊列ID的映射關(guān)系。
圖3 處理流程圖
這樣,首先對分割好的小模型建立相應(yīng)的資源組編號,以及對應(yīng)的三維空間包圍盒數(shù)據(jù),然后資源管理線程通過讀取公共緩沖區(qū)的當(dāng)前視點及其運動參數(shù),進(jìn)行下一幀的視點預(yù)測,然后根據(jù)當(dāng)前幀以及下一幀的視點位置所在的區(qū)域塊,以及視域的設(shè)置來確定下一時刻需要在內(nèi)存中的資源組編號,并根據(jù)當(dāng)前區(qū)域的屬性來決定是否進(jìn)行資源加載/卸載操作。區(qū)域塊的數(shù)據(jù)結(jié)構(gòu)設(shè)計如下:
然后通知OGRE的后臺加載策略進(jìn)行加載/卸載操作,OGRE會另外開辟一個線程去加載/卸載資源組,在這個資源組中,包含模型的mesh網(wǎng)格模型、材質(zhì)文件以及相應(yīng)的紋理,OGRE會在后臺完成網(wǎng)格數(shù)據(jù)的加載/卸載,并解析材質(zhì)文件找到需要處理的紋理文件,將紋理進(jìn)行加載/卸載操作。資源處理完成將返回給資源管理線程資源處理完畢的標(biāo)志,以便資源管理線程及時更新場景圖。
在資源管理線程進(jìn)行資源處理的同時,渲染線程會按批次渲染當(dāng)前場景圖中的三維場景。當(dāng)前存在于內(nèi)存中的數(shù)據(jù)只是略大于視域范圍的較小區(qū)域的場景,因此場景視域剔除的效率會很高。影響GPU渲染效率的主要因素就是渲染狀態(tài)的頻繁改變,即渲染批次的數(shù)量很大地影響了圖形渲染的效率。OGRE本身是面向GPU加速的圖形引擎,它會在力所能及的范圍內(nèi)盡量把相同渲染狀態(tài)的物體一起渲染,進(jìn)而減少渲染狀態(tài)改變。OGRE也尊重用戶設(shè)置的Renderable整體(也就是說Renderable是處理批次的最小原子結(jié)構(gòu)),并不進(jìn)行拆分。比如,有若干個使用相同材質(zhì)的片段組成的模型,就可以把它們合并成一個Renderable對象,這樣就可以省略掉系統(tǒng)檢查這些片斷是否是一個相同的渲染狀態(tài)的步驟,從而可以一次處理完畢?;谏鲜鲇懻摚秩揪€程會在響應(yīng)突發(fā)事件(運行故障等)、及視點計算的基礎(chǔ)上根據(jù)當(dāng)前場景圖,將同一個材質(zhì)的片段的模型重組到一個Renderable,最后OGRE按材質(zhì)的優(yōu)先級、按批次地完成當(dāng)前場景的渲染,實現(xiàn)GPU加速。
根據(jù)以上模型分塊以及核外渲染方法,筆者在西南交通大學(xué)智能控制與仿真工程研究中心的高性能圖形工作站上實現(xiàn)了所設(shè)計的系統(tǒng)。完成了3 000 km×2 km范圍內(nèi)的大規(guī)模場景模型的實時繪制,模型總量為4 GB,超過了試驗機系統(tǒng)內(nèi)存。圖4為完成后的效果圖,圖5為幀速率曲線。
圖4 大規(guī)模場景模型繪制的效果圖
圖5 幀速率曲線
大規(guī)模場景模型的實時渲染,在列車仿真器視景系統(tǒng)等計算機圖形系統(tǒng)中占有非常重要的地位。實時渲染超過內(nèi)存大小的超大模型,更是近年來的研究熱點。本文基于OGRE開源圖形引擎,構(gòu)建了一個簡單、高效的大場景核外渲染方法。經(jīng)過實驗證明,該方法能夠?qū)崿F(xiàn)數(shù)GB乃至數(shù)十GB模型的實時渲染,并且?guī)史€(wěn)定,能夠適應(yīng)高速鐵路列車仿真器超長線路場景實時渲染的要求。
[1]崔雪峰,王林旭,王玨.大規(guī)模復(fù)雜場景的交互繪制技術(shù)[C]//劉曉平,蔣建國,李琳,等.全國第19屆計算機技術(shù)與應(yīng)用(CACIS)學(xué)術(shù)會議論文集(上冊).合肥:中國科學(xué)技術(shù)大學(xué)出版社,2008:129-134.
[2]王威,胡銘曾.核外計算中I/O優(yōu)化策略的研究[J].哈爾濱商業(yè)大學(xué)學(xué)報.2005,21(5):600-603.
[3]王海洋,蔡康穎,王文成,等.外存模型簡化中數(shù)據(jù)讀取及內(nèi)存分配的優(yōu)化[J].計算機輔助設(shè)計與圖形學(xué)學(xué)報.2005,17(8):1736-1743.
[4]段化鵬,楊衛(wèi)平,孫農(nóng)亮,等.基于OGRE和ODE的碰撞檢測在巷道漫游系統(tǒng)中的研究[J].電腦知識與技術(shù),2009,5(19):5219-5221.
[5]李云飛,程甜甜,何偉.一種湖面波浪模擬的方法[J].系統(tǒng)仿真學(xué)報,2009,21(23):7507-7510.
[6]蘇虎,金煒東.列車駕駛仿真器及其關(guān)鍵技術(shù)[J].科技導(dǎo)報,2007,25(12):12-17.
[7]劉波.大規(guī)模城市場景的高效建模及其實時繪制研究[D].浙江大學(xué),2008.