在构建时,把纹理源文件压缩为对应指定纹理压缩格式的过程就是纹理压缩。不同于我们通常理解上的图片压缩(png,jpg等),纹理压缩是服务于在3D 图像渲染系统的纹理图片存储技术,因此要充分满足随机访问的特性。
1、为什么要进行纹理的压缩
我们知道在游戏中对于3D物体表面细节的表现最重要的还是靠贴图来实现,那么越是高分辨率越是真彩色的贴图自然表现能力越强,但同时占用的内存也会上升,而节省内存这点目前不管是在游戏还是在其他领域都是非常重要的,所以各个平台都使用了纹理压缩技术来达到内存占用和显示效果的平衡。不仅如此,纹理占用内存大,自然也会导致传输时带宽开销变大,与此同时包体大小也会受到影响。而带宽和包体大小对于移动端游戏来讲都是非常稀缺的系统资源,每多用一分都要额外注意,当然内存也是如此。对于需要适配低端设备或者其他部分内存开销很大的游戏,尤其如此。
2、纹理的格式
常见的图片文件格式,比如PNG,JPG,BMP等,是图像为了存储信息而使用的对信息的特殊编码方式。它存储在磁盘中,或者内存中,但是并不能被GPU所识别。
这些文件格式当被读入后,还是需要经过CPU解压成bitmap,再传送到GPU端进行使用。
纹理格式是能被GPU所识别的像素格式,能被快速寻址并采样。压缩纹理,是一种GPU能直接读取并显示的格式,使得图像无需解压即可进行渲染,节约大量的内存。
简单纹理格式:
RGBA8888 每个像素4字节,RGBA通道各占用8位
RGBA4444 每个像素2字节,RGBA通道各占用4位
RGB888 每个像素3字节,RGB通道各占用8位,无透明通道
RGB565 每个像素2字节,RGB通道各占用5/6/5位,无透明通道
RGBA5551 每个像素2字节,RGB通道各占用5位,透明通道1位,所以要么完全透明要么不透明
3、纹理压缩评价标准
评价纹理压缩好坏有以下多种条件:
1)解码速度
2)是否可随机读取
3)压缩率和表现效果
4)编码速度
解码速度:即解析速度。解码是硬件获取数据的必要方式,更快的解码速度意味着更低的硬件消耗。
是否可随机读取:在渲染过程中,GPU依赖着强大的并行能力获取纹理的像素,如果压缩方法不支持随机读取(PNG、JPEG等),那么纹理需要在CPU端解压成RBGA格式,再上传到GPU,那就意味着成倍的内存和更大的带宽消耗。反之,如果压缩方法支持随机读取,则可以在低带宽消耗下完成图片上传和像素获取。
压缩率和表现效果:一般分为有损压缩和无损压缩(GIF、PNG等),有损压缩技术就是在使用更小的存储空间下提供较为优秀的画面表现。总之采用的压缩技术既要保证一个不错的压缩效果,也要把纹理的损失控制在一定范围内。
编码速度:即压缩速度。一般实时渲染的图像都是预先准备好的,所以即便编码速度比解码速度慢也是可以接受的。
基于以上评价标准,大多数纹理压缩算法会把固定大小的像素块的某种形式的固定速率有损矢量量化(lossy vector quantization )包含进固定大小的编码字节块中,有时还会配合一些额外的预处理和后处理步骤。块截断编码(Block Truncation Coding )是这种类型的算法的很常见的一个例子。
因为他们的数据访问模式是明确定义的,纹理解压缩过程是作为图像管线的一部分在运行时进行的,这样可以降低渲染系统对带宽和存储空间的需求。除了纹理贴图,纹理压缩可以应用于其他类型的渲染贴图,包括凹凸贴图和表面法线贴图。同时,纹理压缩可以和其他贴图处理流程共同使用,例如Mipmaps和各向异性过滤。
通俗来讲,纹理压缩不同于其他图片压缩方式(jpg,png),在使用中,不会在CPU中进行解压缩,而是直接把压缩内容传给GPU,而且在GPU中也不会一次把整张图片进行解压缩,只会在需要采样特定区域的纹理时对这一区域的纹理进行解压缩。
纹理压缩技术的优点:
1)解决了内存和显存(GPU的专用内存)中纹理占用空间大的问题,不需要在CPU中就解压缩,在GPU中也不需要对整个图片解压缩。
2)解决了带宽问题,从CPU传到GPU的图片是压缩格式,因此传输的数据量会小很多,大大减轻了带宽压力
3)使用方便,仅需要少量代码
纹理压缩的缺点:
1)因为使用的是有损压缩,3D表面细节会产生一定程度的损失,这属于典型的效果换性能的妥协。
2)硬件相关,要考虑兼容性
3)压缩纹理文件大小比常规PNG和JPG文件大
4)需要额外的制作工具,无法直接在移动端生成
4、目前常见的纹理压缩算法
常用纹理和纹理压缩格式_夜风的BLOG-CSDN博客_纹理压缩
https://blog.csdn.net/u010385624/article/details/91993733
参考:
常用纹理和纹理压缩格式_夜风的BLOG-CSDN博客_纹理压缩
https://blog.csdn.net/u013746357/article/details/89457616