Unity纹理压缩

1、贴图,texture和atlas

TextureType贴图类型

  1. Default: 普通贴图,这是所有纹理最常用的设置。
  2. Normal map: 法线贴图,选择此选项可将颜色通道转换为适合实时法线贴图的格式。
  3. Editor GUI and Legacy GUI: UI贴图,把Texture 用在 HUD or GUI controls.上。
  4. Sprite(2D and UI): 精灵图
  5. Cursor: 鼠标指针,如果您使用纹理作为自定义光标,请选择此选项。
  6. Cookie: 遮罩贴图
  7. Lightmap: 烘焙贴图
  8. Directional Lightmap: 烘焙贴图
  9. Shadownmask:
  10. Single Channel:如果你只需要纹理中的一个通道,选择这个。

sRGB(Color Texture):纹理颜色预处理
Alpha Source(α源):默认选择Input Texture Alpha就好,如果确定不使用原图中的Alpha通过,可以选择None。另外From Gray Scale一般不会选用。
Alpha Is Transparency:指定Alpha通道是否开启半透明,如果位图像素不关心是否要半透明可以不开启此选项。这样Alpha信息只需要占1bit。节省内存

Warp Mode:选择纹理平铺时的行为方式。默认选项为 Repeat。 All Texture Types

  1. Repeat:重复,在区块中重复纹理。
  2. Clamp:不重复,拉伸纹理的边缘。
  3. Mirror: 镜像,在每个整数边界上镜像纹理以创建重复图案。
  4. Mirror Once:镜像纹理一次,然后将其钳制到边缘像素。
  5. Per-axis:轴对称

FilterMode(决定纹理拉伸时采样哪种滤波模式):

  1. Point (no filter):最近邻滤波,缩放是采样像素数目只有一个;纹理在靠近时变为块状。
  2. Bilinear:使用线性滤波,找到四个近邻像素,然后进行线性插值混合得到,图像模糊了;纹理在靠近时变得模糊。
  3. Trilinear:几乎和Bilinear一样,只是如果开启多级渐远纹理技术,那就会在多级渐远纹理之间进行混合;与 Bilinear 类似,但纹理也在不同的 MIP 级别之间模糊。

官方文档https://docs.unity3d.com/cn/2019.4/Manual/class-TextureImporter.html

2、atlas优化

优化前1024x1024*32/8/1024/1024=RGBA32Bit=4MB

优化后 91278832/8/1024/1024=RGBA32Bit=2.7MB

不是说贴图必须2的幂吗?,unity支持ASTC格式后,可以不用是2的幂了;
所以,912x788的一张图,在ASTC4x4,内存应该是多大?

912 * 788 * 8 / 8/1024/1024=ASTC4x4=0.68MB ~= 0.7MB

3、贴图内存计算

一张图在内存中占用的大小计算公式为:

图片占用内存的计算公式:图片高度 * 图片宽度 * 一个像素占用的内存大小 = 总byte

RGBA32 bit : 表示每个像素占用32位(bit)储存,1byte=8bit,32bit / 8 = 4byte字节 ,
内存大小 1024 x 1024 x 4 / (1024x1024) = 4M
512x512x4=1,048,576 byte
1,048,576 byte / 1024=1024kb
1024kb / 1024 = 1mb


(1):全平台,RGB和RGBA

RGBA32是R,G,B,A 使用32位来表示一个像素, 32 / 8=4 个字bit大小,带Alpha通道
RGBA16是R,G,B,A 使用16位来表示一个像素,16 / 8=2个字bit大小,带Alpha通道;
RGB24是R,G,B 使用24位来表示一个像素,24/8=3bit,不带Alpha通道;
RGB16是R,G,B 使用16位来表示一个像素,16/8=2bit,不带Alpha通道;

例如一张512x512的图,所占内存公式:

内存大小 = 宽 * 高 *(单个像素位 / 8一位8bit字节=单个像素占用bit字节)/ 1024(kb) / 1024(m)

RGBA32 = 512 x 512 x (32 / 8) / 1024 / 1024 = 1M
RGBA16 = 512 x 512 x (16 / 8) / 1024 / 1024 = 0.5M
RGB24 = 512 x 512 x (24 / 8) / 1024 / 1024 = 0.75M
RGB16 = 512 x 512 x (16 / 8) / 1024 / 1024 = 0.5M
ALPHA_8:只有 A 通道,占 8 位,1 个字节。每个像素点占用 1 个字节的大小

(2):Android,ETC和ETC2

ETC只能用于Android手机,长宽是2的幂,ETC是基于block块的纹理压缩格式,图像被分成4×4的块,每个块使用64位编码。
RGB-ETC 4bits是使用4位来表示一个像素, 4 / 8= 0.5bit,无Alpha通道
RGB-ETC2 4bits是使用8位来表示一个像素, 4 / 8=0.5bit,带Alpha通道
RGBA-ETC2 8bits是使用8位来表示一个像素, 8 / 8=1bit,无Alpha通道
RGB ETC 4bits = 512 x 512 x (4 / 8) / 1024 / 1024 = 0.125M
RGB ETC2 4bits = 512 x 512 x (4 / 8) / 1024 / 1024 = 0.125M
RGBA ETC2 8bits = 512 x 512 x (8 / 8) / 1024 / 1024 = 0.25M

(3):IOS,PVRTC

PVRTC只能用于ios手机,长宽正方形且2的幂
RGB PVRTC 2bits:使用2位来表示一个像素, 2 / 8=0.25bit,无Alpha通道
RGBA PVRTC 2bits:使用2位来表示一个像素, 2 / 8=0.25bit,有Alpha通道
RGB PVRTC 4bits:使用4位来表示一个像素, 4 / 8=0.5bit,无Alpha通道
RGBA PVRTC 4bits:使用4位来表示一个像素, 4 / 8=0.5bit,有Alpha通道
RGB PVRTC 2bits = 512 x 512 x (2/ 8) / 1024 / 1024 = 0.06M
RGBA PVRTC 2bits = 512 x 512 x (2/ 8) / 1024 / 1024 = 0.06M
RGB PVRTC 4bits = 512 x 512 x (4/ 8) / 1024 / 1024 = 0.125M
RGBA PVRTC 4bits = 512 x 512 x (4/ 8) / 1024 / 1024 = 0.125M

(4):全平台,ASTC(自适应可缩放纹理压缩)

ASTC是一种基于block块的有损纹理压缩格式,由ARM2012年推出的自适应可缩放纹理压缩方式。
像素大小 = 16-bytes / 分块宽高 * 8-bit;
压缩率 = 原始像素大小(32-bit) / 像素大小;
图像大小 = 原始图片大小 / 压缩率;
图片大小(MB)=长x宽x像素大小(bits)/8/1024/1024

unity2018之前,A通道独立

unity2019之后 A通道合并

RGB ASTC 4X4 block:使用8位来表示一个像素, 8 / 8=1bit ,无Alpha通道
RGB ASTC 4X4 block = 512 x 512 x (8/ 8) / 1024 / 1024 = 0.256M

RGBA ASTC 6X6 block:使用3.56bit来表示一个像素, 3.56 /8 =0.445bit ,无Alpha通道
RGB ASTC 8X8 block = 512 x 512 x (2 / 8) / 1024 / 1024 = 0.111M

(5):桌面端,PC

DXT是一种有损纹理压缩算法,基本思想是把4x4的像素块压缩成一个64或128位的数据块

RGB Compressed DXT1:使用4位来表示一个像素, 4 / 8=0.5bit ,无Alpha通道
RGB Compressed DXT1 = 512 x 512 x (4/ 8) / 1024 / 1024 = 0.125M
RGBA Compressed DXT5:使用8位来表示一个像素, 8 / 8=1bit ,有Alpha通道,
RGBA Compressed DXT5 = 512 x 512 x (8/ 8) / 1024 / 1024 = 0.25M

posted @   请明月  阅读(176)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示