[程式] UE4根據不同平台調整Static mesh的LOD

作者: yekdniw (yekdniw)   2020-09-02 10:31:27
網頁版
https://yekdniwue.blogspot.com/2020/08/MinimalLOD.html
通常開發跨平台遊戲的時候,會想要針對Static Mesh做LOD區隔。
而UE4提供好用的Minimal LOD功能,
讓開發者不用特別寫程式碼,
就可以根據不同平台調整LOD參數。
Minimal LOD的參數是可以每個static mesh設定的,
設定的地方可以在Static Mesh的編輯器內找到。如圖所示
[圖]
例如說Windows的Minimal LOD設為0,Android跟iOS設為1。
這樣的話在實際執行的時候,
Android跟iOS平台只會看到1以後的LOD mesh,
可以有效的控制場景總面數。
還有另一個參數
r.StaticMeshLODDistanceScale
可以控制LOD切換的距離。
數字越大代表會越早切換到低階層的LOD。
這個參數也可以針對平台做設定,不過是影響全域的變數,
所以要在Device Profile的頁面設定。記得要Save as Default才會存檔。
[圖]
舉例來說
r.StaticMeshLODDistanceScale=2.0
然後LOD1的screen size設為0.3的話
代表在這個平台0.3*2的距離就會切換成LOD1了。
不過使用LODDistanceScale有個小缺點,
就是在編輯的時候預設都是使用
r.StaticMeshLODDistanceScale=1.0。
要把場景調整到1.0跟2.0外觀看起來不錯的狀態,
是需要很多人工檢查的。
上面提到的兩個參數可以控制Minimal LOD,
不過這兩個參數都是執行的時候,告訴系統該顯示哪一層LOD。
在打包的過程還是都會把全部的LOD都包進去,影響最後打包的容量。
如果想要避免比Minimal LOD更精細的LOD也被打包進平台內。
我們需要在打包的平台把Device Profile參數
r.StaticMesh.StripMinLodDataDuringCooking設為1。
或是使用文字編輯器打開
[Project Path]/Config/DefaultDeviceProfiles.ini
把以下區段
[Windows DeviceProfile]
DeviceType=Windows
BaseProfileName=
改為
[Windows DeviceProfile]
DeviceType=Windows
BaseProfileName=
+CVars=r.StaticMesh.StripMinLodDataDuringCooking=1
這樣,如果Android跟iOS設為1的話,這兩個平台在打包的時候就會避免把LOD0做輸出。
可以有效的減少低規格平台的資料量。
要注意打包的平台指是你的打包那台機器所屬的平台,
而不是你的目標平台,
通常會是Windows,MacOS,或是Linux。
實作程式碼在
FStaticMeshLODResources::GenerateClassStripFlags
FStaticMeshLODResources::IsLODCookedOut
可以參考看看。
作者: metallican (鋼鐵人)   2020-09-02 10:35:00
專業推

Links booklink

Contact Us: admin [ a t ] ucptt.com