unity-贴图压缩格式

unity-贴图压缩格式


前篇


unity 默认压缩格式

先看结论: https://blog.csdn.net/Czhenya/article/details/116942231

贴图导入unity后会自动设置成压缩格式,它会先判断贴图是否有透明通道。
Android:不带透明通道压缩成ETC1,带透明通道压缩成ETC2,不被4整除的回退到RGBA32
IOS: 不带透明通道压缩成RGB PVRTC,带透明通道压缩成RGBA PVRTC ,不是2的整数次幂回退到RGBA32


opengl es 贴图最大尺寸


查看 资源大小

  1. 先切到对应平台

  2. 选中资源就可以看到大小


查看 AssetBundle 打包资源大小

打完 ab 可以在 editor log 中查看打包进去的资源大小

  1. console 中可以 open editor log

  2. 比如查看一个 not pot 资源, 也就是会退回到 RGBA32

    1. 编辑器 中

    2. editor log 中

      • 与 editor 中查看的大小一致

Android


astc 支持调研

  • 支持
    • Redmi 6
    • OnePlus 7
    • OPPO A3s
    • 模拟器
      • 雷电
      • 夜神 7.0.0.8 (需要手动设置 astc 支持)
  • 不支持
    • a

iOS

官方建议

iOS 和 tvOS

对于使用 A8 芯片 (2014) 或以上的 Apple 设备,ATSC 是 RGB 和 RGBA 纹理的推荐纹理压缩格式。这种格式允许您在粒度级别对纹理质量和大小进行选择:从 8 位/像素(4x4 块大小)开始直至 0.89 位/像素(12x12 块大小)。 如果需要支持旧设备,或者您想要额外的 Crunch 压缩,从 A7 芯片 (2013) 起的 Apple 设备支持 ETC/ ETC2 格式。 对于更旧的设备,需要使用 PVRTC 压缩格式。 在 iOS 上,Unity 的默认纹理压缩格式是 PVRTC,以获得尽可能广泛的兼容性。ASTC 是首选,但在 A7 设备(第一个支持 Metal 的设备)上不受支持,将在运行时解压缩。

A8 芯片

Apple A8是苹果公司设计的第二代64位系统单片机(SoC)。在2014年9月9日发布,用于iPhone 6、iPhone 6 Plus、iPad mini 4、iPod touch 6、Apple TV和HomePod。[5] 苹果公司宣称它比上代Apple A7在CPU性能高25%,绘图性能高50%,能源效益高50%。


ASTC

一、ASTC纹理压缩格式介绍

ASTC是在OpenGL ES3.0出现后在2012年中产生的一种业界领先的纹理压缩格式,它的压缩分块从4x4到12x12最终可以压缩到每个像素占用1bit以下,压缩比例有多种可选。ASTC格式支持RGBA,且适用于2的幂次方长宽等比尺寸和无尺寸要求的NPOT(非2的幂次方)纹理。

以ASTC 4x4 block压缩格式为例,每个像素占用1字节,8bits。一张1024*1024大小的贴图压缩后的大小为1M。

ASTC在压缩质量和容量上有很大的优势。

文档中有详细的测试数据:https://developer.nvidia.com/astc-texture-compression-for-game-assets


二、适配机型
  • iOS

    苹果从A8处理器开始支持 ASTC,iPhone6及iPad mini 4以上iOS设备支持,2014年的iPhone 5s及iPad mini 3以前的设备不支持。

  • 安卓

    安卓主流压缩格式正在从ETC2转向ASTC。

    Unity官方对安卓ASTC格式支持的说明:

    https://docs.unity3d.com/Manual/class-TextureImporterOverride.html

    官方文档中提到GPU对ASTC的支持情况:所有支持OpenGL ES 3.1和部分支持OpenGL ES 3.0的GPU。


无论贴图本身是否带Alpha信息,ASTC压缩的不同设置直接决定压缩大小。控制贴图资源的包体大小,依赖于ASTC压缩格式的规范是否合理,毕竟压缩为ASTC 8x8后容量与ASTC 6x6相比减小了约44.8%(85.4KB vs 154.7KB),压缩为ASTC 8x8后容量与ASTC 4x4相比减小了约300%(85.4KB vs 341.4KB)。而我们通常检查Alpha通道是否为空,可以帮助我们判断Alpha的信息是否冗余,是否应该设置更低的压缩精度。

最后定的ui6x6,其他全部8x8,应该够用


实测对比
iPhone X
  • ASTC_RGBA_4x4

  • ASTC_RGBA_6x6

  • ASTC_RGBA_8x8

8x8 有点糊了, 6x6 可以接受.

默认格式不用看了, 比 8x8 更糊.


Fiter mode 过滤器模式

因为贴图在屏幕里肯定会存在放大,缩小的情况,这种时候就会出现锯齿。 在UNITY3D中点开一张贴图,Fiter mode 过滤器模式 ,下面有3个选项 point , Bilinear ,Trilinear

  • point

    点采样模式,屏幕像素会需找最近的贴图像素点,来作为输出,这种比较生硬,但是性能好,不抗锯齿。

  • Bilinear

    线性采样模式, 采用最近的4个像素来做线性插值,有平缓的过渡。可以解决贴图放大的问题,但是贴图缩小依然有锯齿。缩小可以用mip-map来解决。

  • Trilinear

    三线性采样模式,可以比较好的解决贴图缩小和放大。

    • 缺点:像素处理速度变慢,贴图大小增加1/3。
    • 优点:画面好,GPU可以根据光栅化结果导入一层MIP-MAP到显存中,减轻硬件负担,综合起来,能弥补像素处理的速度。

Wrap mode 循环模式

在贴图边界以设置贴图的重复模式的方式避免不真实的情

  • 使用强制贴图边界拉伸 TextureWrapMode.Clamp

  • 贴图重复平铺 TextureWrapMode.Repeat