前言:
最近项目里被夹在中间处理视频流的格式,这边给格式A,那边要格式B,夹在中间甚是烦人,无奈,只能先搞清楚在unity里面支持的几种格式,为后面要踩的坑铺铺路。
正文:以下均基于unity来讲
相关术语:
- 每像素位数 (bpp) 表示单个纹理像素所需的存储量。Bpp 值越低的纹理在磁盘和内存中也越小。较低的 bpp 值意味着 GPU 可在缓存中存储更多的像素,从而可以更快地访问纹理。
- LDR(低动态范围)是指最典型的图像,其中颜色在概念上介于 0.0(黑色)和 1.0(白色)值之间。大多数图像文件(例如 PNG 和 JPG)具有低动态范围。
- HDR(高动态范围)是指特殊的图像和纹理格式,其中颜色的范围可以高于 0 到 1。像 .exr 或 .hdr 这样的图像文件格式通常用于 HDR 图像数据。在运行时和 GPU 上,有多种 HDR 格式,分别对精度、范围和内存使用情况进行取舍。
- RGB 是一种颜色模型,通过红色、绿色和蓝色的组合生成一系列颜色。
- RGBA 是具有 Alpha 通道的 RGB 版本,支持混合和不透明度更改。
- 可变比特率 (VBR) 表示每像素的位数不是固定值,而是取决于实际内容。VBR 仅适用于 Crunch 压缩,仅限于磁盘上的纹理大小。内存中的大小与使用基础纹理格式时的大小相同(例如,RGB Compressed DXT1 对应 RGB Crunched DXT1)。
我们先看一下Windows平台下默认格式:
平台 | 颜色模式 | 无压缩 | 高质量压缩 | 默认压缩 | 低质量压缩 |
---|---|---|---|---|---|
PC | RGBA | RGB 32bit | RGB(A) BC7 | RGBA DXT5 | RGBA DXT5 |
RGB | RGB 24bit | RGB(A) BC7 | RGB DXT1 | RGB DXT1 | |
HDR | RGB half | RGB BC6H | RGB BC6H | RGB BC6H | |
Android | RGBA | RGB 32bit | RGB ETC2 | RGB ETC2 | RGB ETC2 |
RGB | RGB 24bit | RGB ETC | RGB ETC | RGB ETC | |
iOS | RGBA | RGB 32bit | RGBA PVRTC 4 | RGBA PVRTC 4 | RGBA PVRTC 2 |
RGB | RGB 24bit | RGB PVRTC 4 | RGB PVRTC 4 | RGB PVRTC 2 |
可以看到PC默认是RGBA、RGB和HDR三种颜色模式。
ARGB4444、RGB888、ARGB8888等未经压缩的图片格式,是可以被GPU直接读取的原生纹理格式。但在设备硬件比较差或者在移动平台时,就需要解决内存和带宽的问题。
比如ARGB8888格式中一个像素占4Byte,如果时512x512分辨率内存占用为512x512x4B=1048576B=1M,这种内存消耗在设备硬件差时肯定时带不动的。
比如在渲染3D场景时,大量的贴图传输到GPU,数据传输带宽猛增,设备发热渲染开始卡卡卡...
常见的纹理压缩格式:
1、ETC:安卓的标准压缩方案
原理:将4x4的像素块编码为2x4或4x2像素的两个块,每个块指定一个基色,每个像素的颜色通过一个编码为相对这些基色偏移的灰度值确定。
常见的ETC压缩格式有:
RGB ETC1 4bit:4bit/pixel,对RGB压缩比为6:1,不支持alpha,绝大多数android设备都支持
RGB ETC2 4 bit:4 bits/pixel,对RGB压缩比6:1。不支持Alpha,ETC2兼容ETC1,压缩质量可能更高,但对于色度变化大的块误差也更大,需要在OpenGL ES 3.0和OpenGL 4.3以上版本
RGBA ETC2 8bit:8 bits/pixel,对RGBA压缩比4:1。支持完全的透明通道,版本要求同上
RGB +1bit Alpha ETC2 4bit:4 bits/pixel。支持1bit的Alpha通道,也就是只支持镂空图,图片只有透明和不透明部分,没有中间的透明度
2、DXT:原名S3TC
其原理简单来说,是由一对低精度的“基色”来描述一个4x4的RGB像素块,并允许每个像素在这些基色之间指定一个插值。S3TC有多种变体,每种都是为特定类型的图像数据设计,但它们都是将4x4的像素块转换为64位或128位的数据
3、ASTC:是安卓和iOS平台下的高质量压缩方式
- 一种基于快的有损压缩算法
- 块固定大小128位
- 每个纹理在128位中可以有不同大小的块
- 较高的灵活性:支持1-4分量的贴图
- 压缩率、质量灵活可变
- 支持2D/3D贴图
- 同时支持LDR和HDR
ASTC有很多优点,但使用的时候要注意:
- 法线贴图:尽量选择4x4,避免丢失过多数据
- 细节处的贴图:选4x4或6x6,否则会丢失细节
- 一般贴图:选6x6或8x8
- 无关紧要但尺寸特别大的图:8x8或10x10或12x12
总结:
通过以上三种压缩格式可以发现,三种压缩算法都使用了4x4的像素块做运算。这也就是为什么每次美术输出图片尺寸都要求长宽是4的倍数的原因----这样我们导入unity进行压缩格式的时候才会有更好的效果。
附录知识点:
对于PC平台
- 如果导入的图片长宽尺寸为4的倍数也为2的次幂,则会被压缩为RGB Compressed DXT1 或者RGBA Compressed DXT5
- 如果导入的图片长宽为4的倍数但不为2的次幂,则会被压缩为(NPOT)RGB Compressed DXT1 或者(NPOT)RGBA Compressed DXT5
- 如果导入的图片长宽不为4的倍数也不为2的次幂,则会被压缩为(NPOT) RGB24/(NPOT) RGBA32,这些都为未压缩格式,非常占用内存