[程式] 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