17.纹理压缩

目录

前言

P1

P2


前言

移动端设备较小,将GPUCPU集成到一起(SOC),共享一块内存,现内存频率已可大幅超过PC端频率,但碍于I/O传输位数(单次可传输bit数),带宽仍然是移动端性能瓶颈之一。

英伟达和unity官方压缩建议

  • Using ASTC Texture Compression for Game Assets | NVIDIA Developer
  • Unity - Manual: Recommended, default, and supported texture compression formats, by platform (unity3d.com)

P1

纹理压缩

  • 是为了解决内存、带宽问题,专为在计算机图形渲染系统中存储纹理而使用的图像压缩技术;

图片格式

  • 是图片文件的存储格式,通常在磁盘、内存中储存和传输文件时使用;
  • 例如:JPG、PNG、GIF、BMP等;

纹理格式

  • 是显卡能够直接进行采样的纹理数据格式,通常在向显卡中加载纹理时使用;

纹理管线

纹理压缩格式基于块压缩,能够更快读取像素所属字节块进行解压缩以支持随机访问;

图片压缩格式基于整张图片进行压缩,无法直接实现单个像素的解析;

图片压缩格式无法被GPU识别,还需要经CPU解压缩成非压缩纹理格式才能被识别;

常见纹理格式

非压缩格式

  • RGBA8888(RGBA32)
  • RGBA4444(RGBA16)
  • RGB888(RGB24)
  • RGB565(RGB16)

DirectX标准压缩-DXTC

  • DXT1(BC1)
  • DXT2(BC2)
  • DXT3(BC2)
  • DXT4(BC3)
  • DXT5(BC3)
  • ETC1 ETC2
  • ATI1(BC4)
  • ATI2(BC5)
  • BC6H
  • BC7

IOS设备

  • PVRTC
  • PVRTC
  • PVRTC2

DXTC

DCTC纹理压缩格式来源于S3公司提出的S3TC算法,基本思想是把4×4的像素块压缩成一个64或128位的数据块,优点为创建了一个固定大小且独立的编码片段,没有共享查找表或其他依赖关系,简化了解码过程;

DXTC1

  • 每一个块具有2个16位RGB颜色值(RGB565),代表了此4×4像素块中颜色极端值,然后通过线性插值计算出两个中间颜色值,16个2位索引值则表示了每一个像素的颜色值索引;

DXT2/3

  • DXT2/3与DXT1类似,表示颜色信息的64位数据块不变,另外附加了64位数据来表示每个像素的Alpha信息,整个数据块变为了128位;
  • 每个像素占用8位,0-3表示透明信息,4-7表示颜色信息;

DXT4/5

  • DXT4/5与DXT2/3的差异在于其Alpha信息是通过线性插值所得的,表示颜色信息的64位数据块依然不变,而Alpha信息则由2个8位Alpha极端值和16个3位索引值组成;
  • 我们可以看到在Unity内贴图类型选为法线后会采用DXTnm压缩格式,该格式会把法线贴图R通道存入A通道,然后RB通道清除为1,这样可以将法线XY信息分别存入到RGB/A中分别压缩,以获得更高的精度,然后再根据XY构建出Z通道数据;

ATI1/2

ATI1为ATI公司开发的纹理压缩格式,也被称为BC4,其每个数据块存储单个颜色的数据通道,以与DXT5中的Alpha数据相同的方式进行编码,常用于存储高度图、光滑度贴图,效果与原始图像基本无差异;

ATI2也被称为BC5,每一个块中存储两个颜色通道的数据,同上以与DXT5中Alpha数据相同的方式进行编码,相当于存储了两个BC4块;

如果是在将法线存储在XY双通道中采用BC5格式压缩,由于每个通道都有自己的索引,因此法线贴图XY信息可以比在BC1中保留更多的保真度,缺点是需要使用两倍内存,也需要更多的带宽才能将纹理传递到着色器中;

BC6/7

  • https://docs.microsoft.com/zh-cn/windows/uwp/graphics-concepts/bc6h-format
  • https://docs.microsoft.com/zh-cn/windows/uwp/graphics-concepts/bc7-format

BC6和BC7仅在D3D11级图形硬件中受支持,他们每个块占用16字节,BC7针对8位RGB或RGBA数据,而BC6针对RGB半精度浮点数据,因此BC6是唯一一个可以原生存储HDR的BC格式;

BC6是专门针对HDR(高动态范围)图像设计的压缩算法,压缩比为6:1;

BC7是专门针对LDR(低动态范围)图像设计的压缩算法,压缩比为3:1,该格式用于高质量的RGBA压缩,可以显著减少由于压缩法线带来的错误效果;

ETC

上述我们说的DirectX选择了DXTC作为标准压缩格式,那对于OpenGL则选择了爱立信研发的ETC格式,几乎所有的安卓设备都可以支持ETC压缩,所以其在移动平台上被广泛应用;

ETC方案与DXTC具有相同特点,将4×4的像素单元压缩成64位数据块,并将像素单元水平或竖直朝向分为两个区块,每个像素颜色等于基础颜色加上索引指向的亮度范围;

  • 24位 颜色信息(RGB444 * 2 或 RGB333 + RGB555)
  • 32位 像素索引信息
  • 8位 亮度索引信息

ASTC

ASTC是由ARM和AMD联合开发的纹理压缩格式,ASTC在各项指标上都挺不错,优点是可根据不同图片选择不同压缩率的算法,图片不需要为2的幂次,同时支持LDR和HDR,缺点是兼容性不够完善且解码时间较长;

ASTC也是基于块的压缩算法,与BC7类似,其数据块大小固定为128位,不同的是块中的像素数量可变,从4×4到12×12像素都有;

每一个数据块中存储了两个插值端点,但不一定存储的是颜色信息,也可能是Layer信息,这样可以用来对Normal或Alpha进行更好的压缩;

对于块中每一个纹素,存储其对应插值端点的权重,存储的权重数量可以少于纹素数量,可通过插值得到每一个纹素的权重值,然后再进行颜色的计算;

权重、高度信息,特殊块标识;11位
Part数量;2位
16种插值端点模式(如LDR/HDR,RGB/RGBA);4位
插值端点信息,纹素权重值,配置信息;111位

PVRTC

PVRTC由Imagination公司专为PowerVR显卡设计,仅支持Iphone、Ipad和部分安卓机;

不同于DXTC和ETC这类基于块的算法,PVRTC将图像分为了低频信号和高频信号,低频信号由两张低分辨率图像AB组成,高频信号则是低精度的调制图像,记录了每个像素混合的权重,解码时AB图像经过双线性插值放大,然后根据调制图像的权重进行混合;

  • PVRTC 4-bpp把一个4×4的像素单元压成一个64位数据块,每一个块中存储一个32位的调制数据,一个1位的调制标志,15位的颜色A,1位颜色A不透明标志,14位颜色B,1位颜色B不透明标志;
  • 而PVRTC 2-bpp则是把一个8×4的像素单元压成了64位数据块;

总结

画质比较

  • RGBA > ASTC 4×4 > ASTC 6×6 > ETC2 ≈ ETC1

压缩比

  • DXT1 6:1 DXT2/3 4:1
  • DXT4/5 4:1 ATI1 4:1
  • ATI2 4:1 BC6 6:1
  • BC7 3:1 PVRTC 6:1
  • ASTC 4:1~35.95:1

PC:

  • 低质量使用DXT1格式不支持A通道,使用DXT5格式支持A通道;
  • 高质量使用BC7格式,支持A通道;

安卓:

  • 低质量使用ETC1格式,但不支持A通道;
  • 低质量使用ETC2格式,支持A通道,需要在OpenGL ES 3.0/OpenGL 4.3以上版本;
  • 高质量使用ASTC格式,需要在Android 5.0/OpenGL ES 3.1以上版本;

IOS:

  • 高质量使用ASTC格式,需要Iphone6以上版本;
  • 低质量使用PVRTC2格式,支持Iphone6以下版本;

P2

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值