DXT1 压缩为例介绍图片压缩的原理:
存储纹理的 RGBA 信息时,每个像素需要 32bit 来存储信息。对于 DXT 压缩,纹理被分成 4x4 像素的片段,然后进行压缩。这 16 个像素在没有压缩的情况下需要 512bit 来存储。
压缩时为这 16 个像素确定了 4 个调色板。之后每个像素都会得到一个索引到这个调色板中,每个像素只需要 2bit。对于调色板,仅存储两种颜色,即两个极端,另外两种颜色在这些极端之间进行插值。颜色信息也以压缩方式存储,因此每种颜色仅使用 16bit。这意味着纹理的这 16 个像素只需要 64bit 来存储(32bit 用于调色板,32bit 用于索引)。压缩比为 1:8。
这对原始纹理的颜色信息意味着什么?首先我们来看看调色板。它使用 16bit 来存储颜色,而不是普通的每通道 8bit。它为此使用 565 压缩,这意味着红色和蓝色以 5bit 存储,绿色以 6bit 存储。因此,这意味着你可以在纹理中使用更少的颜色,如果你使用非常相似的相同颜色的阴影,这些将在压缩中丢失。
下图显示了压缩如何影响颜色。在左侧,你可以看到 16 种红色,范围从纯红色到纯黑色。在右侧,你会看到 DXT 压缩选择代表这 16 个像素的四种结果颜色:
下图显示了一种极端情况:当不同颜色不在颜色空间中的一条直线上时会发生什么。在这种情况下,使用了所有极端(红色、绿色和蓝色)。很明显,由此产生的内插颜色与原始颜色完全不匹配。通常 4x4 像素的区域不会有如此广泛的颜色,但它说明具有许多不同颜色的纹理受到的影响更大:
这听起来绝对可怕,但有趣的是我们在这里只讨论微小的 4x4 块。在实践中,很少有块包含许多不同的颜色,即使它们有,下一个块也可以选择不同的颜色,因此瑕疵通常很小。DXT 伪影主要出现在三个颜色区域相互接触的地方,以及细小的轮廓周围。仔细查看下图,了解哪些情况会导致严重的伪影,哪些情况良好:
下面列举了虚幻中用到的压缩格式及压缩比率:
- BC7有八种不同的模式,具有不同的颜色深度和bit分布。
Default(DXT1/5、BC1/3 on DX11)
最有效的压缩配置文件。用于反照率/漫反射纹理。
这是最为通用、压缩比率最大的一种压缩设置。是使用非线性(或伽马校正)颜色信息的纹理最常见的压缩配置文件,如反照率/漫反射纹理贴图。
如果纹理没有 Alpha 通道,引擎将使用一种称为 DXT1(BC1) 的格式。这是虚幻提供的性能最高的压缩格式,它将使纹理的大小减少六倍。如果存在 Alpha 通道,它将使用称为 DXT5(BC3) 的格式,这会将纹理的大小减少四倍。
正如之前提到的那样,DXT(BC)压缩是有损的,它们是一类叫做S3纹理压缩(S3TC)的体系,在特定情形下会产生一些斑纹,对于拥有精致表面或超光滑表面的对象来说,这些斑纹往往会造成视觉问题。此外,对于高度纹理(Heightmap)及视差纹理(Bumpmap)来说,也会造成梯度边缘出现锯齿。
使用此配置文件时,添加一个 Alpha 通道将占用与其他三个通道组合相同的磁盘空间量,但同时由于 Alpha 通道具有特殊的压缩方式,它的精度很高。
这是在你决定将一个 Alpha 附加到漫反射贴图之前需要考虑的事情,是增加一个高精度的 Alpha 通道,还是另外增加一个 DXT1 纹理,它带有三个可用通道,但代价是增加一次采样。
Normalmap(DXT5,BC5 on DX11)
非常适合法线贴图还有流向图。
在可能的情况下,此配置文件将使用BC5,一种已针对法线贴图进行优化的 S3TC 格式。如果它不能使用BC5,它将回退到使用DXT5。
BC5压缩通过丢弃源的 B 通道,将纹理的 G 通道信息移动到 Alpha 通道的 8bit,并使用剩余的 8bit 存储来创建压缩的双通道 16bit 纹理。这使它成为法线贴图非常有效的压缩格式。
虚幻在对 Normalmap 处理时,会自动将其映射到法线颜色空间(-1 到 1),有时你可能需要更高质量的无损法线,从而避免过于光滑的表面产生S3纹理压缩的斑痕,当要使用其他压缩设置来作为法线纹理的压缩设置,则需要手动将其映射到法线颜色空间(-1 到 1)
Displacementmap(8/16bit)
用于置换或视差的未压缩单通道 8bit 格式。
顾名思义,它专为位移/高度贴图而设计。与 Grayscale 类似,但保留的是 Alpha 通道,RGB通道将被丢弃。
VectorDisplacementmap(RGBA8)
一种非压缩的 32bit RGBA 格式,专为顶点动画和其他 3D 置换目的而设计。
与 Displacementmap 相比,VectorDisplacementmap 提供了 4 个 8bit 通道,使用 B8G8R8A8格式。
当使用B8G8R8A8格式时,alpha 通道是强制性的(它将覆盖CompresswithoutAlpha设置),因此如果使用纹理仅存储 XYZ 位置数据,请记住在任何情况下都可以利用第四个通道的容量
HDR(RGB,no sRGB)
128bit HDR 图像。推荐用于基于图像的照明和天空盒。
HDR配置文件使用称为压缩格式FloatRGBA,拥有 4 个 32bit 通道,单像素占用128bit。它支持一个超级广阔的颜色空间。
HDR不支持 sRGB,无论你是否愿意,它都会添加一个 Alpha 通道,所以最好使用它。
Userinterface2D (RGBA)
与 VectorDisplacementmap 类似,一种非压缩的 32bit RGBA 格式,支持sRGB,被设计用于用户界面。
此配置文件旨在与界面元素一起使用,将使用B8G8R8A8
。与 VectorDisplacementmap 相比,从格式上来说,只是语义上的差别。
Alpha (no sRGB, BC4 on DX11)
适用于 DirectX 11 及更高版本的通用 16bit 单通道格式。
此配置文件适用于 Alpha 蒙版,但它也是一种非常有用的多用途灰度格式。它将从源纹理的 R 通道创建一个压缩的 16bit 灰度图像。
Alpha使用称为 BC4 的 S3TC 纹理压缩格式。与其他 S3TC 压缩格式一样,Alpha通过将图像分成 4×4 像素块来删除数据,这在某些情况下会导致网格状伪影。
DistanceFieldFont (R8)
与 DIsplacementmap 相同,8bit 单通道格式。
它是一个使用G8压缩的 8bit 灰度图像,它丢弃除源纹理的 Alpha 通道之外的所有内容。与 DIsplacementmap 相同。
让人疑惑的是它的标注R8,其并不是保留 R 通道而是保留 Alpha 通道,在使用时请注意。
HDRCompressed (RGB, BC6H, DX11)
HDR 图像的压缩格式,轻量级版本。仅支持 DirectX 11 及更高版本。
此配置文件使用称为BC6H
的较新压缩格式,它支持高动态范围颜色的 RGB 三个 16bit 通道。它通过使用“Half”Float来实现这一点。这仍然代表了数十亿种颜色——远远超过人眼所能看到的。
BC7 (DX11, optional A)
适用于 Direct X 11 及更高版本的更新、更高保真度的压缩格式。
BC7与 Direct X 11 一起发布,是一种更高级的 S3 压缩格式,它使用一系列方法对 4 个纹理数据通道进行编码。与DXT1/5(BC1/3)
等旧格式相比,它将提供更高质量的压缩和更少的伪像,并支持 sRGB,但它永远会保留 Alpha 通道。
Half Float (R16F)
非压缩 16bit 单通道格式。
这种单通道格式会将红色通道中的任何内容编码为 16bit HalfFloat
并丢弃其余部分。与通常的 16bit 纹理一样,与G8
等格式相比,这使得颜色值范围更大。
虚幻纹理优化建议
值得再次提出的是,虚幻提供的压缩设置用途分类仅仅只是一种建议,并不是一成不变的硬性规定。当你需要最大化平衡引擎性能和图像质量时,应该以合适的压缩格式而非用途建议来使用压缩设置。
上图中,我们关注以下几项信息,帮助我们决定使用哪种压缩设置:
- 颜色深浅表明压缩格式的颜色深度
- 蓝色深浅表明压缩格式的通道多少
- 黄色或绿色表明有损压缩或非压缩