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格式纹理的类型:
谈到这里我就先介绍下纹理压缩,现在的游戏绝大多数情况下我们都是通过贴图来丰富游戏场景,而贴图本身占用内存空间并且是以不压缩的形式存放在显存当中的,常见的贴图格式分为16bits、24bits和32bits,即使是16bits的1024X1024贴图在显存中的大小也高达2MB,为了加快渲染速度和减少图像的锯齿,可以使用Mipmap把贴图处理成由一系列被预先计算和优化过的图片组成的文件,当然Mipmap是需要占用一定的内存空间的。
我们常见的图片文件格式有
要显示一张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种:
现在常用的贴图压缩方式,则是利用以区块为基础的方式。通常的做法是,把贴图切割成许多小区块,再对各个区块进行压缩。例如,S3TC就是把贴图切成4×4的小区块。利用这种做法,就可以对区块进行某种处理(通常就是vector quantization或是其变形),显示芯片也可以区块为单位,进行随机的存取动作。因此,这是适合用在贴图的方式。
不过,区块的大小会影响到压缩的效果。一般来说,区块愈大,就能有愈高的压缩比。不过,愈大的区块也会使额外的负担增加。因为显示芯片只能以区块为单位来读取贴图数据,如果区块愈大,则每个区块中就可能会有愈多的数据是不需要的。所以,也不能任意把区块的大小加大。
在基于已压缩纹理的渲染论文中,列举了纹理压缩四项的特点,使其不同于其他图像压缩技术。
由于其数据访问模式是事先知道的,纹理压缩常作为整个绘图管线的一部分,在绘制时对动态地已压缩数据进行解压缩。而反过来绘制管线也可以通过纹理压缩技术来降低对于
带宽和存储的需求。在纹理贴图中,已压缩纹理和没有经过压缩的纹理使用起来基本没有区别,都可以被用来存储颜色数据或其他数据,例如凹凸贴图或法线贴图,也都可以和Mipmapping或各向异性过滤等共同使用。
现在主流的移动CPU支持的纹理格式(ARM移动处理器其实是一种SoC片上系统,其内部整合了CPU单元和GPU单元甚至通讯单元。因此在讨论游戏兼容性时,CPU就等于GPU):
CPU | GPU |
德州仪器 | Power VR系列 |
三星猎户座 | Mail系列 |
高通 | Adreno系列 |
NVIDIA | Geforce系列 |
海思K3V2 | Vivante GC |
现在主流的纹理压缩标准:
未完待续…
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/john_cdy/article/details/46936571