UE纹理设置详解与优化指南(上)

UE纹理设置详解与优化指南(上)

【USparkle专栏】如果你深怀绝技,爱“搞点研究”,乐于分享也博采众长,我们期待你的加入,让智慧的火花碰撞交织,让知识的传递生生不息!


一、精华版

  1. 提前规划好纹理的合并策略:包括纹理通道合并(非必要不使用Alpha通道),纹理图集,纹理数组,且许多工作需要在引擎外完成。这对于优化CPU和GPU性能,以及减小包体大小很重要。

  2. 根据纹理的特点和需求选择合适的格式与分辨率:例如标准图像选择TGA,HDR选择EXR。如果需要生成Mipmap,启用纹理流送,纹理分辨率需要为2的幂次方。如果需要使用压缩设置建议分辨率可以被4整除,因为基础的纹理压缩块为4*4。

  3. 重视“纹理组”“最大纹理尺寸”设置:我们往往忽略的“纹理组”设置其实非常重要,一方面“纹理组”在我们看不到的地方根据纹理的用途做了许多性能和效果优化;另一方面一些设置提供“来自纹理组”选项,它们大概率是我们可以无脑选的最佳选择。保证美术效果的前提下设置适合的“最大纹理尺寸”对于纹理优化很重要。

  4. 纹理压缩建议:sRGB颜色空间的纹理(包括UI贴图)选“默认(DXT1/5,BC1/3)”,法线纹理选“法线贴图(DXT5,BC5)”,线性颜色空间的纹理选“遮罩(无sRGB)”,前面3类纹理如果需要更高图像质量选“BC7(可选的A)”,单通道纹理选“透明度(BC4)”,HDR纹理选择“HDR已压缩(BC6H)”。如果不需要Alpha通道则启用“无透明度压缩”,因为A通道占用RGBA压缩纹理一半存储空间。

  5. 做好纹理资产分类与规划管理:包括资产的文件夹目录与命名规范,色彩空间标准与规范,使用更小分辨率母版纹理作为母材质的默认纹理,避免不必要地加载过多与过大的纹理。

  6. 善用引用查看器/属性矩阵/UV编辑器/SizeMap等引擎工具,便于排查问题,资产管理,提升效率,优化性能等。


上图为UE5的纹理资产编辑器,与纹理相关的设置基本在界面的右侧面板。本文围绕UE5纹理的各项设置功能详细介绍并深挖其机制原理,并分享一些UE纹理优化的策略和方法。

二、纹理类型

常见的纹理资源类型包括标准的图像纹理(PNG/TGA/JPG)、立方体纹理(EXR)、IES配置文件(IES)、体积纹理和渲染目标。

常见的纹理命名规范:T_美术用途_自定义_512(宽)_1024(高)_4(通道数量)

标准的图像纹理
常用的格式有三种,具体选择那种需要根据他们的特性。TGA和PNG是游戏领域常用的两种格式,它们都是无损的格式。

二者的主要区别:一是在于PNG图片有透明度但没有Alpha通道,而TGA图片有Alpha通道,因此美术在PS中想要对Alpha通道做特殊编辑时使用TGA更方便,PNG图片在引擎内的Alpha通道是引擎根据图片的透明度自动生成。

二是PNG格式可以通过压缩降低文件大小,因此同样的图像内容和分辨率它的资产大小远小于TGA格式。但是二者导入引擎后,分辨率和引擎压缩设置相同的情况下资产大小相同,且PNG文件导入引擎时会多一道解压缩过程。

JPG格式属于有损压缩,体积很小,但是不支持透明度和Alpha通道,且相同分辨率和压缩设置的情况下压缩容量小于TGA和PNG,因此适合用于大分辨率的不透明纹理。

相同纹理分别存储为PNG/TGA/JPG格式后导入UE引擎后压缩容量的差异:

常见的标准图像纹理包括:颜色贴图、漫反射贴图、透明度贴图、法线贴图、自发光贴图、反射贴图、金属度贴图、粗糙度贴图、AO贴图、遮罩贴图、高度贴图、位移贴图和Flowmap等等,它们基本上是作为材质的参数输入。

针对种类多样的贴图我们常见的优化方案是把它们合并进纹理不同的通道,例如把金属度/粗糙度/AO贴图合成一张RGB纹理(即MRAO纹理),把BaseColor纹理与透明度纹理合成一张RGBA纹理。

并且我们可以在UE的纹理编辑器内单独查看每个通道的贴图数据。

立方体纹理
立方体纹理名如其意,由六个正方形纹理面(通常分别表示上、下、左、右、前、后)组成,统一构成一个立方体。通常用于创建环境映射(Environment Mapping)或天空盒(Skybox),提供于材质采样以实时反射周围环境,实现更真实的视觉效果。

立方体纹理常用的格式为DDS(DirectDraw Surface),能够有效支持各种压缩格式(如 DXT1、DXT5),并允许快速的GPU加载。PNG和TGA也可用于立方体纹理的源图像。

立方体纹理在纹理编辑器中的操作和设置与标准图像纹理无太大区别,在工具栏中多了“面”操作和“三维视图”操作。

启用面操作后,可以通过输入数字号码来查看立方体纹理的各个面,从0-5分别对应正X、负X、正Y、负Y、正Z、负Z。

启用三维视图后,可以预览立方体纹理的3D空间效果,按住鼠标左键并拖动就可以旋转在三维视图中的视角。

立方体纹理在设置时主要注意选择正确的纹理组,例如“天空盒”,以及选择正确的压缩方式,建议HDR已压缩(BC6)。

IES配置文件
IES(Illuminating Engineering Society)文件是一类照明行业标准方法,提供了灯具的光强分布数据,包括角度、强度等,这些信息可使光照考虑灯具的反光表面、灯泡的形状以及发生的透镜效应。在UE中它被用于创建更逼真的光源效果,模拟真实世界中的光源,比如各种灯具的照明表现。

IES光照配置文件(IES Light Profiles)被称为“1D 纹理”(渐变纹理),但实际并不属于传统的纹理文件。它们使用的数据格式是为了有效地描述光的强度分布和方向,且它们的使用对象是光源而非材质。

IES文件包含一个曲线,该曲线定义了光源在不同角度下的光强度,这些数据反映了真实世界中灯具的光分布特性。这个曲线沿一个轴线“扫动”,它定义了光的发射方式,对于点光源和聚光灯来说,曲线表明在不同角度下应该有多少光输出。IES光谱曲线的主要作用是作为一个亮度的乘数影响整体光源的强度。使用IES光照配置文件可以避免传统纹理映射过程中的开销和瑕疵。在某些角度下,传统纹理由于分辨率限制可能出现失真,而IES配置文件通过数学模型避免了这种问题。

IES文件虽然本质非纹理,但同样由纹理编辑器查看与设置,它比标准图像纹理多出两项设置:亮度和纹理乘数。

此外关于IES文件的设置建议:纹理组设为“IES光源描述文件”,压缩设置为半浮点(R16F)。

体积纹理
体积纹理(Volume Texture)是一个三维数组,与常规的二维纹理不同,体积纹理提供了额外的深度维度,使其可以在三维空间中进行数据操作和呈现。这种纹理形式常用于需要在三维空间中访问和插值的应用,如云彩、烟雾、体积光、体积效果、模拟流体或其他复杂的场景效果。

体积纹理通常比二维纹理占用更多的内存,因为其数据结构需要存储额外的深度信息,所以尺寸与分辨率需要根据具体需求进行调整,以平衡好效果和性能。

体积纹理的二维展示:

启用三维视图后可以查看体积纹理的三维效果:

在纹理编辑器中体积纹理的设置与标准图像纹理并无本质不同,因为体积纹理可以看作是由普通2D纹理堆叠而来,主要格式包括:PNG/TGA/DDS/EXR,所以它的Mipmap设置、压缩设置和颜色设置可以参照标准图像纹理。

体积纹理的一项额外设置是源2D,设置参数包括:源纹理、瓦片大小X和瓦片大小Y。它的主要功能是通过源纹理中输入的2D纹理,通过瓦片大小X或瓦片大小Y中的参数切分后合成体积纹理。

渲染目标/立方体渲染目标
渲染目标(Render Target)是一种特殊的纹理,用于在运行时将渲染的内容保存到纹理中以供使用。渲染目标的用途有很多:后期处理效果(Post-Processing Effects)、反射和折射、动态纹理、实时光照和阴影、深度和模板信息、Mini-Maps和HUD、第一人称视角效果以及特殊的材质效果。

渲染目标有较高的消耗内存,尤其在高分辨率或多重渲染目标的情况下,更新频率可能会影响性能,需要根据需求适当降低更新频率。

渲染目标相比标准图像纹理有许多特殊的设置,包括:尺寸XY、清除颜色、地址XY、渲染目标格式、自动生成Mip、Mip采样器过滤、Mip U地址、Mip V地址、共享以及纹理渲染目标的目标伽马。

立方体渲染目标可以看作是立方体纹理与渲染目标的结合体,性能开销大,较少在实时渲染中使用,它的设置项如下图:

媒体纹理
媒体纹理(Media Texture)是一种特殊类型的纹理,可以把视频文件作为纹理源,直接在游戏或应用中播放并显示它们。媒体纹理不能够单独使用,需要配合媒体播放器或媒体源等文件才能实现在关卡场景内播放视频。

媒体纹理同样需要在纹理编辑器内完成设置,但它的设置项与其他类型的纹理差异较大。媒体纹理没有了层次细节、压缩、纹理和调整等设置,主要设置项为自动清除、清除颜色、启用Mipmap生成、要输出的Mipmap总数、启用新风格输出、输出格式(默认sRGB/sRGB线性输出)、过滤器、XY轴平铺法和媒体播放器。

纹理数组
2D纹理数组和立方体纹理数组是用于存储多个纹理的高级纹理类型,这些纹理数组在许多应用场景中可以大大简化材质和纹理管理。将需要同时调用的多张纹理贴图合成为纹理数组或纹理图集,可以降低DrawCall优化CPU性能,例如将同一界面出现的UI贴图适合制作成纹理数组或纹理图集。

注:纹理图集与纹理数组功能相似但不是同一个概念,纹理图集主要用于二维游戏和UI元素,是把多个低分辨率的小纹理合并成一个更大的单一纹理,然后重新映射UV使用各个小纹理。纹理图集通过减少渲染期间的状态切换和绘制调用来提高性能。

2D纹理的本质是为多张纹理建立一个组,其主要设置与标准图像纹理无差异,因此需要注意纹理数组内的纹理各项设置统一,层级细节、压缩和颜色等无法个性化设置。纹理数组在纹理编辑器中多了一项源2D设置,这里的源2D与体积纹理的不同,体积纹理是将一张2D纹理切割组成一个3D纹理,而纹理数组是将数个纹理编组管理。

纹理数组的源2D设置项包括:地址XYZ(包裹/限制/镜像)、纹理源(可按需添加),此外在纹理细节面板会显示纹理数组中的纹理数量。

纹理数组信息面板:

纹理数组普通预览与切片预览:

三、层次细节

层次细节设置主要围绕Mipmap,最常用的设置包括Mip生成设置、LOD偏移和纹理组。

Mipmap的使用主要是为了解决纹理分辨率与采样频率之间的矛盾,在三维场景内,离摄像机(屏幕)近的位置有更高的采样频率,需要更高的纹理分辨率,否则容易失真走样;离摄像机(屏幕)远的位置采样频率会变低,应该对应更低的纹理分辨率,否则会出现锯齿和摩尔纹,即Mipmap通过摄像机与场景的距离匹配采样频率与纹理分辨率。

但Mipmap容易导致场景远处的贴图过于模糊,这是由于Mipmap是正方形的而实际场景因为透视需要往往是扭曲的长方形,因此出现了针对各向异性的Ripmap。

Mipmap与Ripmap开启后纹理内存都会增加1/3,单Ripmap需要更多的采样点,渲染时运算消耗更高。

Mipmap与Ripmap的层级数量由引擎根据贴图分辨率自动计算,渲染时使用哪一层级(Level)由Shader自动计算。

我们只需要判断是否需要开启Mipmap,即是否可以通过增加1/3的纹理内存优化3D场景中的贴图表现效果和渲染性能。

如需详细理解Mipmap的原理可以阅读下文:
《纹理映射(Texture Mapping)及Mipmap技术》

1. Mip生成设置

Mip生成设置中提供的主要选项有:来自纹理组、简单平均数、锐化、模糊、无Mip贴图等。

“来自纹理组”是默认也是最常用选项,配合下面的“纹理组”设置可以“无脑”选择最适合纹理用途的Mipmap模式,例如UI纹理只需要在纹理组中选择“UI”,再选择来自纹理组,与层次细节相关的基本设置会自动匹配最佳设置,不必再进行复杂的思考和选择。

注意,如果想要为纹理设置多层Mip,分辨率必须为2的幂次方,例如32、64、128、2048等。

“简单平均数”是指当分辨率较大的一层Mip变成分辨率较小的一层Mip时,使用2x2核尺寸合并成一个新的像素,这个像素的颜色值是先前多个像素的颜色值的平均数。

“锐化”是指当分辨率较大的一层Mip变成分辨率较小的一层Mip时,会使用8x8核和负权重生成相对较锐利的低分辨率纹理版本。“锐化”会优先生成带有细节的纹理,更加突出纹理的边缘和特征。更适合细节丰富的纹理,比如石头、树皮。

Sharpen0并非锐化,但它仍然使用质量向下采样过滤所有锐化设置(4x4高斯核)。与SimpleAverage相比,它效果更模糊但却拥有更高精度。

“模糊”与“锐化”相反,它是通过特殊的卷积核生成更加平滑、低对比度的低分辨率纹理版本。相较于锐化后的纹理,模糊的纹理噪点更少,视觉体验更舒服。

“无Mip贴图”,当选择无Mip贴图时,引擎将不再为纹理生成多层Mip,最上方的细节信息会显示“Mip数量”为1。


左侧纹理没有Mip,右侧纹理有Mip。

2. LOD偏移

我们常在模型优化设置中看到LOD(Level of Detail)这个名词,可以把Mipmap理解为纹理的Level of Detail,所以“LOD偏移”其实是对纹理Mip的偏移。

默认情况下,使用该纹理的材质会根据距离和屏幕空间大小来选择最合适的Mipmap级别,且级别从0开始,代表最高分辨率的纹理,然后逐级降低。而“LOD偏移”设置允许指定渲染时的Mipmap级别。通过调整偏移值,可以使纹理在更早或更晚的距离上切换到不同的Mipmap级别。

正值偏移:会使引擎在使用中选择比正常使用的更低一个级别的Mipmap。这个设置可以在需要节省性能的时候使用,例如在视觉中不重要的部位使用更低分辨率纹理。

负值偏移:会使引擎在使用中选择比正常使用的更高一个级别的Mipmap。适用于需要更高细节精度的场景,如需要近距离清晰观察的物体。

虽然“LOD偏移”是纹理的基础设置,但在游戏项目中并不是很常用。简言之,需谨慎使用LOD偏移,过度调整可能导致性能下降或视觉不一致。特别是在运行复杂场景时,应该较为小心地控制偏移值。

3. 纹理组

在Mip生成设置中的“来自纹理组”选项处我们已经提到了“纹理组”,纹理组设置(Texture Group Settings)的功能正是对“纹理组”进行选择,并设置一系列的属性,以优化纹理在游戏中的使用。这一功能对于管理各种类型的纹理资源至关重要,可以帮助提高性能、降低内存使用,并确保在不同环境中的最佳使用。

与纹理组相关的属性主要包括:最小Mip与最大Mip,LOD偏移,最小/最大过滤器,Mip过滤和Mip生成设置。

下面是引擎对World纹理组的配置:
TextureLODGroups=(Group=TEXTUREGROUP_World,MinLODSize=1,MaxLODSize=4096,LODBias=0,MinMagFilter=aniso,MipFilter=point,MipGenSettings=TMGS_SimpleAverage)

四、层次细节-高级

1. 保留边界

当保留边界(Preserve Border)为True时,Mipmap生成时将保留纹理的边界。比如在角色的边缘或重要的视觉元素上,适当的边界保留可以防止在纹理变换时出现模糊或前景后景融合的问题。

2. 缩减与缩减选项

缩减(Downscale)仅应用于没有Mip(mips < 1.0)的2D纹理,可以根据不同的平台和系统进行针对性的缩减设置,以优化纹理的分辨率从而减少内存使用和提高性能。缩减设置的参数范围为0-8,值为0时使用纹理组中的比例值,为1.0时不缩放纹理,大于1.0时缩放纹理。

缩减选项(Downscale Options),当缩减(Downscale)用于没有Mip的纹理时,可以在此设置纹理缩小时的过滤方式,它们与Mip生成设置的选项类似,主要包括:默认、未过滤、简单均数和锐化。

3. 动画Mip等级数

“动画Mip等级数”(Num Cinematic Levels)同样是与纹理Mip相关的设置,不同之处在于它是针对过场动画与电影级渲染时设置的Mip级数。

此设置指定纹理以过场动画精度强制流入时用于过场动画的高分辨率Mip等级数量。数值为0(即默认值)表示在过场动画时使用默认的Mip级别。数值为1表示将纹理在游戏中的分辨率降低一个Mip等级(Mip级别越低纹理分辨率越高)。数值为2则降低两个Mip等级,以此类推。此外,也可以在“纹理组”中选择“过场动画”,与此项设置配合使用。

4. 从不流送

此设置与“纹理流送”有关,当纹理设置中勾选此项,该纹理将不会被流送。

它允许引擎按需加载和管理纹理,以便在保持高质量的同时优化内存使用和性能。这种方法特别适合大型开放世界游戏或具有复杂纹理的场景,因为它可以有效减少GPU内存的占用。

纹理流送的基础逻辑是根据相机视角和距离动态加载最合适的Mipmap级别来工作。所以说只有能够生成Mip的纹理才有可能被流送。

构建纹理流送数据。

显示当前流送纹理分辨率和所需纹理分辨率之间的关系:
红色:缺失2X+个Mip;
黄色:缺失1个Mip;
白色:良好数据;
青色:多余1个Mip;
绿色:多余2X+个Mip

5. 整体强制常驻Mip等级

如果希望将特定纹理的Mip级别强制常驻,以确保在运行时不会被卸载,可以通过设置纹理的“整体强制常驻Mip等级”(Global Force Resident Mip Levels)属性来实现。这对确保纹理在特定情况下保持较高质量时有效,例如在需要频繁查看的对象上。

五、压缩

纹理压缩可以同时减轻GPU和CPU的负担,减少了资源在CPU中进行解压缩的过程,减小了包体大小,减少了数据量级,更快地加载时间,减轻了带宽计算的压力内存使用效率更高,显著减少显存的使用,使游戏能够加载更多的纹理。

1. 无透明度压缩

此项设置对于拥有Alpha通道的纹理且不需要使用Alpha通道时有用,正确开启后可以节省纹理的一半资产大小,纹理信息也会显示“拥有Alpha通道”为“False”。至于为什么开启“无透明度压缩”后会节省一半的资产大小,是因为RGB纹理压缩与RGBA纹理压缩方式不同。(详见本节的4.压缩设置。)

无透明度压缩开启前:

无透明度压缩开启后:

2. 编辑器显示最终编码

如果启用,则在此编辑器会话期间以最终质量压缩纹理,使其使用最终级别(RDO,Rate Distortion Optimization)编码,而不是默认的快速级别(非RDO,Rate Distortion Optimization)。对应的“编辑器显示最终编码”为“True”,纹理信息中的“编码速度”显示“最终”;为“False”。纹理信息中的“编码速度”显示“快”。

在使用Unreal Engine的纹理压缩方案“Oodle纹理”前,我们需要了解码率失真优化 (RDO,Rate Distortion Optimization)的概念,RDO指在数据编码过程中,通过权衡传输速率与图像质量之间的关系,寻求最佳的压缩效果。Oodle提供了4种不同的压缩格式,具有不同的编码/解码速度和压缩比,默认是“Kraken”。

通过设置Oodle的RDO lambda值可以在几乎不影响纹理质量的情况下优化项目包体大小,启用“编辑器显示最终编码”正是显示应用项目RDO lambda值压缩后的纹理效果。

下图是Oodle不同压缩设置的对比图。

3. 编辑器延迟压缩

如果启用,则推迟纹理的压缩,直到在纹理编辑器中保存或手动压缩。如果不启用则实时显示纹理压缩设置对应的压缩结果。

下图是启用前后纹理信息面板显示的对比图,他们的差别主要表现在:格式、资源大小、拥有Alpha通道和编码速度。

启用前:

启用后:

4. 压缩设置

纹理的压缩格式是基于块压缩,且绝大多数的压缩块是4*4像素,所以纹理分辨率如果不能被4整除则无法成块无法压缩。

基于块压缩的纹理能更快读取像素所属字节块进行解压缩以支持随机访问,且相比于普通的图片压缩格式,能够直接实现单个像素的解析,不需要CPU解压成非压缩格式就可以被GPU识别。

常见的纹理格式:

以64位的DXT1为例,一个压缩块中32位存储2个16位的RGB颜色极值,另外32位存储16个2位索引值。128位的DXT5的RGB值存储方式与DXT1相同,区别在于另外64位存储Alpha值:2个8位Alpha极值,16个3位索引值。ETC与ASTC同样是基于块的压缩算法,块的大小为64/128位,数据存储方案存在一些差别。

纹理压缩比:

以下是UE5中常见的几种贴图压缩格式及其特点:

  1. 默认(Default,DXT1/DXT5/BC1/BC3)

默认压缩格式,适用于大部分纹理,通常用于BaseColor贴图。如果有Alpha通道,则使用BC3/DXT5,否则使用BC1/DXT1(实际上BC1也是有Alpha通道,只是通道所占位数只有1,所以UE直接忽略掉)。这种格式的压缩比率通常是8:1 。

BC1中的RGB所占比例是5:6:5,所以G通道存储信息的精度更高一些;而BC3中的RGBA所占比例是5:6:5:8,所以可以根据对信息精度的需求选择适合的存储通道。

  1. 法线贴图(Normal Map,DXT5/BC5)

专门用于法线贴图的压缩格式,不包含sRGB,可以有效地压缩法线贴图而不损失太多细节 。“法线贴图”的压缩格式为BC5,其中RGB所占用比例是5:6:5,对于法线数据的存储来说是不够的。如果需要更高质量的法线纹理,可以考虑用BC7(R8G8B8A8),这种纹理压缩方式能保证每个通道的比例都为8,能让贴图得到更小的压缩以及更多的细节。

  1. 遮罩(Masks)

用于只需要灰度信息的纹理,如粗糙度、金属度、环境光遮挡等,同样是使用DXT1/DXT5/BC1/BC3压缩,不包含sRGB 。“遮罩”与“默认”模式类似,区别在于是否需要勾选sRGB。

“遮罩”纹理往往是将3至4张灰度纹理按照通道合并,再通过压缩可以显著缩小资产大小,但精度也会有相应的损失,为了提高精度也可以选择BC7格式压缩。此外,非必要情况下,建议使用RGB贴图而非RGBA贴图,因为对于BC3/DXT5,每4*4的压缩块为128bits,其中64bits存储RGB Color,另64bits存储Alpha。

相同分辨率下,BC7压缩比法线压缩格式更清晰一些,但也存在像素块明显和容量稍大一些的问题。

注意:BC7压缩格式的法线纹理只能在材质实例中使用,母材质针对法线纹理采样有针对性的优化,纹理采样器的类型需选择“法线”,且使用法线压缩格式的纹理,否则会编译报错。

  1. 灰度(Grayscale,G8/16,RGB8)

高质量灰度压缩,不包含sRGB ,适用于需要高质量灰度信息的纹理,如高度图 。

G8/16是常见的灰度格式,“灰度”格式主要用于存储黑白图像,其中每个像素仅包含亮度信息,而没有颜色信息。

G8表示每个像素用8位(1字节)存储灰度值,值的范围从0到255,0表示黑色,255表示白色。G16每个像素用16位(2字节)存储灰度值,提高了灰度级别的分辨率,值的范围从0到65535,允许更细腻的灰度变化,适合需要更高精度的应用。

“RGB8”是一种常见的颜色图像格式,每个像素包含红、绿、蓝(RGB)三个颜色分量的信息,每个分量占用 8 位。

  1. 置换贴图(Displacement Map,G8/16)

用于在模型表面添加几何细节的纹理类型,输出到材质顶点位置偏移,改变模型表面的顶点位置,从而创造出更加真实的三维效果。与灰度贴图相似,也是单通道的G8/G16格式。

置换贴图也称作高度贴图(Height Map),其中灰度值代表顶部到底部的高度变化。较暗的值代表低点,而较亮的值代表高点。置换贴图允许物体表面根据纹理表面变化,呈现出细腻的三维效果,而不仅仅是法线的仿真。

  1. 向量置换贴图(Vector Displacement Map,RGBA8)

向量置换贴图与普通置换贴图基本相同,区别在于根据其RGB三个通道的信息来改变模型表面在X、Y和Z方向的位移,而普通置换贴图只有一个通道用于改变模型表面的高度位置。

注意!灰度贴图、置换贴图、向量置换贴图都未经过引擎的纹理压缩处理,导致资产大小较大,建议单通道时设为“透明度”,使用BC4压缩。

  1. HDR(RGBA16F)

主要用于存储高动态范围图像(HDRI),通常不使用压缩,格式为floatRGBA,每个通道使用16位(float)浮点数来表示颜色值,提供更大的动态范围和更精确的颜色表示,因此常用于基于图像的照明或天空盒的纹理,以还原真实的世界。

HDR(High Dynamic Range)纹理常用的格式为EXR,也可以选择使用HDR或者TIFF。HDR的精度远高于8位,所以RGB通道的数值范围超过1。HDR具有更好的色彩,更高的动态范围和更丰富的细节,并且有效的防止画面过曝超过亮度值1的色彩也能很好的表现,使像素光亮度变得正常,视觉传达更加真实。我们常用的Bloom效果就必需HDR的支持。但也有一些缺点:渲染速度较慢,需要更多的显存,不支持硬件抗锯齿。

与HDR对应的是SDR(标准动态范围),精度为8位,RGB通道的数值范围是0~1,我们使用的绝大多数纹理为SDR。

虽然HDR的视觉效果更好,但是引擎最终输出的画面依然是LDR的,所以需要经过一步ToneMapping(色调映射)把HDR转化为LDR。Academy Color Encording System学院颜色编码系统最流行、最被广泛使用的Tonemapping映射曲线,效果的对比度提高,很好地保留暗处和亮处的细节。

  1. 用户界面2D(User Interface 2D,RGBA)

用于UI元素的纹理,通常不压缩,以保证UI元素的清晰度。但正因为这项设置会导致纹理不被压缩,增大了项目的包体和性能压力,所以大部份情况下UI纹理不会使用该项设置,而是使用压缩率与清晰质量更平衡的BC7格式。

  1. 透明度(Alpha,BC4)

用于只需要Alpha通道信息的纹理,使用BC4压缩,适合于贴图不需要颜色信息,只需要透明度信息的情况 。“透明度”与“灰度”压缩设置类似,同样是单通道无颜色信息,不同之处在于一个是存储透明度信息,一个是存储亮度信息;一个有压缩,一个无压缩。所以一些灰度纹理可以设置成“透明度”压缩,以节省纹理一半的资产大小。

对于相同分辨率的灰度图,透明度压缩的效果要远远好于遮罩压缩,但压缩容量要稍大一些。不过分辨率高一个Mip级别的情况下,透明度压缩的效果依然好于遮罩压缩。例如,相同图像内容的纹理256分辨率的透明度压缩效果要好于512的遮罩压缩,此时透明度压缩的最终容量要远小于遮罩压缩。

同时,选择透明度压缩后,纹理会变成单通道,但在材质纹理采样器中,RGBA的4个输出通道都可以正常使用,且输出内容均为单通道的图像信息。

  1. 距离场字体(Distance Field Font,G8)

用于距离场字体的贴图,只需要单通道灰度信息,使用G8格式。

  1. HDR已压缩(HDR Compressed,BC6H)

用于压缩HDR贴图,提供比未压缩HDR更好的压缩率和质量,仅在DirectX 11及以上版本中可用 。

BC6H是一种纹理压缩格式,支持高动态范围(HDR)图像,压缩比为6:1。与传统的纹理压缩格式(如DXT,BC1、BC3和BC5)不同,BC6H处理的是浮点数据,适合用于HDR内容。并且支持RGB颜色空间的无损压缩,能够保存细腻的颜色过渡和深度信息,常用于反射贴图、光照贴图和其他需要高动态范围的数据。

注意!HDRI资产体积往往非常大,大部分情况下需要设置成“HDR已压缩”,而非“HDR”。

  1. BC7(DX11,可选的A)

高质量纹理格式,适用于特别重要和需要高质量压缩的纹理,提供4:1的压缩比率,并且可以包含Alpha通道 ,仅在DirectX 11及以上版本中可用。

BC7能够处理不同的压缩模式,和不同类型的纹理,既可以用于RGB,也可以用于RGBA;既可以压缩BaseColor,又可以压缩Normal。它可以在显示高对比度和复杂细节的纹理时减少锯齿现象,适合于需要保持色彩细节和渐变平滑性的场景,所以对需要较高视觉品质的BaseColor/Normal Texture可以采用BC7格式压缩。

  1. 其他压缩设置

除此之外,还有些并不常用的压缩设置:半浮点(R16F)、单浮点(R32F)和HDR高精度(RGBA32F)。这些设置虽然可以提供更大的范围和更高的精度,但是并未压缩,资源大小数倍增加,所以大多数情况下游戏项目内不会使用这些设置。

R16F是一种16位单通道(灰度)格式,它将红色通道的值编码为16位半浮点值,并丢弃其他通道。而且提供了比8位格式(如G8)更高的颜色值范围,适合需要较高动态范围的场景。

R32F是一种32位单通道格式,使用32位浮点数来存储红色通道的值,适用于需要极高精度的场景。单浮点格式能够提供比半浮点更高的精度,但也会占用更多的内存和带宽。

RGBA32F这是一种32位四通道格式,每个通道都使用32位浮点数,适合存储高动态范围(HDR)图像。RGBA32F格式可以存储更广泛的颜色和亮度值,适合需要极高精度和宽色域的应用。

六、压缩-高级

1. Oodle纹理SDK版本

该项设置用于选择和管理使用Oodle Texture库时编码纹理的版本。

项目中的每个纹理在创建时都会与特定版本的Oodle Texture SDK关联。这可以保持兼容性,避免未来SDK更新可能导致的纹理行为问题。

默认情况下,当创建新纹理时,它会被分配为当前版本的Oodle Texture SDK。这确保了纹理利用当时最新的功能和优化,而不受后续SDK更新可能引起的变化影响。

如果遇到编码问题或需要利用Oodle SDK新版本中的改进,可以通过在纹理属性中的指定数字字段中输入关键词“latest”来手动更新纹理的版本。这会指示Unreal Engine对该特定纹理使用最新版本的Oodle Texture SDK。

如果将该字段留空,纹理将回退到使用项目的旧版Oodle Texture编码设置。这在旧项目或需要与先前SDK版本保持兼容的纹理中很有用。

当“重新导入纹理”时,引擎会自动更新纹理以使用指定的最新SDK版本。这个自动过程有助于确保资产与最新Oodle Texture更新中的优化和修复保持同步。

2. 最大纹理尺寸

最大纹理尺寸是指生成纹理可以使用的最大分辨率。此设置有助于控制材质和纹理使用的内存和性能,是我们在纹理优化中较常使用的功能。一般情况下美术可以出一张更大分辨率的纹理测试效果,然后通过该项设置降低为适合的纹理分辨率。

此值设置为0时,意味着所有平台上均允许使用该纹理格式的最大尺寸。具体的最大尺寸还取决于所支持的平台和其硬件能力。例如:对于PC,通常支持较大尺寸,如4096x4096或8192x8192。对于移动设备,最大纹理尺寸可能会更小,例如2048x2048或1024x1024。受某些GPU的支持上限约束,引擎支持的纹理分辨率上限为8192(8K)。

虽然较高的纹理分辨率可以提升图形质量,但它也会增加显存的使用和渲染时间。因此,在设置最大纹理尺寸时,需要平衡视觉效果与性能之间的关系。

3. 有损压缩数量

有损压缩数量用于控制每个纹理的Oodle Texture RDO Lambda,即影响纹理压缩质量与文件大小之间的权衡。项目设置中有整体的RDO Lambda级别,如果有必要对特定纹理进行单独调整可以使用此设置。

此项设置提供的选项包括:默认、无有损压缩(即禁用Oodle RDO)、最低(Oodle RDO为1)、低(Oodle RDO为10)、中(Oodle RDO为20)、高(Oodle RDO为30)和最高(Oodle RDO为40)。Oodle RDO的值越高代表:纹理质量越差,体积越小。

该设置主要用于调整特定纹理,以满足项目的需要。例如,在项目整体压缩数量设定后,某些重要的视觉效果或核心资产可能需要更高的图像质量,可以通过该项设置针对性调整压缩品质。

4. ASTC压缩质量

ATSC是移动端常用的高质量纹理压缩格式,其压缩算法与BC7类似。优点是可根据不同图片选择不同压缩率算法,纹理尺寸不需要是2的幂次数,同时支持LDR和HDR,缺点是兼容性不够完善且解码时间较长。

“ASTC压缩质量”指纹理使用ASTC格式压缩时的质量级别。不同的质量设置会影响纹理的清晰度、细节保留以及压缩后的文件大小。

“ASTC压缩质量”的选项包括:默认、最低(12*12)、低(10*10)、中(8*8)、高(6*6)和最高(4*4)。ASTC是基于块的压缩算法,12*12至4*4是指压缩块中的像素数量,像素数量越小则压缩质量越高。

5. 压缩缓存ID

压缩缓存ID是一个标识符,用于跟踪和管理纹理的压缩版本。当你对纹理进行更改(例如更改设置、质量或源文件),并希望这些更改立即生效时,可以使用这个ID。

这一设置常被用于纹理设置更改后触发重新压缩,纹理源文件更新时的重新压缩,消除缓存问题以确保新设置被应用。

6. 烘焙平台平铺设置

烘焙平台平铺设置允许您选择纹理在烘焙时的处理方式。这种设置影响纹理在最终渲染阶段被提交给GPU的方式。

“烘焙平台平铺设置”的选项包括:来自纹理组、烘焙时平铺和烘焙时不平铺。

“来自纹理组”是默认选项,此选项将根据纹理所选择的纹理组来判断烘焙时是否平铺。

“烘焙时平铺”指纹理在烘焙过程中将被处理为平铺格式,意味着纹理将被重复应用,能够更有效地利用内存和带宽。

“烘焙时不平铺”即纹理在烘焙时将保持线性格式,平铺将推迟到实际提交给GPU的时候。这样做的优点是可能会减小在烘焙期间的计算负担,但可能会在实际渲染时增加GPU的工作量。

所以说硬件平台的性能是判断是否烘焙时平铺的重要因素,例如性能受限的移动平台应该选择平铺纹理,以减少纹理的内存占用。


更多内容请关注《UE纹理设置详解与优化指南(下)》

这是侑虎科技第1794篇文章,感谢作者RE-Ding供稿。欢迎转发分享,未经作者授权请勿转载。如果您有任何独到的见解或者发现也欢迎联系我们,一起探讨。(QQ群:793972859)

作者主页:https://www.zhihu.com/people/ding-yan-qing-75

再次感谢RE-Ding的分享,如果您有任何独到的见解或者发现也欢迎联系我们,一起探讨。(QQ群:793972859)