在游戏资产中使用ASTC纹理压缩

翻译自 https://developer.nvidia.com/astc-texture-compression-for-game-assets

By David Chait, Tegra Developer Technology

Since the dawn of the GPU, developers have been trying to cram bigger and better textures into memory. Sometimes that is accomplished with more RAM but more often it is achieved with native support for compressed texture formats. The objective of texture compression is to reduce data size, while minimizing impact on visual quality.

引言

自GPU诞生以来,开发人员一直试图将更大更好的纹理塞进内存。使用更高RAM的设备肯定可以解决这个问题,但更通用的做法是让设备支持更好的压缩纹理格式。纹理压缩的目标是减少数据大小,同时尽量减少对视觉质量(Image Quality, IQ)的影响。

随着移动设备的大量涌现,纹理压缩的需求变得更加迫切。内存通常与CPU共享,因此是一种非常稀缺的资源。此外,移动设备的网络传输速度也相对更慢,设备中的存储空间很小,因此减小需要传输的文件大小也很关键。

与移动设备的存储空间同样重要的是耗电量。对于纹理,有许多时机都可以进行优化从而节省电能消耗,例如: 从存储读取纹理,任何解包/解压缩或转码步骤,将数据写入内存,在渲染期间读取该数据。

本指南旨在为开发人员提供以下内容:

  • 介绍在最新芯片上可用的现代纹理格式(特别是ASTC)。
  • 将这些新格式应用到现有资产的快速入门指南。
  • 一些纹理压缩工具的列表。
  • 建议开发者如何编写自己的内部“设计指南”。

本文的总体目标是帮助开发人员实现图像质量和纹理大小之间的理想平衡。此外,最后还详细介绍了一些实际的压缩测试结果。

转换资产到ASTC的快速指南

对于那些想要“直接上手”的开发者来说,在使用最新的GPU硬件时,可以考虑本章的通用指导。本章描述一种可以立即将ASTC用于您的资产基础的方法。
请添加图片描述ASTC 块压缩示例
ASTC 块压缩示例

拿出你项目中的纹理,根据你的需求将它们分成3个目录:

  • 需要高图像质量和低(但还不错)压缩比例的贴图(“Higher IQ”);
  • 需要较为平衡的中等图像质量的中等压缩比例的贴图,允许一些小的瑕疵(“Medium IQ”);
  • 需要更高的压缩比例与更低的图像质量的贴图,会有模糊/斑点并丢失精细细节(“Lower IQ”)。

注意: 尽管许多工具使用术语“最佳压缩(best compression)”,但我们避免使用它,因为它很容易被滥用。最好的压缩可能意味着最高的压缩级别和最低的比特率,但这也以为这会有更多的瑕疵。也就是说,您需要自己判断纹理贴图是否可以“容忍”更高的压缩比例,或者说纹理的大小比它的质量更加重要,在这些情况下,才去尝试提高压缩比例

本章只是一个“快速入门指南”。你必须评估你的特殊需求、愿望和内容。您可以以此为起点从中决定进一步增加或减少压缩级别,以达到所需的大小和质量平衡。

最后注意: ASTC压缩需要消耗较多的时间才能获得最佳效果。DXT工具的运行速度可能快2-10倍。但ASTC的优势是,在工业生产中,ASTC工具比其最类似的工具ETC2快4-20倍。同时,ASTC还可以在更快的模式下运行,在短时间内生成较低质量的结果,您可用启用这个模式进行测试。

基于不同内容的尝试

对于下列每种类型的纹理,我们比较了ASTC和DXT的压缩效果,“Higher IQ”质量的纹理应该小于或等于DXT的文件大小,但图像质量明显更好。如果你以前避免在特定的资产上使用DXT,你现在可以尝试ASTC格式,而不是保留未压缩的资产。

以下是基于ARM“astcence .exe”命令行工具在“thorough”模式下以ASTC的压缩格式推荐。

你可以follow下面的压缩格式来压缩不同类型的纹理(例如,对需要Higher IQ质量的ARGB图片采用ASTC 4x4 模式压缩)。

RGB (24bit, diffuse maps)

在这里插入图片描述

ARGB (32bit, diffuse with alpha)

在这里插入图片描述

Normal Map (16bit, possibly also RG/LA maps)

在这里插入图片描述

Single Channel (8bit, possibly detail/light/AO map)

在这里插入图片描述

压缩纹理格式

S3TC/DXTn/BCn

在现代桌面(desktop)应用计算时代,纹理压缩通常只有一个答案: DXT。由于它的起源,它也被称为S3TC,或者某些DirectX实现也称为BCn。它是一种固定4x4块的压缩格式,使用4bpp对每个RGB块进行编码。为了存储alpha信息,可以使用1位alpha(使用1bpp的编码空间),或者使用4bpp的alpha块进行alpha编码。这种方法后来有了一些变体,例如将LA或RG数据存储在两个单独的4bpp块中,以获得更好的质量。

在移动领域,NVIDIA是少数能够将桌面内容轻松移植到设备上的供应商之一,NVIDIA在Tegra处理器中支持DXT。而其他移动芯片供应商则是开发了其他压缩格式。

PVRTC/PVRTC2

Imagination开发了PowerVR GPU,并创建了专有的PVRTC纹理压缩格式。它是iOS设备上的纹理压缩格式并广为人所认知。它提供4bpp和2bpp选项。最近Imagination发布了PVRTC2格式,在相同的空间内提供了更好的压缩质量。

ETC/ETC2

为了避免无数特定于供应商的编解码器,Khronos定义了与供应商无关的编解码器。随着OpenGL ES 2.0的引入,ETC压缩格式成为一种多厂商都可用的扩展格式,它提供类似dxt的更好质量水平的压缩。然而,有一些问题阻碍了它的广泛使用: 1.它不是ES 2.0的必需部分;2.没有alpha支持;3.它只有一种模式,4bpp RGB。

随着2013年OpenGL ES 3.0的发布(以及完整的OpenGL 4.3), ETC2格式成为一种标准,具有向后兼容性和重要的新特性。首先,它添加了完整的alpha支持,如DXT3/5 (8bpp),以及1位“穿孔(punch-through)”alpha (4bpp)。其次,它带来了EAC格式,它支持1通道和2通道数据(R和RG,分别为4和8bpp)。第三,它增加了sRGB数据支持。最后,它声称在相同比特率下提供比竞争对手更好的质量。 ETC2 的最大问题是其压缩工具极慢。

ASTC

在Khronos定义OpenGL ES 3.0的同时,其他厂家也在努力开发一种业界领先的压缩格式,为开发人员提供更细粒度的控制。这最终致使了2012年年中ASTC纹理压缩格式的发布。ASTC的关键是,虽然它使用固定的128位每块,但每个纹理可以有不同大小的块适应这128位,不像以前格式的固定4x4块。利用各种各样的方形和非方形块大小,ASTC提供了广泛的衍生压缩比,从8bpp缩放到略低于1bpp,如下所示:
在这里插入图片描述
因此,ASTC 在调整质量与尺寸方面具有巨大优势。其他的格式通常为RGB或单通道数据提供4bpp,有些格式在第二个 4bpp 部分中提供更高质量的 Alpha 或第二个单通道数据块。 PVRTC 则是提供了一个更小的变体,具有 2bpp 模式。但都没有ASTC通用

此外,ASTC还支持1-4通道,包括全alpha RGBA, normal RGB, 2通道RG (LA)和1通道R (L/A)支持,以及自定义X+Y和XY+Z法线贴图支持。结果就是ASTC有能力处理大多数类型的纹理。

ASTC的另一个关键优势是编码端点、权重等是按块选择的,而不是全局选择的,因此编码器可以动态地分配128位,以更好地表示每个块中的内容。这提供了比以前的格式更好的图像质量,即使在更高的压缩。

支持ASTC的硬件已经获得了足够的市场份额,开发者应该认真考虑如何在他们的游戏中利用它提高纹理质量,减少存储大小,或者两者兼而有之。尤其对于那些需要高水平图形硬件(原生支持ASTC的硬件)的游戏。

压缩资产的方法

对于你产品中的资产,你需要做一个整体以及每个资产的规划(决定纹理的品质或文件大小哪个比较重要),很可能你希望两者皆有,那就需要一个折中的方案。在开始查看单个纹理之前,你应该为你的项目至少有一个较高的设计目标。

找到最好的压缩格式

对于一个现有的大型项目而言,市面上有这么多的纹理压缩标准和工具,如何找到每个纹理的最佳匹配似乎有点令人生畏。你可以遵循以下几点:

  1. 从你愿意并且能够使用的格式和工具开始。
  2. 看看跨平台共享的潜力,而不是每个平台需要不同资产。
  3. 批量压缩一小组测试资产(可能是一打或两打文件),使用不同的格式进行压缩,并寻找质量开始低于产品所需标准的地方。试着为每一类资产找到一个“基线”,这样你就可以对整个项目进行“快速检查”。
  4. 在一晚上(或几天内)对所有资产进行高质量的压缩。之后便可以仅在资产发生变化时再进行渐进式的高质量再压缩(也许每天只做一次,否则使用“快速”模式,除非你需要在引擎中使用高质量的资产)。

不要忘记屏幕尺寸

从历史上看,开发者要么瞄准更大的桌面屏幕,要么瞄准更小的移动屏幕。今天,你必须仔细考虑你的市场。虽然许多手机的分辨率越来越高,但极高分辨率的纹理对视觉的影响可能很小。然而,如果考虑上HDMI,你可能需要在50英寸1080P电视上运行你的游戏,这会使像素变的非常大。

移植到移动设备的开发者可能会立即考虑降低纹理分辨率作为节省空间的方法。但在缩小纹理分辨率之前,请考虑一下现代设备的屏幕。然后考虑是否可用在更大的纹理上使用更高的压缩(这会使得瑕疵更少)。为了达到平衡,您可能会要求更低的比特率,并更灵活地选择您愿意接受的工件。

进一步减小文件大小

现代项目内容的文件大小很可能会超过1gb,因此考虑文件的大小也至关重要。文件在网络传输中的大小,在硬盘中的大小,在RAM中的大小都是我们需要考虑的问题,我们应该如何处理这些问题呢?

转码

业界使用的另一种替代方法是使用JPEG之类的格式压缩资产,针对特定的文件大小进行调整,并尽量不牺牲太多质量。资产以这种形式通过网络发送,并在首次运行或按需运行时转换为设备的最佳GPU格式。这在桌面平台上是一种合理的方法,但在移动设备上,转码在耗时和耗电上的成本可能很高,令人无法接受。此外,还有JPEG由速度调整的“快速编码器”可能引起额外的质量问题。

随着ASTC的出现,开发者现在拥有更大范围的压缩比特率,在考虑使用二级编码工具和加载/转码过程增加额外的复杂性之前,应该评估是否可以使用ASTC来降低比特率。

打包

第二种方法是尝试对编解码后的内容进行打包。一些报告指出,使用ZIP或LZW压缩作为第二次压缩,可以比jpeg的压缩更好。虽然客户端仍然需要解压缩,但解压的速度应该比任何转码过程快一个或两个数量级。

我们使用了一小部分示例ASTC纹理进行快速测试(与下一章使用的相同)并使用标准ZIP压缩压缩它们。结果非常好:超过20MB的纹理数据被压缩成9MB的zip文件

假设您选择的纹理压缩非常完美的匹配你的内存限制,那么你可以使用先压缩成GPU友好的纹理格式(比如ASTC),再打包成zip格式,使得减少在传输带宽上的消耗。

压缩测试示例

为了更好地讨论不同编解码器对纹理内容的影响,我们针对一小组纹理执行了批量压缩,并为每个纹理分配了视觉图像质量(Image Quality, IQ)评级。然后,我们考虑哪种压缩格式似乎对质量最好,给出质量和压缩的平衡,或给出不会产生瑕疵的最高压缩方式。

在本节中,我们展示了采集数据的表格以及使用不同编解码器变体生成的纹理样本。展示纹理在高缩放下的同一区域,以提供直接的视觉比较。

表格提供了每个被测试的压缩方式在每个纹理上的处理细节和评估。数据包括: 每个编解码器的图像质量评级(IQ),一些关于评级的简要说明(与原始/原始图像进行比较),以及关于每个编解码器的信息。

在这里插入图片描述
在这里插入图片描述

——————————————
在这里插入图片描述
在这里插入图片描述
其余没有图像注释的结果如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

压缩工具

以下是互联网上可用的工具的简要选择,可以帮助开发人员处理纹理压缩。

NVIDIA Texture Tools (DXT / BCn Compressor)

地址:https://developer.nvidia.com/gpu-accelerated-texture-compression

作为压缩市场上最古老的工具之一,它在今天的许多项目中仍然被大量使用。代码是开源的,并且有许多格式的CUDA压缩路径。当然,它更侧重于DXTn/BCn格式压缩。

ARM GPU Texture Compression Tool (ASTC / ETC2 Compressor)

地址:http://malideveloper.arm.com/develop-for-mali/tools/asset-creation/mali-gpu-texture-compression-tool/

用于测试编解码器和对结果并行审查的交互式GUI,提供错误/差异视图。由于能够在所有三个视图中同时缩放和平移,因此可以非常轻松地查看单个压缩运行的结果。实际的编解码器是命令行可执行文件,因此可以在没有GUI的情况下用于批处理。它具有广泛的ASTC和ETC2格式支持。

Imagination PVRTexTool (PVRTC / ETC2 Compressor)

地址:http://community.imgtec.com/developers/powervr/tools/pvrtextool/

Imagination的纹理压缩包包括一个GUI,一个单独的命令行工具,一个可链接的库,以及主要DCC应用程序(Maya, Max, Photoshop)的插件。它主要关注PVRTC格式,但也支持ETC2。

Reference

https://developer.nvidia.com/astc-texture-compression-for-game-assets

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值