关于纹理压缩

2015-6-21 雨辰 Unity3D

ETC1

ETC1把一个4x4的像素单元组压成一个64位的数据块。4x4的像素组先被水平或垂直分割成2个4x2的组,每一半组有1个基础颜色(分别是RGB444/RGB444或RGB555/RGB333格式)、1个4位的亮度索引、8个2位像素索引。每个像素的颜色等于基础颜色加上索引指向的亮度范围。

比如对于某一个半组: 
1. 12位的基础颜色是RGB(0, 34, 255); 
2. 4位的亮度索引从亮度表中选择亮度补充,亮度表有16个,下表是0-7,8-15是0-7的2倍。 


亮度索引1对应(-12, -4, 4, 12); 
3. 2位的像素索引是0,所以亮度补充是-12。由此可以得到此像素的颜色值是(0-12, 34-12, 255-12),也即(0, 22, 243)。

四大移动设备GPU都支持ETC1,所以在各种Android设备上非透明纹理都可以采用ETC1格式,遗憾的是ETC1不支持透明。对于透明纹理,在Android设备上,可以把RGB和Alpha拆到2张ETC1纹理上,游戏中再合成使用。

ETC2

ETC2是ETC1的扩张,向后兼容ETC1,对RGB的压缩质量更好,并且支持透明通道。目前下列ETC2压缩格式在OpenGL ES 3.0和OpenGL 4.3上被要求支持: 
GL_COMPRESSED_RGB8_ETC2 压缩的RGB888格式,类似于ETC1 
GL_COMPRESSED_RGBA8_ETC2_EAC 压缩的RGBA8888格式,支持完全的透明通道 
GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 压缩的RGBA数据,只有一位Alpha

ETC2比ETC1压缩质量更高,而且支持透明,在Android设备上再也不需要打不同纹理格式的包了。不过需要OpenGL ES 3.0以上才可以,目前很多设备只支持OpenGL ES 2.0。

PVRTC纹理压缩格式

PowerVR Texture Compression,PVRTC格式与基于块的压缩格式,比如S3TC、ETC的不同之处是,它使用2张双线性放大的低分辨率图,根据精度和每个像素的权重,融合到一起来呈现纹理,并且2-bpp和4-bpp都支持ARGB数据。PVRTC格式压缩比高,也是有损压缩。

PVRTC 2-bpp

2 bits per pixel,每个像素2位,质量较差,把一个8×4的像素单元组压成一个64位的数据块。每个数据块中存储了6个变量:调制数据(32位),punch-through Alpha标志(1位),颜色A(15位),颜色A不透明标志(1位),颜色B(14位)和颜色B的不透明标志(1位)。

PVRTC 4-bpp

4 bits per pixel,每个像素4位,把一个4×4的像素单元组压成一个64位的数据块。每个数据块中存储了6个变量:调制数据(32位),调制标志(1位),颜色B(14位),硬转换标志(1位),颜色A(15位)和不透明标志(1位)。

标签: Unity3D-优化性能

发表评论:

雨辰 joyimp|@2011-2018 京ICP备16030765号