了解Landscape的組成元件

簡介

官方文件連結

一開始接觸Landscape,對裡面的各個名詞以及擁有各式各樣的數目感到非常的陌生。
就算看文件還是有很多細節是不懂的
後來跟同事一起研究,想到一些測試方法,我後續測出一些結果與結論,在本篇說明一下。

這是本系列的第二篇
目前一共有以下幾篇為系列的文章

1. Import RealWorld Landscape to UE4

2. 了解Landscape的組成元件

3. Generate Navigation Mesh with World Composition

4. Build Static Navigation Mesh in World Composition

組成結構與了解

有關Landscape的組成結構,Level裡面可以放置Landscape,一個Landscape有一到多個components。

每一個component又可以決定要細切2*2個section或不細切兩種。一個Section又由多個Quads所組成。

最後一個Quad就是兩個三角片,為3D最基礎的繪製單位。

數量限制規範

一個Landscape的Component數目是有規範的,範圍是1~1024個,並且要是2的冪次方。
一個Component的Section數目如同前面所提,只有1*1與2*2兩種。
一個Section的Quad數目最少是7*7,最大到255*255。

不同參數下的Draw call

一個Component 2個draw calls,然後一個component是landscape可以被culling的最小單位。
製作一個Landscape Components是1*1, section是2*2,quads是7*7。
以及一個Landscape Components是2*2, section是1*1,quads是7*7。
觀察在不同視線的draw call變化,例如看的到全部的components或sections,或是只看的到一個component或section。




除了表格之外,也一併列出場景截圖提供參考。

Only 1 section in view in 1*1 component with 2*2 section landscape.


4 sections in view in 1*1 component with 2*2 section landscape.


Only 1 Component in view in 2*2 component with 1*1 section landscape.

4 Components in view in 2*2 component with 1*1 section landscape.

量測注意事項


數據中draw call使用的是stat scenerendering。
然後觀察Mesh draw calls的項目。

在Editor有沒有選取到Landscape actor,顯示的draw call也會明顯不同(要多畫Gizmo),
所以記得在量測的時候要固定環境。

Overall resolution說明與計算


這部份可以參考UE4官方文件在Recommended Landscape Sizes裡面列出來的表。

引擎裡面是用Overall resolution,文件是寫Overall size。

Overall resolution會隨著參數不同而改變。為了簡單說明,這邊就以一個維度來算就好。
overall resolution = section size * sections per component * num of components + 1

計算範例


8 =  7*1*1 + 1
15 = 7*2*1 + 1
15 = 7*1*2 + 1
31 = 15*2*1 + 1
31 = 15*1*2 + 1

所以代表改變section或是component數,都是會影響產生的地表面積的。
雖然section隸屬於comonent下,但是把一個1*1component配1*1section的地形改為
2*2section的地形,面積是增加的。如下圖所示
Different sections produce different size landscape. The Left landscape
is 1*1 component with 1*1 section. The Right landscape is 1*1 component with
2*2 sections.


這部份我本來以為參數改變會維持大小不變,component內會再細切4個section,結果不是。

想法上要改為section才是最小單位,是用section去鋪地表,只是多少個section會用一個component表示。

結論

Section數決定了Draw call數,Component管理CPU有關的項目(例如Culling)

在相同的平方面積,使用
1*1 component配上2*2 section或是2*2 component配上1*1 section,
最大draw call數是相同的,因為Section數相同。

使用較多的component可以透過culling直接剔除,可是culling計算也需要耗時間。

有關Section負責處理LOD的部分,section內的quad會因為距離遠近改變網格,最終透過減點的方式達到降低解析度的結果。
圖中是將一個4*4 quad的section縮成3*3的減點過程圖(俯視)。

LOD changed when 4*4 quad section to 3x3 quad section. The left image is original section. The Middle image presents vertex moving between LOD change. The right image is the low level result.

參考資料

官方學習影片



留言

這個網誌中的熱門文章

UE4 除錯技巧分享 (一)

UE4 GameplayAbilitySystem - GameplayEffect & GameplayCue 如何設定參數

UE4 GameplayAbilityTask介紹