張 丹
(福州職業(yè)技術(shù)學(xué)院信息技術(shù)工程系,福建 福州 350108)
虛擬漫游,是虛擬現(xiàn)實(shí)技術(shù)的重要應(yīng)用,通常應(yīng)用在在建筑、教學(xué)、旅游、醫(yī)學(xué)等諸多領(lǐng)域。虛擬現(xiàn)實(shí)漫游具有其獨(dú)特的沉浸感、交互性、仿真操作等,是其他固定路線漫游或沒有加護(hù)的其他漫游技術(shù)無法比擬的[1]。隨著生產(chǎn)力和計(jì)算機(jī)科學(xué)技術(shù)的不斷發(fā)展,各行各業(yè)對 VR 技術(shù)的需求量日益加劇,VR 技術(shù)在各行各業(yè)都取得了巨大進(jìn)步,并逐步成為一個(gè)全新的科學(xué)技術(shù)領(lǐng)域。虛擬景觀漫游,作為虛擬漫游的一個(gè)重要方面,將虛擬三維場景構(gòu)建與虛擬漫游交互進(jìn)行完美結(jié)合。被廣泛應(yīng)用在地產(chǎn)景觀、小區(qū)景觀、旅游景觀的領(lǐng)域,給用戶在身臨其境欣賞景觀的同時(shí),還可以交互仿真進(jìn)行一系列操作。
虛擬景觀漫游,一直以來需要克服的重點(diǎn)問題在于,怎樣平衡虛擬環(huán)境仿真度與渲染場景實(shí)時(shí)繪制之間的矛盾。在虛擬景觀漫游中,用戶看到的景象看起來距離較近,那么久需要場景的繪制尤其逼真。于是需要精細(xì)的三維模型來滿足表現(xiàn)需要。同時(shí),漫游運(yùn)行卻受到計(jì)算機(jī)硬件性能的約束,當(dāng)三維模型建造的越復(fù)雜越精細(xì),在渲染場景進(jìn)行繪制時(shí),要滿足用戶實(shí)時(shí)體驗(yàn)的良好效果,就越困難。VR 環(huán)境下的復(fù)雜場景建模要求具有真實(shí)感的模型[2],而且虛擬場景還必須實(shí)時(shí)生成,即要求三維場景刷新速度需要和用戶視點(diǎn)變化的速度一致。那么通常會考慮,在三維場景模型的精確度和渲染場景的繪制速度之間取一個(gè)折中值,既能夠滿足必要的虛擬真實(shí)性,又不會產(chǎn)生繪制困難。于是,就需要各種優(yōu)化技術(shù),來配合場景虛擬交互漫游的需要,在盡可能地減少繪制計(jì)算量的同時(shí),又不降低用戶對虛擬仿真的體驗(yàn)感。
對于虛擬仿真項(xiàng)目來說,與運(yùn)行性能相關(guān)的,主要有兩種計(jì)算資源,CPU 和GPU,在運(yùn)行過程中它們相互合作,來控制項(xiàng)目的運(yùn)行幀率與渲染分辨率,CPU 負(fù)責(zé)運(yùn)行幀率,GPU 則負(fù)責(zé)渲染分辨率等。
Unity 軟件的渲染統(tǒng)計(jì)窗口(Rendering Statistics Window ),顯示了很多重要的渲染數(shù)據(jù),例如FPS 幀頻、批處理數(shù)目、頂點(diǎn)和三角網(wǎng)格的數(shù)目等。
表1 中列出了渲染統(tǒng)計(jì)窗口中顯示的各個(gè)信息。
表1 Unity 渲染統(tǒng)計(jì)信息
對于CPU 來說,限制它的主要是Draw Call,當(dāng)項(xiàng)目開始運(yùn)行,準(zhǔn)備對渲染畫面進(jìn)行繪制時(shí),就需要調(diào)用Draw Call。通常的小區(qū)漫游或者是景觀漫游,場景中通常分布著適當(dāng)?shù)乃婧秃芏嗟臉淠緟擦?,在對水面進(jìn)行渲染時(shí),會使用材質(zhì)和著色器,但在渲染樹模時(shí),需要適合樹木的另外的材質(zhì)和著色器,這時(shí)的CPU 需要重新準(zhǔn)備繪制的頂點(diǎn)數(shù)據(jù)和需要重新設(shè)置材質(zhì),這個(gè)工作過程其實(shí)比較耗時(shí)。也就是說,構(gòu)建一個(gè)場景,如果場景中的每個(gè)對象和物體都有各自不同的材質(zhì)紋理等,就會產(chǎn)生非常多的Draw Call,從而影響運(yùn)行的幀率,同時(shí)用戶體驗(yàn)的交互性也會下降。
GPU 本身負(fù)責(zé)場景的整個(gè)渲染進(jìn)程,它的處理開始部分是從CPU 傳過來的三維模型數(shù)據(jù),然后進(jìn)行著色等工作,最后給屏幕上輸出每個(gè)像素。于是知道了影響GPU 性能的因素有處理頂點(diǎn)的數(shù)目、屏幕的分辨率、顯存等。
所以,優(yōu)化技術(shù)的考慮有頂點(diǎn)優(yōu)化,常用的有LOD 技術(shù)、遮擋剔除技術(shù)等;像素優(yōu)化,常用的有控制透明物體、減少實(shí)時(shí)光照等;CPU 優(yōu)化,減少Draw Calls,常用的有場景靜態(tài)對象使用靜態(tài)批處理;帶寬優(yōu)化,常用的有減少紋理大小等。
三維模型的LOD 技術(shù)和遮擋剔除技術(shù)可以同時(shí)減少CPU 和GPU 的負(fù)荷。CPU 可以提交更少的draw call,而GPU需要處理的頂點(diǎn)和片元數(shù)目也減少了。
之后將三維場景導(dǎo)入U(xiǎn)nity 進(jìn)行虛擬漫游和仿真交互控制。常用的優(yōu)化技術(shù)主要有以下幾個(gè)方面。
虛擬景觀漫游制作的流程中,第一步是創(chuàng)建場景三維模型,在進(jìn)行三維建模的時(shí)候,需要注意在滿足造型的基礎(chǔ)上,減少模型中的三角面。為了盡可能減少模型中的頂點(diǎn)數(shù)目,建模人員往往需要優(yōu)化模型的網(wǎng)格結(jié)構(gòu)。常見的三維建模工具,通常會有一些相應(yīng)的優(yōu)化方案,來進(jìn)行網(wǎng)格結(jié)構(gòu)的自動優(yōu)化。隨著整體優(yōu)化,場景中的每一個(gè)面片分配都僅為表達(dá)造型的有效面片[3]。
在Unity 的渲染統(tǒng)計(jì)窗口中,筆者可以查看到渲染當(dāng)前需要的三角面片數(shù)目和頂點(diǎn)數(shù)目。在GPU 看來,有時(shí)需要把一個(gè)頂點(diǎn)拆分成兩個(gè)或更多,這樣是因?yàn)榉蛛x紋理坐標(biāo)(uv splits)和產(chǎn)生平滑的邊界(smoothing splits)。例如,創(chuàng)建一個(gè)長方體,長方體的6 個(gè)面有一些共用的定點(diǎn),而在不同的面上,同一個(gè)頂點(diǎn)所對應(yīng)的貼圖紋理坐標(biāo)也許并不相同。這時(shí),GPU 會將這個(gè)頂點(diǎn)拆分成一些紋理坐標(biāo)不同的頂點(diǎn)。GPU 本身只關(guān)心繪制頂點(diǎn)的數(shù)量。因此,筆者需要考慮的是怎樣盡量去減少繪制頂點(diǎn)的數(shù)目。另外一條幾何體優(yōu)化建議是,移除不必要的硬邊以及紋理銜接,避免邊界平滑和紋理分離。
LOD(Level of detail)細(xì)節(jié)層次優(yōu)化技術(shù)與Mipmap 技術(shù)有些相似,后者是紋理金字塔,而LOD 是面向三維模型的模型金字塔,根據(jù)距離攝像機(jī)的距離遠(yuǎn)近,選擇需要使用怎樣精度的模型。LOD 技術(shù)的優(yōu)勢在于,可以在滿足需要的情況下,盡可能地減少需要繪制的頂點(diǎn)數(shù)。那么它的缺點(diǎn)則是,由于資源導(dǎo)入的數(shù)量,需要占用較多的內(nèi)存,因此在不同精度模式所處的距離問題上,需要調(diào)整好,否則可能會導(dǎo)致外觀模擬的突變。在Unity 中,給需要使用LOD 技術(shù)的對象添加LOD Group 組件。
層次細(xì)節(jié)(Levels of Detail)是根據(jù)物體在場景中所占視圖的百分比來調(diào)節(jié)不同復(fù)雜度模型的。當(dāng)攝像機(jī)距離某物體較遠(yuǎn)的時(shí)候,采用低模,當(dāng)攝像機(jī)距離較近的時(shí)候,采用高模。可以提高游戲渲染效率,但會占用更多的內(nèi)存。
景觀漫游場景中的樹木就非常適合應(yīng)用LOD,給樹木對象添加LOD Group 組件。將高精度,中等精度,低精度的模型,拖拽到組件的各個(gè)級別上。選擇需要控制的模型以及距離設(shè)置LOD 0 對應(yīng)高精度模型,LOD 1 對應(yīng)中等精度,LOD 2 對應(yīng)低精度。
給樹木添加LOD 組件之后,可以看到在景觀場景漫游中,距離樹木由近到遠(yuǎn)時(shí),樹木的外觀編號以及網(wǎng)格簡化過程如圖1 所示。
圖1 樹木應(yīng)用LOD 遠(yuǎn)近效果變化
遮擋剔除(Occlusion culling)在場景渲染中可以用來消除某些物體后面的看不到的物體,這樣計(jì)算機(jī)資源就不會消耗在攝像機(jī)看不到的物體頂點(diǎn)上,從而提升整體的運(yùn)行性能。遮擋剔除會使用一個(gè)虛擬的攝像機(jī)來遍歷場景,從而構(gòu)建一個(gè)潛在可見的對象集合的層級結(jié)構(gòu)。在運(yùn)行時(shí)刻,每個(gè)攝像機(jī)將會使用這個(gè)數(shù)據(jù)來識別哪些物體是可見的,而哪些被其他物體擋住不可見。使用遮擋剔除技術(shù),不僅可以減少處理的頂點(diǎn)數(shù)目,還可以減少重復(fù)繪制,提高游戲性能。
打開渲染窗口的遮擋剔除(Occlusion Culling),選中需要遮擋剔除的物體,進(jìn)行相應(yīng)設(shè)置,然后進(jìn)行烘焙,將Edit改為Visualize。這樣當(dāng)物體不在攝像機(jī)的可視范圍內(nèi),不會對其進(jìn)行渲染。
圖2 是小區(qū)景觀使用遮擋剔除后的俯視圖,可以看到前后展示對比。
圖2 景觀場景應(yīng)用遮擋剔除
同時(shí),應(yīng)用遮擋剔除前后,觀察渲染統(tǒng)計(jì)窗口,會發(fā)現(xiàn)性能參數(shù)的前后對比變化明顯,例如可以看到CPU 的處理時(shí)間由原來的25.7ms 變成了15.1ms,優(yōu)化前的幀頻是38.8f/s,而優(yōu)化后幀頻是66.3f/s,以及一些其他參數(shù)的優(yōu)化變化。
場景對象看起來使用了非常復(fù)雜高級的光照計(jì)算,但實(shí)際上是優(yōu)化后的結(jié)果。首先將場景中運(yùn)行不會發(fā)生移動的建筑物或障礙物設(shè)置成static,取消自動烘焙,調(diào)整好燈光效果,可以參照實(shí)時(shí)燈光的效果,將燈光模式設(shè)置成烘焙,在燈光設(shè)置面板中啟用烘焙,烘焙完成會得到場景的光照烘焙圖,滿足靜態(tài)物體光照。再將光照探針分布在場景中,滿足動態(tài)物體光照。實(shí)時(shí)陰影同樣是一個(gè)非常消耗性能的效果。不僅是CPU 需要提交更多的draw call, GPU也需要進(jìn)行更多的處理。因此,應(yīng)該盡量減少實(shí)時(shí)陰影,例如使用烘焙把靜態(tài)物體的陰影信息存儲到光照紋理中,而只對場景中的動態(tài)物體使用適當(dāng)?shù)膶?shí)時(shí)陰影。
對于運(yùn)行加載優(yōu)化,用的最多的莫過于LOD 以及MipMap 多級漸遠(yuǎn)紋理技術(shù),MipMap 又被稱為“紋理貼圖金字塔”。它的原理是提前用濾波處理來得到很多更小的圖像,形成一個(gè)圖像金字塔,每一層都是對上一層降采樣的結(jié)果。這樣在實(shí)際運(yùn)行時(shí),就能快速得到結(jié)果像素。當(dāng)物體原理攝像機(jī)時(shí),可以直接使用較小的紋理,紋理質(zhì)量稍差,模糊感較強(qiáng)。物體靠近時(shí)適當(dāng)替換較大紋理,紋理質(zhì)量好,模糊感較少。以便給玩家呈現(xiàn)更精致的畫面。那么當(dāng)物體遠(yuǎn)離時(shí),無須高精度紋理展示時(shí),則替換低精度紋理,降低了顯存帶寬,減少了渲染。但是,為了適配多場景,比如遠(yuǎn)近多個(gè)不同的場景,提前生成幾張精度不同的紋理,使用一定的空間用于存儲這些多級漸遠(yuǎn)紋理,通常會多占用1/3 的內(nèi)存空間,是利用空間換取時(shí)間的辦法。
有些時(shí)候顯示的分辨率也會對性能產(chǎn)生影響,尤其是在Android 系統(tǒng)使用時(shí),當(dāng)分辨率過高,而硬件性能卻很低,也就是說硬件性能與分辨率要求不匹配時(shí),就產(chǎn)生了運(yùn)行效果較差的情況,所以硬件性能與渲染畫面質(zhì)量之間應(yīng)該如何平衡是需要研究的問題。這是可以考慮使用Android 系統(tǒng)的硬件縮放技術(shù),來提升運(yùn)行效率,直接在Unity 中設(shè)置顯示的分辨率,通過調(diào)用Screen.SetResolution()函數(shù),函數(shù)的參數(shù)需要與開發(fā)時(shí)UI 分辨率進(jìn)行等比例計(jì)算,可能面臨調(diào)大或調(diào)小的情況。設(shè)置運(yùn)行分辨率后,程序原有的代碼邏輯不會受到影響,而運(yùn)行效率確實(shí)提高了,并且能觀察到幀頻的顯著提高。使用這種方法如果遇到偶爾屏幕顯示異常如橫豎屏錯亂的問題,可以考慮到Java 層去修改UnityPlayerNativeActivity.java,調(diào)用getResources().getDisplayMetrics()來修復(fù)問題并得到正確的顯示效果。
給場景對象添加后處理組件post process volume,勾選其中的is global 作用全局,之后在相機(jī)中同樣方式添加一個(gè)post process Layer 組件,回到后處理上,點(diǎn)擊new 來新建一個(gè)配置,點(diǎn)擊add effect 可以添加各種處理效果。
給場景中的樹叢應(yīng)用后處理的部分效果,抗鋸齒Antialiasing、太陽射線光SunShafts、鏡頭暗色暈圈VignetteAndChromaticAberration、柔光Bloom、色彩校正曲線ColorCorrectionCurves。
可以看到場景應(yīng)用后處理以上效果后的,前后渲染效果對比如圖3 所示。在實(shí)際應(yīng)用中,可以根據(jù)需要,選擇合適的后處理效果應(yīng)用,以達(dá)到不同的環(huán)境渲染效果。
圖3 應(yīng)用后處理技術(shù)前后效果對比
虛擬景觀漫游是虛擬漫游的一個(gè)重要方面,比如在房地產(chǎn)的應(yīng)用領(lǐng)域中,通過地產(chǎn)景觀虛擬漫游,用戶可以身臨其境的觀賞到優(yōu)美的小區(qū)環(huán)境。
在虛擬景觀漫游項(xiàng)目創(chuàng)建過程中,從三維幾何體優(yōu)化到LOD 優(yōu)化等技術(shù)的使用,以及使用后處理效果,對提高虛擬漫游整體運(yùn)行性能以及用戶體驗(yàn)效果,有非常重要的意義。