什么是DXT压缩?详解UE5材质每种压缩格式!如何选择适合项目压缩格式?...
Game艺视界原创 16201 0
实名

通过了实名认证的内容创造者

发布于 2022-5-8 22:23:52

您需要 登录 才可以下载或查看,没有账号?注册

x
本期内容
01-什么是DXT压缩?
02-UE5纹理压缩设置

01-什么是DXT压缩
DXT 是游戏中最常用的纹理格式,DXT 易于使用,但提供了一些奇怪的压缩伪影,因此了解它的工作原理对艺术家和图形程序员都非常有用。
请注意,DXT 通常也称为 DDS,因为 DXT 纹理通常保存为 .DDS 文件。DXT 也称为S3 纹理压缩。
DXT 有多个版本。最通用的类型是 DXT5,它存储了一个可用于透明度的 Alpha 通道。DXT5 每个像素仅使用 8 位,比完整的 32 位 RGBA 小 75%。如果不需要 alpha 或者只需要开/关 alpha,可以使用 DXT1,它更小:每像素 4 位,比 RGBA 小 87.5%。这是一场非常壮观的胜利,那么问题在哪里?

不利的一面是,由于 DXT 压缩纹理的方式,它会带来严重的质量损失。这种压缩对质量的影响很大程度上取决于艺术的类型:有些纹理看起来很糟糕,但在大多数情况下,只要不放大压缩,它就会看起来很好。放大到那么远在 2D 游戏中并不常见,因此尽管质量下降,DXT 仍然非常有用。


01ee356a39eadea61a71ecac1ee530a3.png

【译:DXT压缩通常在正常尺度下看起来不错,但放大后却有可怕的方形伪影。因为2D游戏很少能放大到这么远,所以问题远没有人们想象的那么严重】

DXT最基本的类型是DXT1。它是这样工作的:

2387527d5d05a44149baa3f3716b580c.png


这意味着如果单个 4x4 块包含几种不同的颜色,则不会有任何明显的压缩伪影。如果这些颜色靠近其他颜色,那么在块内有更多颜色也很好。例如,如果块存储红色和黄色,那么它也可以很好地存储橙色,因为它介于两者之间。如果块包含更多真正不同的颜色,则会出现严重的伪影。例如,如果一个 4x4 块包含红色、绿色和黑色,那么其中一个将丢失并被其他一个替换(以最接近的一个来减少伪影)
【译:如果单个 4x4 块包含两种以上不同的颜色,则必须丢弃一些。这里的深红色不会丢失,因为它介于黑色和亮红色之间。绿色不在中间,无法保存在此块中】

这听起来绝对可怕,但有趣的是我们在这里只谈论微小的 4x4 块。实际上,很少有块包含许多不同的颜色,即使它们有,下一个块也可以选择不同的颜色,因此人工制品通常很小。在 2D 游戏的实践中,DXT 伪影主要出现在三个彩色区域相互接触的位置以及细轮廓周围。仔细查看下图,了解哪些情况会导致严重的伪影,哪些情况很好。

正如你在上面看到的,如果你的作品包含很多细的轮廓,它会被 DXT1 严重损坏。但是,通过从 DXT1 转换为 24 位 RGB 来解决此问题会使您的纹理大 6 倍。哎呀!幸运的是,有一个很棒的折衷方案:如果您以稍高的分辨率存储 DXT 纹理,它看起来会好很多,但仍然比 RGB 小。放大使轮廓(或其他小细节)更粗,大大减少了伪影。如果你让你的纹理更宽 41% 更高,它会变成两倍大,仍然比 RGB 小 3 倍。作为一个巨大的好处,您还可以获得更清晰的纹理,因此这可能看起来比分辨率较低的 RGB 纹理要好得多。我们在 Awesomenauts 中对所有角色都使用了这个技巧:它们的存储空间比 1920x1080 屏幕所需的高一点,以减少伪影。

到目前为止我解释的格式是 DXT1,而 DXT5 是您最想使用的格式。颜色在 DXT1 和 DXT5 中的存储方式完全相同。不同的是,DXT1 只有 1 位 alpha,而 DXT5 还可以存储部分透明的像素。DXT5 以与颜色相同的方式存储 alpha,因此每个块存储两个 alpha 值。它为每个像素存储 alpha 的插值。因此,DXT5 总共为每个块存储了两种颜色和两个 alpha 值,并且对于每个像素,一个用于颜色的插值值和一个用于 alpha 的插值值。这使得 DXT5 正好是 DXT1 的两倍,并产生高质量的 alpha/透明度。

还有 DXT3,但在实践中我到目前为止从未发现它有用。DXT3 不存储两个 alpha 值进行插值:相反,它只使用每个像素 4 位来直接存储每个像素的 alpha。由于它只有 4 位,这意味着 DXT3 的最小 alpha 步长是 16。换句话说:DXT3 在处理细微的 alpha 渐变方面确实很糟糕,但在处理强烈的 alpha 对比度(如对象轮廓)方面非常擅长。由于 DXT5 在制作强烈的 alpha 对比方面已经足够出色,因此我迄今为止从未在实际游戏中使用过 DXT3


DXT1 也可以存储 alpha,但只有 1 位 alpha,所以只能开/关。为此使用了一个聪明而简单的技巧。请记住,每个 4x4 块存储两种颜色。如果第一种颜色比第二种颜色亮,那么一个块可以存储四种不同的颜色:两种主要颜色和两种插值颜色。这就是我上面解释的方式。但是,如果第一种颜色比第二种颜色深,则该块只能存储三种不同的颜色。第四种颜色用于完全透明的像素。这会导致纹理边缘周围的颜色质量稍差。不幸的是,它只有 1 位 alpha,因此对象边缘上的任何抗锯齿都会丢失


我还没有提到 DXT 压缩会发生另一种类型的质量损失。颜色以 16 位而不是完整的 24 位存储。这意味着除了已经提到的压缩伪影之外,我们还获得了更少的颜色深度。对于大多数纹理来说,这不是问题,但对于细微的渐变却是。出于这个原因,在 Awesomenauts 和 Swords & Soldiers II 中,我们不使用 DXT 存储纯渐变。我们改用简单的 24 位 TGA。这要大得多,但渐变通常非常薄,因此存储一堆压缩较少的 256x1 纹理是没有问题的

由于 DXT 被如此多的游戏所使用,因此有很多工具和插件可以使用它。例如,Nvidia 发布了一个免费的Photoshop 插件用于处理 DDS 文件。将其用于 2D 游戏时,请务必关闭 mipmap 以节省更多纹理空间(当然,除非您确实需要这些 mipmap)。图像浏览工具XnView立即支持 DXT,我听说甚至还有一个 Windows 插件可以直接在 Windows 资源管理器中查看 DXT 文件的缩略图。
DXT 会导致严重的压缩伪影,但它提供了如此强大的压缩能力,以至于它是迄今为止绝大多数游戏的最佳选择。
作者专栏:

https://joostdevblog.blogspot.com/2015/11/texture-formats-for-2d-games-part-3-dxt.html


理解二


DXT1
我们将看到的第一个压缩是 DXT1。这是最简单的压缩方式,也是其他类型的基础。但是,让我们从关于压缩本身的说明开始。您可能已经注意到 DXT压缩纹理始终具有相同的大小。这是因为它们具有固定的压缩比。因为生成的大小是固定的,这也意味着压缩的质量损失取决于您使用的原始纹理。

存储纹理的 RGBA 信息时,每个像素需要 32 位来存储信息。对于 DXT 压缩,纹理被分成 4x4 像素的片段,然后被压缩。这 16 个像素在没有压缩的情况下需要 512 位来存储。

为这 16 个像素确定压缩 4 色调色板时。之后每个像素都会在这个调色板中获得一个索引,每个像素只需要 2 位。对于调色板,仅存储两种颜色,即两个极端,而其他两种颜色在这些极端之间进行插值。颜色信息也以压缩方式存储,因此每种颜色仅使用 16 位。这意味着纹理的这 16 个像素只需要 64 位来存储(32 位用于调色板,32 位用于索引)。即压缩比为 1:8。

但是让我们退后一步,这对原始纹理的颜色信息意味着什么?首先我们来看看调色板。它使用 16 位来存储颜色,而不是普通的每种颜色 8 位。它为此使用了 565 压缩,这意味着红色和蓝色以 5 位存储,绿色以 6 位存储。因此,这意味着您可以在纹理中使用较少的颜色,并且如果您使用非常相似的相同颜色的阴影,这些将在压缩中丢失。

除此之外,调色板只存储两种颜色,我们称它们为 colour1 和 colour2。可以索引的其他两种颜色是线性插值的。所以这意味着 colour3 是 colour1 的 2/3 加上 colour2 的 1/3,而对于 colour4 则相反(如果 colour1 加上 colour2 的 2/3,则为 1/3)。这意味着,如果 16 个像素中使用的 4 种最常用的颜色不在颜色空间中的一条直线上,您将失去一些颜色。

下面是一些图像,以阐明压缩对纹理质量的影响。为了更清楚,图像中 4x4 像素的区域被放大到更大的尺寸。
此图像显示了压缩如何影响颜色。在左侧,您可以看到 16 种红色,范围从纯红色到纯黑色。在右侧,您可以看到 DXT 压缩选择代表这 16 个像素的四种结果颜色

此图像显示了当不同颜色不在颜色空间中的线性线上时会发生什么。在这种情况下,所有极端(红色、绿色和蓝色)都已使用。很明显,生成的插值颜色与原始颜色完全不匹配。通常 4x4 像素的区域不会有如此广泛的颜色,但它说明具有许多不同颜色的纹理受到的影响更大。
带 alpha 的 DXT1
当您的纹理没有任何透明度时,上述情况成立,如果您想添加 1 位 Alpha 通道,情况会略有变化。1 位 Alpha 通道意味着透明度打开或关闭。存储这一种颜色的调色板将获得完全透明的含义。
剩下的其他三种颜色用于存储像素的颜色信息。因此,对于在这种情况下存储的两种颜色,只需对一种颜色进行插值,color3 是 1/2 colour1 加上 1/2 colour2。这意味着为不同的颜色留下的分辨率更少。

DXT3
DXT3 中的颜色信息保存方式与没有 Alpha 通道的 DXT1 格式类似。因此,使用 4 种颜色的调色板来表示纹理的 16 个像素。但 alpha 信息以 DXT3 格式以 4 位存储。这意味着总共 128 位用于 16 个像素(32 用于调色板,32 用于颜色索引,64 用于alpha 信息)。因此,这导致压缩比为 1:4
因为 alpha 信息以 4 位存储,所以可以存储的 alpha 值的最小步长是16。这意味着 alpha 通道中非常平滑的过渡不能以 DXT3 格式存储

DXT5
DXT5 格式与 DXT3 格式的不同之处在于 Alpha 信息的保存方式。颜色信息以相同的方式存储。
对于 alpha 信息,它使用调色板,类似于颜色信息的存储方式。此调色板包含最小和最大 alpha 值。然后在这个最小值和最大值之间插入 6 个其他 alpha 值。因此,这允许更逐渐地改变 alpha 值。
第二个变体在最小值和最大值之间只插入了 4 个其他 alpha 值,但也添加了 0 和 1 的 alpha 值(对于完全透明和不透明)。对于某些纹理,这可能会产生更好的结果


压缩率:DXT1,DXT4,DXT5为4:1,DXT2、DXT3为2:1

02-什么是纹理压缩?
纹理压缩是更大的纹理优化领域的主要部分,减少需要在任何时候加载的纹理数据量以提高性能的做法,并减少游戏中的纹理数据总量以保持构建尺寸和加载时间下降。

本质上,纹理压缩的目标是通过剔除任何可以被视为消耗性或不太重要的数据来减少存储在纹理中的数据量。

与从 Photoshop 等图像编辑程序导出时可能得到的图像压缩不同,游戏引擎中的纹理压缩格式专为实时应用而设计。作为一般规则,这意味着压缩是快速且适应性强的,但不是无损的。

与往常一样,任何类型的数据压缩都将归结为视觉质量和文件大小之间的权衡。在游戏引擎中,这转化为图形保真度和性能之间的权衡。

演示纹理我将使用一些简单的纹理来说明我们将要探索的不同设置。我希望他们能够告诉您期望的视觉保真度。请记住,您在此处看到的任何内容都会有额外的不可避免的 jpg 压缩层,因此不会是 1:1

关于颜色深度的说明图像的颜色深度描述了用于存储每个像素的颜色数据的内存量。如果图像具有 8 位颜色深度,这意味着每个像素的颜色值存储在 8 位数据中。此信息通常(但不总是)分布在多个颜色通道中,这些通道在组合时会产生最终颜色。在我们的 8 位图像的情况下,分布将是红色通道中的 3 位、绿色通道中的 3 位和蓝色通道中的 2 位。

颜色/位深度定义纹理的颜色范围以及它在内存中的整体大小。下表包含我们将在本指南的其余部分中引用的一些更常见的颜色深度格式
深度
分配
颜色
8 位 (RGB)R3 G3 B2256
16 位 (RGBA)R3 G3 B2 A8256 + Alpha
16 位 (RGB)R5 G6 B565,536
24 位 (RGBA)R5 G6 B5 A865,536 + Alpha
24 位 (RGB)R8 G8 B816,777,216
32 位 (RGB)R8 G8 B8 A816,777,216 + Alpha

压缩设置
压缩设置下拉菜单允许您从一系列预设的纹理压缩配置文件中进行选择。这是您最重要的决定,因为这些配置文件决定了引擎将用于减小文件大小(如果有)的算法类型。每个配置文件都有自己的优点和缺点,但它们通常以 Epic 期望使用它的最常见用例命名,因此找到适合您的用例并不难

也就是说,在每个压缩配置文件的名称中发现的最重要的信息不是用例,而是后面括号中列出的首字母缩略词和值。这些字母和数字告诉您每个配置文件使用的特定压缩格式,并暗示幕后发生的事情。

注:值得指出的是,这些压缩配置文件的名称并不总是表明它们应该始终用于什么。最好将它们视为措辞强硬的建议,并使用最适合您项目特定要求的任何格式配置文件
让我们浏览一下列表

默认(DX11 上的 DXT1/5、BC1/3)
最有效的压缩配置文件。用于反照率/漫反射纹理



默认是使用非线性(或伽马校正)颜色信息的纹理最常见的压缩配置文件,如反照率/漫反射纹理贴图。它将使用两种S3 纹理压缩 (S3RC)压缩方法之一,具体取决于源纹理中是否存在 Alpha 通道

如果您的纹理没有 Alpha 通道,引擎将使用名为DXT1的格式。这是 Unreal 必须提供的最高性能的压缩格式,它会将纹理的大小减少六倍。如果确实存在Alpha 通道,它将使用称为DXT5的不同格式,这会将纹理的大小减小四倍

使用此配置文件时,添加一个 Alpha 通道将占用与其他三个通道合并的相同数量的磁盘空间。在您决定将一个附加到您的漫反射贴图之前,需要考虑一些事情。
旁注:DXT 压缩倾向于创建方形伪像,因为它减少纹理数据大小的方式涉及将图像划分为 4×4 像素正方形并近似其值的过程。对于具有大量噪声的反照率纹理贴图,这通常不是问题,但可能不适用于平滑渐变或像素艺术之类的东西。
如果您使用的是 DirectX 11 及更高版本,则引擎将在幕后使用称为BC1或BC3的 S3TC 格式,具体取决于 Alpha 通道的存在。BC(代表 Block Compression)1 和 3 分别只是DXT1和DXT5的较新名称。据我了解,实施实际上是相同的。

法线贴图(DX11 上的 DXT5、BC5)
非常适合法线贴图(可能还有流图),仅此而已。



在可能的情况下,此配置文件将使用BC5,这是一种 S3TC 格式,已针对法线贴图进行了优化。如果它不能使用BC5,它将回退到使用DXT5如上所述。
BC5压缩创建一个压缩的双通道 16 位纹理,方法是丢弃源的蓝色通道(它将以编程方式重新填充),将纹理的绿色信息移动到 Alpha 通道的 8 位中,并使用剩余的 8 位存储这红色。这使它成为法线贴图非常有效的压缩格式

请记住,BC5会丢弃原始纹理的蓝色和 Alpha 通道,因此如果您想保留这些通道,则需要使用不同的配置文件(如果这样做,请记住您可能需要在材质编辑器中使用此解决方法让您的法线贴图正常运行)
01.在纹理属性中将压缩设置从 TC_NormalMap 更改为 TC_Default
02.在材质中,将法线从 [0...1] 转换为 [-1...1] 范围


蒙版(无 sRGB)
与默认配置文件相同,但有一个重要例外



Masks配置文件与Default相同,如果没有 Alpha 通道,它将使用DXT1格式,如果有则使用DTX5。两者唯一的区别是Masks不支持sRGB,所以所有的纹理数据都会呈现在线性空间中

详细了解 sRGB 是什么以及它是如何工作的可能超出了本指南的范围,但为了快速总结它与我们的相关性:sRGB 是一种伽马校正形式,它将尝试确保您的纹理颜色在任何显示器上正确显示,与特定硬件无关。对于用于存储数学数据的纹理(如法线贴图或基于物理的渲染蒙版),这不是您想要启用的
旁注:在支持它的压缩配置文件中,可以通过属性编辑器中纹理子标题下的复选框启用/禁用 sRGB。Masks配置文件在功能上与Default配置文件相同,但手动取消选中 sRGB 设置

灰度(R8、RGB8 sRGB)
一种多用途未压缩单通道格式



此配置文件使用称为G8的单通道 8 位格式。有点令人困惑的是,在它的配置文件名称中,它被标记为R8,因为它丢弃了纹理的绿色、蓝色和 Alpha 通道,以提供未压缩的 8 位版本的红色
灰度也支持 sRGB,但如果启用,配置文件将切换到名为B8G8R8A8的未压缩格式,将您的图像转换为具有四个相同通道的 32 位 RGBA。正如您所料,这将大大增加您的纹理大小。我想不出你为什么要这样做的原因

置换贴图(8/16bit)
用于置换的未压缩8 位灰度。



与Grayscale一样,Displacementmap配置文件也使用G8压缩(或启用 sRGB 的B8G8R8A8)来创建未压缩的单通道纹理贴图。但是,此配置文件将改为使用 Alpha 通道中的信息并丢弃其余信息
顾名思义,它专为置换/高度贴图而设计
旁注:我不确定为什么此配置文件的名称中有 8/16 位。它可能是/旨在支持单通道 16 位图像。但是,无论您输入什么,它似乎都会输出一个 8 位图像,所以这纯粹是我的猜测。如果您对这个谜团有任何想法,请与我们联系!

矢量置换贴图 (RGBA8)
一种未压缩的 32 位 RGBA 格式,专为顶点动画和其他 3D 置换目的而设计



VectorDisplacementmap配置文件(其他人是否对这些配置文件名称中不一致的大小写感到有点不舒服?)使用B8G8R8A8格式提供具有四个 8 位通道的大型未压缩图像
请记住,当使用B8G8R8A8格式时,Alpha 通道是强制性的(它将覆盖Compress Without Alpha设置),因此如果您使用纹理仅存储 XYZ 位置数据,请记住在任何情况下都利用第四个通道你可以的能力


HDR(RGB,无 sRGB)
128 位 HDR 图像。推荐用于基于图像的照明和天空盒



HDR配置文件使用称为FloatRGBA的压缩格式,该格式支持更大的颜色深度,每个通道具有 32 位颜色信息
HDR颜色值存储为浮点数(可以有小数位的较大数字),而不仅仅是像B8G8R8A8这样的格式的整数/整数。这极大地增加了图像的动态范围
HDR不支持SRGB,尽管它在其名称中所说的话,它还是会添加一个Alpha频道,无论您是否愿意,因此最好使用它
旁注:快速提醒一下,我在此页面上用于说明这些设置的图像是 24 位 jpg,每个通道只有 8 位信息,因此您将无法看到增加的值范围这些例子

用户界面 2D (RGBA)
与HDR相同,但支持 sRGB。此配置文件将以尽可能高的保真度呈现您的图像



该配置文件旨在与界面元素一起使用,将使用B8G8R8A8(最多 32 位图像)或FloatRGBA(最多 128 位图像)来提供最佳结果。与往常一样,未压缩的纹理会占用大量空间。
Userinterface2D支持 sRGB

Alpha(DX11 上无 sRGB、BC4)
DirectX 11 及更高版本的通用 16 位灰度格式。



此配置文件适用于 alpha 蒙版,但它也是一种非常有用的多用途灰度格式。它将从源纹理的红色通道中的任何内容创建压缩的 16 位灰度图像。
Alpha使用称为BC4的 S3 纹理压缩格式。与其他 S3 压缩格式一样,Alpha通过将图像分成 4×4 像素块来删除数据,这在某些情况下会导致网格状伪影
不支持 sRGB

DistanceFieldFont (R8)
这是另一种未压缩的灰度格式,这一次用于距离场字体



对于所有意图和目的,DistanceFieldFont配置文件与Displacementmap 相同。这是一个使用G8压缩的 8 位灰度图像,它会丢弃除源纹理的 Alpha 通道之外的所有内容
它可能在幕后做其他事情,但到目前为止,我还没有找到一点不同之处

HDR 压缩(RGB、BC6H、DX11)
HDR 图像的压缩格式。仅支持 DirectX 11 及更高版本。



此配置文件使用称为BC6H的更新压缩格式,它支持高动态范围颜色的三个 16 位通道。它通过使用“半”浮点数(具有 32 位数据的全浮点数)来实现这一点。HDRCompressed配置文件有一半的空间来存储数据,一半的可能颜色范围。这仍然代表了数十亿种颜色——远远超过人眼所能看到的。
与未压缩的HDR配置文件一样,HDRCompressed不支持 sRGB。

BC7(DX11,可选A)
适用于 Direct X 11 及更高版本的更新、保真度更高的压缩格式



BC7与 Direct X 11 一起发布,是一种更高级的 S3 压缩格式,它使用一系列方法对 4 通道纹理数据进行编码。与DXT1/5等旧格式相比,它将提供更高质量的压缩和更少的伪影,并支持 sRGB
BC7格式包含一个 Alpha 通道,这意味着如果您的源纹理中缺少一个,系统将创建一个。将覆盖无 Alpha 压缩设置

半浮子 (R16F)
未压缩的 16 位灰度图像。



这种单通道格式会将红色通道中的任何内容编码为 16 位半浮点值并丢弃其余部分。与 16 位纹理一样,与G8等格式相比,这使得颜色值范围更大。
Half Float将强制您使用 Alpha 通道,覆盖Compress Without Alpha


默认 (DXT5)
未压缩的 32 位 RGBA 纹理(尽管它在标题中表示)
令人困惑的是,它也被命名为Default,该配置文件使用我们的标准 B8G8R8A8 格式来处理未压缩的 4 通道图像。我真的不确定这个的意图是什么。
官方文档中也缺少这种格式。

快速参考指南
当我们谈论纹理压缩时,我们必然会抛出很多首字母缩写词。它可以变得非常压倒性。我希望这个快速参考指南可以作为一个备忘单,帮助您比较不同的格式,以找到最适合您的项目的格式。

压缩格式
格式
通道
每像素位数
sRgb支持
压缩率
DXT1|BC1RGB4是的6:1
DXT5|BC3RGBA8是的4:1
BC4R42:1
BC5RG82:1
BC6HRGB84:1**
BC7RGB/A8*是的4:1**
** BC7有八种不同的模式,具有不同的颜色深度和位分布。打开包装有点困难。您可以在Microsoft 的网站上阅读更多内容

** 我一直在努力寻找有关BC6H和BC7格式压缩比的信息,因为它们的编码算法并不那么简单。到目前为止,我能找到的最佳答案是“它很复杂”

未压缩格式
格式
通道颜色深度srgb支持
G8R8
B8G8R8A8RGBA32

R16FR16

FloatRGBARGBA128

不同的压缩格式有自己的通道使用时要注意。假设你有一张拥有RGBA通道信息的纹理,为了使用非压缩格式提高它的表现质量,而选择使用 Compression Settings:Grayscale(R8,RGB8 sRGB),由于Grayscale使用G8格式压缩,那么你很可能会丢失除R通道以外的其它通道纹理信息
作者文章地址
https://www.techarthub.com/your-guide-to-texture-compression-in-unreal-engine/
s3纹理压缩
https://en.wikipedia.org/wiki/S3_Texture_Compression

好!本期分享就到这里,我们下期见!下期分享 UE5顶点着色


本帖被以下画板推荐:

微信公众号:Game艺视界
使用道具 <
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表