个人理解的 纹理压缩

来源:互联网 发布:中国律师业务数据 编辑:程序博客网 时间:2024/05/20 17:39


2. 压缩纹理的必要性
1)首先要说一下图像文件格式和纹理格式的区别。
常用的图像文件格式有BMP,TGA,JPG,GIF,PNG等;
常用的纹理格式有R5G6B5,A4R4G4B4,A1R5G5B5,R8G8B8, A8R8G8B8等。

    文件格式是图像为了存储信息而使用的对信息的特殊编码方式,它存储在磁盘中,或者内存中,但是并不能被GPU所识别,因为以向量计算见长的GPU对于这些 复杂的计算无能为力。这些文件格式当被游戏读入后,还是需要经过CPU解压成R5G6B5,A4R4G4B4,A1R5G5B5,R8G8B8, A8R8G8B8等像素格式,再传送到GPU端进行使用。
    纹理格式是能被GPU所识别的像素格式,能被快速寻址并采样。
举个例子,DDS文件是游戏开发中常用的文件格式,它内部可以包含A4R4G4B4的纹理格式,也可以包含A8R8G8B8的纹理格式,甚至可以包含DXT1的纹理格式。在这里DDS文件有点容器的意味。

    OpenGL ES 2.0支持以上提到的R5G6B5,A4R4G4B4,A1R5G5B5,R8G8B8,A8R8G8B8等纹理格式,其中 R5G6B5,A4R4G4B4,A1R5G5B5每个像素占用2个字节(BYTE),R8G8B8每个像素占用3个字节,A8R8G8B8每个像素占用 4个字节。
    
    对于一张512*512的纹理的话,R5G6B5格式的文件需要占用512KB(他所占的内存就是512*512*2=512KB)的容量,A8R8G8B8格式的文件需要占用1MB的容量;如果是 1024*1024的纹理,则各需要2M和4M的容量,这对于动辄需要几十、几百张甚至更多纹理的游戏,上G容量的游戏在移动平台上是不容易被接受的(当然,还是有1、2G的大作的,里面包含了几千张的纹理)。(这里的容量就是内存)

    聪明的设计师们在想,有没有其他办法,既能表现丰富的色彩和细节,又能是最小失真的情况下,达到更小的纹理容量呢。压缩纹理格式应运而生(当然,并不是在移动平台后才有的产物)。

3. 常见的压缩纹理格式
基于OpenGL ES的压缩纹理有常见的如下几种实现:
1)ETC1(Ericsson texture compression)
2)PVRTC (PowerVR texture compression)
3)ATITC (ATI texture compression)
4)S3TC (S3 texture compression)

ETC1:
ETC1格式是OpenGL ES图形标准的一部分,并且被所有的Android设备所支持。
扩展名为: GL_OES_compressed_ETC1_RGB8_texture,不支持透明通道,所以仅能用于不透明纹理。
当加载压缩纹理时,<internal format>参数支持如下格式:
    GL_ETC1_RGB8_OES(RGB,每个像素0.5个字节)

PVRTC:
支持的GPU为Imagination Technologies的PowerVR SGX系列。
OpenGL ES的扩展名为: GL_IMG_texture_compression_pvrtc。
当加载压缩纹理时,<internal format>参数支持如下几种格式:
    GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG (RGB,每个像素0.5个字节)
    GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG (RGB,每个像素0.25个字节)
    GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG (RGBA,每个像素0.5个字节)
    GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG (RGBA,每个像素0.25个字节)

ATITC:
支持的GPU为Qualcomm的Adreno系列。
支持的OpenGL ES扩展名为: GL_ATI_texture_compression_atitc。
当加载压缩纹理时,<internal format>参数支持如下类型的纹理:
    GL_ATC_RGB_AMD (RGB,每个像素0.5个字节)
    GL_ATC_RGBA_EXPLICIT_ALPHA_AMD (RGBA,每个像素1个字节)
    GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD (RGBA,每个像素1个字节)

S3TC
也被称为DXTC,在PC上广泛被使用,但是在移动设备上还是属于新鲜事物。支持的GPU为NVIDIA Tegra系列。
OpenGL ES扩展名为:
GL_EXT_texture_compression_dxt1和GL_EXT_texture_compression_s3tc。
当加载压缩纹理时,<internal format>的参数有如下几种格式:
    GL_COMPRESSED_RGB_S3TC_DXT1 (RGB,每个像素0.5个字节)
    GL_COMPRESSED_RGBA_S3TC_DXT1 (RGBA,每个像素0.5个字节)
    GL_COMPRESSED_RGBA_S3TC_DXT3 (RGBA,每个像素1个字节)
    GL_COMPRESSED_RGBA_S3TC_DXT5 (RGBA,每个像素1个字节)

    由此可见,Mali系列GPU只支持ETC1格式的压缩纹理,而且该纹理不支持透明通道,有一定局限性。
    以上压缩纹理格式每个像素大小相对A8R8G8B8格式的比例,最高压缩比是16:1,最低压缩比是4:1,对于减小纹理的数据容量有明显作用,相应在显 存带宽上也有明显优势,从而提高游戏的运行效率(此特性没有绝对数值,根据每个游戏的用法和瓶颈点不同而有差别)。




个人理解:

1.

BMP,TGA,JPG,GIF,PNG这些图像文件,其实是被加载到游戏中的时候,CPU重新解压成R5G6B5,A4R4G4B4,A1R5G5B5,R8G8B8, A8R8G8B8等像素格式,纹理的压缩格式,并不是这些图像文件有任何的关联。


也就是说,假如一张RGBA的512*512 的.png,看起来只有300KB,但是,加载到内存中,就有 512 *512 * 4 /1024 /1024 = 1M。

纹理的压缩格式就是让RGBA的512*512 的数据,存在内存中,不要有1M那么大,尽量的小。

(为什么RGBA的512*512 的.png是300k,不是1M,我理解就是相当于ZIP的感觉,被压了,减少png对硬盘的存储大小)


2.

压缩纹理格式 的作用就是,让纹理存储在内存中的大小尽量变小,又尽量保持精度。


3.

纹理存储在内存中,先要显示的话,就被传到显存中,都是OpenGL进行管理的。



参考:

GPU介绍,图片格式、纹理、size  : http://blog.csdn.net/u011612549/article/details/20071965

常用纹理和纹理压缩格式  : http://blog.csdn.net/ynnmnm/article/details/44983545

显存与纹理内存详解 . : http://blog.csdn.net/pizi0475/article/details/8739557

openGL图片占用内存计算 : http://blog.csdn.net/q790017280/article/details/48263189

Unity3d纹理压缩格式表  :http://www.cnblogs.com/leng-yuye/p/3720343.html

Unity加载模块深度解析之纹理篇                           :http://blog.csdn.net/uwa4d/article/details/53709561#t0



0 0
原创粉丝点击