纹理压缩

CCImage作为cocos2dx texture的核心处理函数包含了丰富的底层API调用和纹理格式操作,我想以CCImage来作为切入点发散性地去做扩展可能更加容易加深我们对cocos2dx引擎的理解,话不多说。

#define CC_GL_ATC_RGB_AMD                                          0x8C92
#define CC_GL_ATC_RGBA_EXPLICIT_ALPHA_AMD                          0x8C93
#define CC_GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD                      0x87EE

CCImage的开始是这个3个宏定义,这3个宏定义其实是对于ATITC格式纹理的类型:

  • ATC_RGB_AMD (RGB textures)
  • ATC_RGBA_EXPLICIT_ALPHA_AMD (RGB textures using explicit alpha encoding)
  • ATC_RGBA_INTERPOLATED_ALPHA_AMD (RGBA textures using interpolated alpha encoding)

谈到这里我就先介绍下纹理压缩,现在的游戏绝大多数情况下我们都是通过贴图来丰富游戏场景,而贴图本身占用内存空间并且是以不压缩的形式存放在显存当中的,常见的贴图格式分为16bits、24bits和32bits,即使是16bits的1024X1024贴图在显存中的大小也高达2MB,为了加快渲染速度和减少图像的锯齿,可以使用Mipmap把贴图处理成由一系列被预先计算和优化过的图片组成的文件,当然Mipmap是需要占用一定的内存空间的。

我们常见的图片文件格式有

  • BMP: Windows标准图像文件格式,位映射存储格式,图像深度可选(lbit、4bit、8bit及24bit),不采用其他任何压缩;
  • TGA: 数字化图像,以及运用光线跟踪算法所产生的高质量图像的常用格式,支持压缩,使用不失真的压缩算法,可以带通道图,另外还支持行程编码压缩。特点是可以做出不规则形状的图形、图像文件,兼顾了BMP的图象质量的同时又兼顾了JPEG的体积优势;
  • JPG: 24位颜色存储单个位图,与平台无关的格式,支持最高级别的有损压缩,可以很好地压缩类似的色调,但不能很好地处理亮度的强烈差异或处理纯色区域,只支持YUV颜色模式的数据结构。
  • GIF: 基于LZW算法的连续色调的无损压缩格式,可变长度等压缩算法;
  • PNG: 位图文件(bitmap file)存储格式,8位、24位、32位三种形式。

要显示一张JPG格式的图片需要先解码加载(手持设备上还是比较耗电的),然后再解压缩成原始像素格式传递给显卡,在没有显卡硬件支持的前提下,使用压缩格式保存纹理是值得商榷的。正是因为现在游戏对贴图的依赖导致对显示总线造成巨大的压力,所以很多厂家都对硬件提供了实时解压缩的功能,不过可惜的是没有一个格式能够得到多个厂家的支持。OpenGL ES定义了一个标准的接口:

GL_API void           GL_APIENTRY glCompressedTexImage2D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid* data);

不过纹理数据的格式还是没有统一的标准,导致一旦使用了压缩纹理就无法实现跨平台。

之前的纹理优化已经介绍了常见的纹理格式RGB565,RGBA4444,RGBA5551,RGB888,RGBA8888等。这里我们应该能很好地明白文件格式和纹理格式的区别了,文件格式是图像为了存储信息而使用的对信息的特殊编码方式,它存储在磁盘中,或者内存中,但是并不能被GPU所识别,因为以向量计算见长的GPU对于这些复杂的计算无能为力。这些文件格式当被游戏读入后,还是需要经过CPU解压成像素格式,再传送到GPU端进行使用。而纹理格式就是能被GPU所识别的像素格式,能被快速寻址并采样。举个例子,DDS文件是游戏开发中常用的文件格式,它内部可以包含RGBA4444的纹理格式,也可以包含RGBA8888的纹理格式,甚至可以包含DXT1的纹理格式。在这里DDS文件有点容器的意味。

这里我们可能会疑问我们为什么不能把类似图片压缩格式的方法应用在纹理贴图上,其实这是因为显示芯片在存取贴图时,是一种「随机存取」的动作。也就是说,显示芯片通常会需要以任意的顺序存取贴图里的数据。一般的压缩方式如JPEG,都利用了行程长度的编码方法,简单的说,它们必需以一定的顺序才能解开。因此,不能用这种方式来压缩贴图。

纹理的压缩方式分为2种:

  • 改变颜色空间:例如3dfx公司的YAB格式,利用YAB,每个像点只需要8bits,就可以达到接近16bits的效果。不过,无论如何,这样都使颜色的数目减少。因此,整个贴图的色彩变化就受到了限制。
  • 调色盘:就是类似OpenGL的索引,利用一个256种颜色的调色盘,就可以把贴图以 8 bits 的方式储存。不过,虽然它的色彩空间较大(可以是24bits或32bits),但是总颜色数目还是不能超过256种。所以,它的应用范围仍然有限。

现在常用的贴图压缩方式,则是利用以区块为基础的方式。通常的做法是,把贴图切割成许多小区块,再对各个区块进行压缩。例如,S3TC就是把贴图切成4×4的小区块。利用这种做法,就可以对区块进行某种处理(通常就是vector quantization或是其变形),显示芯片也可以区块为单位,进行随机的存取动作。因此,这是适合用在贴图的方式。

不过,区块的大小会影响到压缩的效果。一般来说,区块愈大,就能有愈高的压缩比。不过,愈大的区块也会使额外的负担增加。因为显示芯片只能以区块为单位来读取贴图数据,如果区块愈大,则每个区块中就可能会有愈多的数据是不需要的。所以,也不能任意把区块的大小加大。

基于已压缩纹理的渲染论文中,列举了纹理压缩四项的特点,使其不同于其他图像压缩技术。

  • 解压速度:由于最好能直接从已压缩的纹理直接渲染,为了尽可能地不影响性能,解压缩要尽可能快。
  • 随机访问:由于几乎不可能预测纹素被访问的顺序,任何纹理压缩算法必须允许对其中纹素的随机访问。所以几乎所有的纹理压缩算法都以块为单位压缩和存储纹素,当某一纹素被访问时,只有同一块中若干纹素被读取和解压缩。这项需求也排除了很多压缩率较高的图像压缩方式,例如JPEG和行程长度编码。
  • 压缩率和图像质量:由于人眼的不精确性,相比于其他应用领域,图像渲染更适宜使用有损数据压缩。
  • 编码速度:纹理压缩对压缩速度要求不高,因为绝大多数情况下,纹理只需要进行一次压缩。

由于其数据访问模式是事先知道的,纹理压缩常作为整个绘图管线的一部分,在绘制时对动态地已压缩数据进行解压缩。而反过来绘制管线也可以通过纹理压缩技术来降低对于

带宽和存储的需求。在纹理贴图中,已压缩纹理和没有经过压缩的纹理使用起来基本没有区别,都可以被用来存储颜色数据或其他数据,例如凹凸贴图或法线贴图,也都可以和Mipmapping或各向异性过滤等共同使用。

现在主流的移动CPU支持的纹理格式(ARM移动处理器其实是一种SoC片上系统,其内部整合了CPU单元和GPU单元甚至通讯单元。因此在讨论游戏兼容性时,CPU就等于GPU):

CPU GPU
德州仪器 Power VR系列
三星猎户座 Mail系列
高通 Adreno系列
NVIDIA Geforce系列
海思K3V2 Vivante GC
  • Imagination的PowerVR:PVRTC,ETC1

    • 代表机型:Apple iPhone、iPad,三星I9000、P3100
  • Qualcomm的Adreno系列:
    • Adreno 2xx系列:3Dc和ATITC(基于ATI)
    • Adreno 320:ETC,3Dc和ATITC(基于ATI),ETC2
    • 代表机型:HTC G10、G14,小米1、小米2
  • ARM的Mali系列:ETC
    • 300/400系列:
    • T600系列:ASTC
    • 代表机型:三星Galaxy SII、Galaxy SIII、Galaxy Note1、Galaxy Note2(亚版)
  • NVIDIA的Geforce系列:ETC,S3TC(DXT1、DXT3和DXT5)
    • Tegra 2:ATITC
    • Tegra K1:ASTC
    • 代表机型:Google Nexus 7,HTC One X
  • Vivante的GC系列:ETC,S3TC

现在主流的纹理压缩标准:

  • ETC1:OpenGL ES2.0基本的纹理压缩标准,大部分移动GPU都会支持的纹理标准,不支持Alpha通道,只能用于压缩不透明的材质,几乎所有的安卓设备都可以支持ETC压缩的GPU加速;
  • ETC2:OpenGL ES 3.0引入的纹理压缩格式,还在改进中,除了高通的Adreno 320之外还没有移动GPU支持,补全了ETC1不支持Alpha通道的缺陷,支持更高质量的RGBA(RGB+Alpha)压缩;
  • PVRTC:
  • S3TC:也被称为DXTn或者DXTC,就是常见的DDS压缩纹理,无论压缩速度还是压缩比都不错,也支持GPU加速,而且是桌面显卡通用的压缩格式;
  • EAC:主要用于1-2信道数据的情况;
  • ASTC:压缩速度和质量上比S3TC要好;

未完待续…

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-19 01:16:35

纹理压缩的相关文章

常用纹理和纹理压缩格式

转载至: http://blog.csdn.net/ynnmnm/article/details/44983545 by 夜风 简单纹理格式 RGBA8888 每个像素4字节,RGBA通道各占用8位 RGBA4444 每个像素2字节,RGBA通道各占用4位 RGB888 每个像素3字节,RGB通道各占用8位,无透明通道 RGB565 每个像素2字节,RGB通道各占用5/6/5位,无透明通道 RGBA5551 每个像素2字节,RGB通道各占用5位,透明通道1位,所以要么完全透明要么不透明 DXT纹

干货:Unity游戏开发图片纹理压缩方案

原文:http://www.jianshu.com/p/f7c3741f22af Unity3D引擎对纹理的处理是智能的:不论你放入的是PNG,PSD还是TGA,它们都会被自动转换成Unity自己的Texture2D格式. 在Texture2D的设置选项中,你可以针对不同的平台,设置不同的压缩格式,如IOS设置成PVRTC4,Android平台设置成RGBA16等. 嗯,非常的智能. 但是,在一些进阶的使用中,一些情况是难以满足的. 比如,我们NGUI的图集纹理,在Android平台,使用ETC

为什么需要纹理压缩

"最近在玩什么游戏,推荐一个".不管是谁,总会说过或听过这个问题吧. 这时候,你脑海里面浮现的也许是这样的画面 或许最终小伙伴们也能接受这样的游戏 但还是会有一些玩家更怀念这样的游戏 在软件开发,特别是三维应用中,纹理随处可见,但受限于网络环境和硬件能力,纹理也是一大瓶颈.而且在一般的三维应用中,纹理所占大小基本都会在1/2以上,模型中往往超过2/3.或许你会说,纹理不就是一张图吗,有那么重要吗? 如下两张对比图,可能你会认为前者逼格高,但对于正常人而言,后者显然要好很多.正是有了纹理

转发收藏【原创】浅谈UGUI的ETC1+A的纹理压缩方案总结

这个信息很早了,2016年6月研究出来的,当时分享在ulua群1共享里面,然后就被大家的文件淹没了,但是这个话题并不老,这不整理群共享空间的时候,被我翻出来了,拿来炒炒.ETC1+A还是目前业内绝大多数手游纹理压缩方案,因为ETC2依赖于OpenGL3.0,而安卓的OpenGL3依赖于Android 4.3.0,如果不支持OpenGL3的话,系统会自动软解码纹理压缩,但是U3D处理这块很麻烦,要自己分割Alpha通道出来,然后再修改shader合并Alpha,挺麻烦的. Unity5.2开始吧就

DXT纹理压缩

转:http://blog.csdn.net/lhc717/article/details/6802951 我们知道游戏中对于3D物体表面细节的表现最重要的还是靠贴图来实现的,那么越是高分辨率越是真彩色的贴图自然表现力也是越强,但是同时带来的问题是所需占用的内存会成倍的上升,而节省内存这一点在目前的游戏中还是非常非常重要的. 所以各个平台上都在使用纹理压缩的技术,让纹理贴图在内存占用和显示效果能达到一个尽可能的平衡.在DirectX中,使用一种叫做DXT的纹理压缩技术,目前这种技术被大部分显卡所

移动平台纹理压缩格式选择

1)移动平台纹理压缩格式选择2)Unity 2018是否在Mali GPU上支持Alpha 8格式3)如何在Unity自带的Navmesh上获取地面高度4)ParticleSystem无法重新播放5)UI开发中按界面的打开顺序返回到上级面板的问题 Texture Q:在这之前了解过纹理压缩的相关知识和UWA的一些推荐方式.但还是有一点小的疑问,所以在这里再次提出来,希望得到解答. 在纹理压缩格式的选择上,如果Android选用ETC,iOS选用PVRTC,因为有2的次方(ETC1和PVRTC)长

Unity3d纹理压缩格式表

将Texure Type设置为Advanced时纹理的格式列表 格式 详解 Automatic Compressed 压缩RGB纹理,默认选项,常用的漫反射纹理格式.4位/像素(32KB, 256x256) RGB Compressed DXT1 压缩的RGB纹理.常用的漫反射纹理格式.4位/像素(32KB, 256x256) RGBA Compressed DXT5 压缩的RGBA纹理.是漫反射和高光控制纹理的主要格式.1字节/像素(64KB, 256x256) RGB Compressed

FGUI中的纹理压缩

这是没有压缩之前的纹理: 开始压缩: 进入发布设置: 每个包都要PNG压缩: 然后发布: 压缩后的效果: 这样,游戏就可以愉快的加载了. 原文地址:https://www.cnblogs.com/dmc-nero/p/12576487.html

ASTC图片纹理压缩探讨

ASTC中ARM研发的一种较新的贴图压缩格式,从IOS9(A8架构,现在都iOS12了)开始支持ASTC压缩格式 ,相对于PVRTC2/4而言,ASTC(4X4)的压缩比会增加到0.25,不过显示效果也会好很多,而且不要求图片长宽相等且为2的幂次方.而且Android设备也支持. 图片压缩核心思想是将大图分为多个颜色块,每个颜色块固定大小为16-bytes,单个颜色块里的颜色像素怎么划分不关心,这里只记录下ASTC格式图片压缩后的像素大小.图片压缩率.图片总体大小. 对此格式图片的压缩率可能是一