贴图设置属性

官方文档

https://docs.unrealengine.com/5.3/zh-CN/textures-in-unreal-engine/

https://docs.unrealengine.com/5.3/zh-CN/texture-format-support-and-settings-in-unreal-engine/

属性

Texture Stream 与 LOD Bias

https://polycount.com/discussion/200525/ue4-texture-settings-help-mip-gen-settings-lod-bias-power-of-two-mode

ue 的贴图可以勾选 Never Stream,此时会取消纹理流送;否则默认开启纹理流送。

关闭纹理流送,就可以保证每次都加载贴图原生大小,保证最高分辨率,但是可能有性能影响,一般ui可以开。

纹理流送首先加载最小的mipmap,然后逐渐增加;如果 LOD Bias 为0,则最后加载到原贴图最大版本为止;为1则为第一级。例如 2048 的贴图,LOD Bias 为1,则纹理流送到 1024 为止。

Texture Group

纹理组,可以一起设置贴图的各种设置:默认压缩、mip生成、lod bias等等。

我们主要在 Device Profiles 设定,引擎路径 Engine\Config\BaseDeviceProfiles.ini 下有全局的设定:

项目Project路径\Config\DefaultDeviceProfiles.ini 下有各个设备的重载:

编辑器编辑入口:

Cook

对于贴图的 Cook 的调用栈为:

可能的分支:

贴图大小综合作用

贴图有 MaxTextureSize、Lod Bias、Texture Group,我们综合作用下,在cook对应平台时,会根据对应 DeviceProfile 以及贴图对应的 group 设置拿到 对应的 lod bias 等设置,例如我们安卓档配的 lod bias 是1,那么在贴图的 MipGenSettings 不为 TMGS_NoMipmaps 的时候,lod bias 会起作用,这时候 贴图的最后 lod bias 会在原始设置基础上增加安卓挡位的 1

若有 MaxTextureSize,则会在原来的宽高基础上做对应钳制,钳制完再应用 Lod Bias。

例如,MaxTextureSize 为 512,贴图设置 Lod Bias 为 2,原始宽为 2048,高 1024,MipGenSettings 不为 TMGS_NoMipmaps,对应到安卓档位的 lod bias 为 1;则在最后打安卓cook的时候: 此时 MaxTextureSize 起作用,首先把宽和高钳制,宽到 512,高到 256;接着计算 lod bias,为原始设置 2 加上安卓档位的 1 为 3,因此宽 512 » 3 为 64,高 256 » 3 为 32.

(这只是大体逻辑,更进一步的还会受到其他因素的影响)

1
2
3
4
5
6
UDeviceProfile* DeviceProfile = UDeviceProfileManager::Get().FindProfile("Android");
int32 CookedLODBias = 0;
if (DeviceProfile)
{
    CookedLODBias = DeviceProfile->GetTextureLODSettings()->CalculateLODBias(Texture, false);
}

但是我这里发现,我没有在启用编辑器下,也就是 WITH_EDITOR 是 0 的情况下,我测试的贴图的 GetSurfaceWidth 和 GetSurfaceHeight 一直为0,查了很久也不清楚是为什么。

最后改为了:

1
CookedLODBias = DeviceProfile->GetTextureLODSettings()->CalculateLODBias(Texture->Source.GetSizeX(), Texture->Source.GetSizeY(), Texture->MaxTextureSize, Texture->LODGroup, Texture->LODBias, 0, Texture->MipGenSettings, Texture->IsCurrentlyVirtualTextured());
Licensed under CC BY-NC-SA 4.0