【Unity】Texture

前言:

        最近项目里被夹在中间处理视频流的格式,这边给格式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平台下默认格式:

平台颜色模式无压缩高质量压缩默认压缩低质量压缩
PCRGBARGB 32bitRGB(A) BC7RGBA DXT5RGBA DXT5
RGBRGB 24bitRGB(A) BC7RGB DXT1RGB DXT1
HDRRGB halfRGB BC6HRGB BC6HRGB BC6H
AndroidRGBARGB 32bitRGB ETC2RGB ETC2RGB ETC2
RGBRGB 24bitRGB ETCRGB ETCRGB ETC
iOSRGBARGB 32bitRGBA PVRTC 4RGBA PVRTC 4RGBA PVRTC 2
RGBRGB 24bitRGB PVRTC 4RGB PVRTC 4RGB 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,这些都为未压缩格式,非常占用内存
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值