by STANCH
标签:#纹理压缩 #纹理贴图
1.纹理压缩概述
3D计算机图形学离不开各种类型的纹理。纹理贴图可以极大地提高3D物体的视觉质量和细节水平,而不增加几何复杂度。简单的纹理是二维图像,该图像的单个像素称为纹素(texel)。事实上,纹理不仅可以存储颜色,还可以存储高度、法线方向、高光因子等每个纹理元素的信息。
从上至下依次为漫反射贴图,法线贴图,位移贴图,来源:TEXTURE COMPRESSION TECHNIQUES
随着现代游戏和3D应用程序体量越来越大,消耗了大量内存(存放数据的场所),其中超过一半的内存被纹理占用,在渲染场景时,会有大量的贴图被传输到GPU,不经限制的话带宽(数据传输速度的体现)很快就会成为性能瓶颈,还会导致设备发热。因此,3D程序对内存大小和带宽有很高的要求,在图形渲染过程中纹理以压缩形式存储在内存中并传输到GPU,不仅减小了纹理的内存占用,最重要的是还节省了带宽,这是 一种非常高效的性能优化。此外,纹理压缩还可以减少功耗,因为GPU和VRAM(显存)的传输可以直接转换为功耗开销。
2.图片格式与纹理格式的区别
图片格式和纹理格式都是用来存储二维图像,但其设计目标、文件结构和支持特性都存在明显差异。图片压缩格式基于整张图片进行压缩,无法实现单个像素的解析,因此无法被GPU识别,需要CPU解压缩或非压缩格式才能够被识别,增加了CPU的时间和带宽。纹理压缩格式是基于块压缩,可以让CPU以设定的压缩格式(如DXTC、ETC等)进行压缩,能够更快读取像素所属字节块进行解压缩以支持随机访问
纹理压缩和图片压缩过程图,来源:【技术美术百人计划】图形 3.6 纹理压缩——包体瘦身术
(1)图片格式
- 图片格式是图片文件的存储格式,通常在磁盘、内存中储存和传输文件时使用
- 图片格式通常是独立的文件,如 .jpg、.png
- 图片格式通常只支持基本的颜色通道和透明度等属性
(2)纹理格式
- 纹理格式是专门为 3D 图形应用而设计,用于存储和传输贴附在 3D 模型表面的二维图像,是显卡能够直接进行采样的纹理数据格式
- 纹理格式有时会被打包进特定的容器文件中,如 .dds、.ktx 等,这种容器格式可以包含多张纹理贴图以及相关的元数据信息
- 纹理格式可以支持法线贴图、位移贴图、金属度贴图等更丰富的材质属性
3.什么是纹理压缩?
纹理压缩是为了减少纹理数据占用的存储空间和带宽,专为在计算机图形渲染系统中存储纹理而使用的图像压缩技术,广泛应用于计算机图形、游戏、虚拟现实等领域。
图片非压缩格式:
RGBA8888 (RGBA32):一个像素32位,包含A通道,即一个像素消耗4字节
RGBA4444 (RGBA16):一个像素16位,包含A通道,即一个像素消耗2字节
RGB888 (RGB24):一个像素24位,无A通道,即一个像素消耗3字节
RGB565 (RGB16):一个像素16位,无A通道,即一个像素消耗2字节
为了介绍每个像素所占大小,以RGBA32为例,一个像素记录的颜色信息RGBA通道各占8位,一共32位,8位=1字节,共占4个字节。
4.为什么要使用纹理压缩?
尽管像jpg、png的压缩率很高,但并不适合纹理,主要问题是不支持像素的随机访问,这对GPU相当不友好,GPU渲染时只使用需要的纹理部分,纹理访问模式是高度随机的:在渲染过程中,只有部分纹理区域会被使用,而且访问顺序也是事先无法知道的。此外,相邻三角形并不意味着它们对应的纹理区域也是相邻的(下图 )。因此,图形子系统的整体性能在很大程度上依赖于纹理访问的效率。这种随机访问能力决定了各种纹理压缩格式的主要特性。
为了解决这些独特的纹理访问需求,专门的纹理压缩格式被设计出来,它们采用了与标准图像压缩算法不同的压缩方法。这些纹理压缩格式,如 DXT、ETC 和 ASTC,能够支持高效的单个纹理元素的随机访问,同时仍能提供良好的压缩比。
5.常见纹理压缩格式
(1)S3TC/DXTn/BCn
在现代桌面计算时代,纹理压缩的传统答案只有一个:DXT。由于它的起源,它也被称为 S3TC,对于某些 DirectX 实现,它被称为 BCn。最基本的是,它是一种固定的 4x4 块格式,使用 4bpp(每像素所占存储空间的位数) 对每个 RGB 块进行编码。为了存储 alpha 信息,要么有 1 位 alpha(使用 1bpp 的编码空间),要么有第二个 4bpp alpha 专用块,用于高质量 alpha 编码。这种方法后来出现了一些变体,将 LA 或 RG 数据存储在两个单独的 4bpp 块中,以获得更好的质量。
(2)ETC/ETC2
为了避免使用大量特定于供应商的编解码器,Khronos 定义了与供应商无关的编解码器。随着 OpenGL ES 2.0 的推出,ETC 压缩格式成为可用的多供应商扩展,以更好的质量水平提供类似 DXT 的压缩。然而,它存在的一些问题阻碍了它的广泛采用:它不是ES 2.0 的必需部分,不支持 alpha,并且只有一种模式,即 4bpp RGB。
随着 2013 年 OpenGL ES 3.0(以及完整的 OpenGL 4.3)的发布,ETC2 格式成为标准,具有向后兼容性和重要的新功能。首先,它添加了完整的 alpha 支持,如 DXT3/5(8bpp),以及 1 位“穿透”alpha(4bpp)。其次,它带来了 EAC 格式,支持 1 通道和 2 通道数据(R 和 RG,分别以 4 和 8bpp 为单位)。第三,它添加了 sRGB 数据支持。
(3)ASTC
在 Khronos 定义 OpenGL ES 3.0 的同时,业界也在努力开发一种业界领先的压缩格式,为开发人员提供更精细的控制。这促成了 ASTC 纹理压缩格式于 2012 年中期的推出。ASTC 的关键在于,虽然它使用固定的 128 位/块,但每个纹理可以在这 128 位中容纳不同大小的块,这与之前格式的固定 4x4 块不同。ASTC 利用各种方形和非方形块尺寸,提供各种派生压缩比,从 8bpp 降至略低于 1bpp,如下所示:
因此,ASTC 在调整质量与尺寸方面具有巨大优势。替代格式通常为 RGB 或单通道数据提供 4bpp,有些可以在该占用空间中容纳 alpha,有些在第二个 4bpp 部分中提供更高质量的 alpha 或第二个单通道数据块。PVRTC 是另一种提供较小变体的格式,采用 2bpp 模式。
此外,ASTC 还支持 1-4 个通道,包括全 alpha RGBA、普通 RGB、2 通道 RG (LA) 和 1 通道 R (L/A) 支持,以及自定义 X+Y 和 XY+Z 法线贴图支持。最终结果是 ASTC 可以处理大多数类型的纹理。
ASTC 的另一个主要优势是,端点、权重等的编码方法是逐块选择的,而不是全局选择的,因此编码器可以动态调整分配 128 位以更好地表示每个块中的内容。即使在更高的压缩率下,这也能提供比以前的格式更好的图像质量。
参考:
TEXTURE COMPRESSION TECHNIQUES
【技术美术百人计划】图形 3.6 纹理压缩——包体瘦身术
关注Mapmost,持续更新GIS、三维美术、计算机技术干货
Mapmost是一套以三维地图和时空计算为特色的数字孪生底座平台,包含了空间数据管理工具(Studio)、应用开发工具(SDK)、应用创作工具(Alpha)。平台能力已覆盖城市时空数据的集成、多源数据资源的发布管理,以及数字孪生应用开发工具链,满足企业开发者用户快速搭建数字孪生场景的切实需求,助力实现行业领先。
欢迎进入官网体验使用:Mapmost——让人与机器联合创作成为新常态