溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何解析基于Unity3D的平坦四叉樹地形與Virtual Texture的分析

發(fā)布時(shí)間:2021-12-27 13:44:31 來(lái)源:億速云 閱讀:480 作者:柒染 欄目:大數(shù)據(jù)

如何解析基于Unity3D的平坦四叉樹地形與Virtual Texture的分析,相信很多沒(méi)有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問(wèn)題出現(xiàn)的原因和解決方法,通過(guò)這篇文章希望你能解決這個(gè)問(wèn)題。

地形繪制有重復(fù)度高,高度控制自由,貼圖復(fù)雜度高且有連貫要求等特點(diǎn)。因此必須要使用特化的繪制方法才得以完成繪制。先前Ubisoft Far Cry 5分享的地形繪制方法,使用了QuadTree + Virtual Texture的方法。這樣的方法有很多優(yōu)勢(shì),因?yàn)镼uadTree提交的都是固定的面片,因此從剔除到提交都完全可以在GPU做,這和我們之前實(shí)現(xiàn)的GPU Driven Pipeline思路相仿,而Virtual Texture可以用來(lái)表示各種Geometry信息,如高度,漫反,法線,粗糙度等等…… 因此我們也決定使用這樣的技術(shù)來(lái)實(shí)現(xiàn)大地形的繪制和編輯。

四叉樹的實(shí)現(xiàn)對(duì)于算法能力扎實(shí)的朋友來(lái)說(shuō),并不算難事,所以這里直接就跳過(guò)四叉樹的基本算法原理,拿出部分代碼示例進(jìn)行講解。因?yàn)閂irtual Texture加持的原因,在構(gòu)建四叉樹時(shí)不需要準(zhǔn)備諸如Material ID之類的額外信息,只需要保存當(dāng)前區(qū)塊的位置坐標(biāo),LOD等級(jí)(用于切換LOD),以及緩存狀態(tài)(方便遞歸)等,數(shù)據(jù)結(jié)構(gòu)也會(huì)非常簡(jiǎn)單:

如何解析基于Unity3D的平坦四叉樹地形與Virtual Texture的分析

有個(gè)小細(xì)節(jié)是,為提高內(nèi)存分配性能,四個(gè)子節(jié)點(diǎn)是同時(shí)分配的,這一點(diǎn)許多習(xí)慣C++高級(jí)特性的開發(fā)者很容易習(xí)慣性的漏掉,但是性能都是從這種小細(xì)節(jié)摳出來(lái)的,因此一定要注意:

如何解析基于Unity3D的平坦四叉樹地形與Virtual Texture的分析

因?yàn)槭褂昧薝nity提供的手動(dòng)內(nèi)存分配,因此完全可以使用Burst Compiler提高CPU端計(jì)算速度:

如何解析基于Unity3D的平坦四叉樹地形與Virtual Texture的分析

準(zhǔn)備完畢后直接提交到StructuredBuffer等Compute Shader用到時(shí)拿去做剔除繪制工作,渲染結(jié)果如下(Albedo貼圖為局部UV顯示):

Farcry 5提到的Procedural Virtual Texture分為兩部分,第一部分Procedural和Adaptive,基本占了99%的工作量,主要工作量在于各種自動(dòng)化生成,手動(dòng)高性能編輯的工具,以及隨玩家移動(dòng)進(jìn)行動(dòng)態(tài)加載卸載的游戲邏輯;第二部分為Virtual Texture,基本占了不到1%工作量,本著柿子先挑軟的捏的精神我們先把Virtual Texture部分簡(jiǎn)單實(shí)現(xiàn)以下。

所謂Adaptive Virtual Texture一句話總結(jié)就是:存貼圖的對(duì)象池。首先,開一張Render Texture作為Index map,存儲(chǔ)一個(gè)Scale Offset,也就是一個(gè)指向Atlas位置的索引。同時(shí)開一張Atlas,當(dāng)?shù)匦渭虞d到這一部分時(shí),從硬盤加載貼圖到Atlas的某個(gè)部分,并將新加載的部分的位置放到Index map中,也就是說(shuō)使用Index map作為一張?zhí)怼6秩镜匦螘r(shí),直接把當(dāng)前地形的世界坐標(biāo)當(dāng)做UV讀取Index map即可,相當(dāng)于整個(gè)地形使用了一張碩大無(wú)比的貼圖,只不過(guò)這個(gè)貼圖中間大部分地方都是沒(méi)加載的,讀取貼圖的偽代碼大致如下:

Texture2D<float4> _IndexMap;Texture2DArray<float4> _Atlas; SamplerState sampler_Atlas;float4 _IndexMap_TexelSize;//Indexmap 的物理大小float4 TexVT(float2 uv){//將傳入U(xiǎn)V轉(zhuǎn)換到Index map的絕對(duì)坐標(biāo)。    uv *= _IndexMap_TexelSize.zw;//讀取Index Map,XYZW四個(gè)通道意義分別為:大小比例,橫向偏移,縱向偏移,數(shù)組索引    float4 scaleOffset = _IndexMap[(uint2)uv];//獲取絕對(duì)UV的小數(shù)點(diǎn)后部分,得到局部UV偏移    float2 localUV = frac(uv);    localUV = localUV * scaleOffset.x + scaleOffset.yz;//使用換算出的UV讀取Atlas    float4 value = _Atlas.SampleLevel(sampler_Atlas, float3(localUV, scaleOffset.w), 0);    return value;}

這一點(diǎn)在PPT中講的也比較清楚了:

如何解析基于Unity3D的平坦四叉樹地形與Virtual Texture的分析

這樣靈活的空間分配和復(fù)用方式,可以使用視錐體只加載視野內(nèi)的貼圖,若內(nèi)存和性能充裕且玩家常有高速轉(zhuǎn)動(dòng)鏡頭的需求,也可以使用攝像機(jī)坐標(biāo)來(lái)加載相機(jī)四周的貼圖。

同時(shí)PPT分享中也指出,由于所有世界空間中緊挨在一起的圖片在IndexMap中也是緊挨的,因此在進(jìn)行LOD降級(jí)時(shí),只需要將四塊區(qū)域的圖片四合一放到另一塊區(qū)域即可,順?biāo)浦郏瑤缀鯖](méi)有額外消耗。

這里我們給出一套完整的API:

如何解析基于Unity3D的平坦四叉樹地形與Virtual Texture的分析

軟柿子輕而易舉捏完。就只剩硬柿子了。當(dāng)然,由于工作量巨大,可能需要本人開發(fā)數(shù)月或數(shù)年才能搭建一套有完整工具流程的Virtual Texture,所以這里只給出一個(gè)設(shè)想性質(zhì)的原型用作學(xué)習(xí)探討用途。

從上方的實(shí)現(xiàn)不難看出,Virtual Texture的實(shí)現(xiàn)過(guò)程全部是實(shí)時(shí)投射的Render Texture,實(shí)時(shí)加載,實(shí)時(shí)卸載,實(shí)時(shí)合并,因此在設(shè)計(jì)儲(chǔ)存的數(shù)據(jù)格式時(shí),我們也沒(méi)必要儲(chǔ)存一整張繪制好的貼圖,因?yàn)檫@樣會(huì)導(dǎo)致游戲的包體完全無(wú)法控制,我們只需要提供繪制所需的“種子”即可。

此類種子一般是示例貼圖,Blend Mask貼圖,貼花模型等,這些種子可以大量復(fù)用,并且可以使用程序化DCC工具生成,比如這里的RT就是由多張已經(jīng)準(zhǔn)備好的貼圖按順序混合,其中每張貼圖都有不同的Tiling密度:

如何解析基于Unity3D的平坦四叉樹地形與Virtual Texture的分析

雖然Tilling密集,但由于使用的Mask不同且混合均勻,并沒(méi)有出現(xiàn)明顯的重復(fù)感:

如何解析基于Unity3D的平坦四叉樹地形與Virtual Texture的分析

只用Mask做混合顯然是不夠的,諸如石子,土路,苔蘚等不規(guī)則物,在生產(chǎn)時(shí)往往是依賴貼花實(shí)現(xiàn)。貼花的實(shí)現(xiàn)思想也比較簡(jiǎn)單粗暴,直接在面片上方構(gòu)建一個(gè)正交投影矩陣,并把模型的Geometry信息“拍扁”到貼圖上:

如何解析基于Unity3D的平坦四叉樹地形與Virtual Texture的分析  
貼花本身就是模型,直接渲染貼花本身

最終有貼花的貼圖豐富程度更高了:

如何解析基于Unity3D的平坦四叉樹地形與Virtual Texture的分析

看完上述內(nèi)容,你們掌握如何解析基于Unity3D的平坦四叉樹地形與Virtual Texture的分析的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI