UE教程

用心搭建好场景

Unreal引擎中贴图压缩格式分析

Hello,大家好。今天和大家分享一下Unreal引擎中贴图压缩格式分析,我是木偶心没。

一般我们从painter,designer或者ps里面导出贴图的时候都会选择一种文件格式,而文件格式只是图像为了存储信息而使用的对信息的特殊编码方式。导出的时候都先存储在磁盘或者内存中。而这些文件格式要放在游戏中使用都要进行纹理压缩。

所以,引擎里面的纹理压缩格式和导出贴图的格式是有关系的

下面具体分析一下每一类贴图的在引擎里面的压缩格式

1、BaseColor

一般来说,BaseColor的导出格式都是TGA,而在引擎里面压缩格式一般设置为默认的Default。 而default有两种压缩方式,一种是DXT1对应的BC1,另外一种是DXT5对应的BC3,两者的差别是BC1格式没有Alpha通道,而BC3有Alpha通道。(实际上BC1也是有alpha通道,只是通道所占位数只有1,所以在unreal里面就直接给忽略掉了)也就是说,如果一张导进来的BaseColor贴图选择了Default格式,那么如果自带alpha通道的话,默认在压缩的时候就会使用BC3,而没有带alpha通道的话,就自动使用BC1。

Unreal引擎中贴图压缩格式分析

BC1中的RGB所占比例是5:6:5,所以G通道会更丰富一些

而BC3中的RGBA所占比例是5:6:5:8,所以完全可以按照所占比例来分配basecolor的alpha通道所存放的数据

2、Normal

Normal在导出的时候一般也是TGA格式,然后在引擎里面选择NormalMap对应的BC5。但是同时也可以根据项目要求导出位数更高的贴图格式,比如16位的png,以及32位的exr文件(exr只能从painter里面导出来)

Unreal引擎中贴图压缩格式分析

而normal map是在高模上面烘焙出来的细节法线,所以在制作一些高质量的游戏的时候,我们需要更多细节,而BC5中RGB所占用比例是5:6:5,对于法线数据的存储来说是不够的,所以,我们可以考虑用BC7(R8G8B8A8),这种纹理压缩方式能保证每个通道的比例都为8。能让贴图得到更小的压缩以及更多的细节。

上面考虑了游戏画面的质量,同时也要考虑优化。Normal map是利用纹理中记录的值来干扰光照方程中的法线参数,以达到改变光照的结果,模拟表面细微纹理的作用。所以,normal map中保存的就是一个法向量(x,y,z),并且对于每一个点的法向量来说,xyz之间都存在x2+Y2+Z2=1,所以实际上可以根据其中两个通道来求得第三个通道。因为很多的normal贴图的第三个通道都是白色,所以如果对效果要求不高的可以直接给z取1的值,但是这里我们为了更好地效果在unreal的shader里面使用RG通道算出B通道的值;

如下图,我们先提取rg通道,然后用节点DeriveNormalZ_Function计算出Z轴

Unreal引擎中贴图压缩格式分析

得到的结果如下图,

Unreal引擎中贴图压缩格式分析

而如果我们用原本的RGB直接输入进去,会得到下面的截图

Unreal引擎中贴图压缩格式分析

对比可以发现,强度有一些差异,但是可以加一个控制法线强度的参数并调节匹配。而整体的阴影凹凸细节都是一样的。

3、Mask

引擎默认的mask格式和default是一样的,不带alpha的DXT1和带有alpha的DXT5。唯一的区别就是mask没有勾选srgb,因为不需要进行一个线性转化。而如果对mask有更多精度要求也可以选择BC7。