可可西

像素格式与纹理压缩

在cpu上创建纹理(Texture2D)、RenderTarget(Surface、Frame Buffer)时,需要为其指定像素格式,因为gpu在shader中需要根据该信息来理解每个像素里面包含的信息。

未压缩的像素格式

下表是一些常见的未压缩的像素格式,常用于RenderTarget和未压缩的贴图,对其读写会占用大量带宽,它们也是内存占用的大户,应该严格控制其使用。

例如:1张PF_B8G8R8A8像素格式的1024x1024的RT或贴图,就要占用4x1024x1024=4MB内存。

RenderTarget是可读写的动态纹理。例如:ue4的SceneColorMobile就是1张RT。HDR管线下,该RT存储的是float数;LDR管线下,该RT存储的是RGBA等颜色值。

未压缩的贴图是只读的,具体包括两种:一种为导入的未压缩的静态贴图(Texture2D),一种为运行时创建的动态贴图(Texture2DDynamic)。

制作游戏时,要避免使用未压缩的贴图。但由于某些手机平台不支持某种贴图压缩,例如不支持ETC2,那么ETC2压缩的半透明贴图会变成未压缩的,带来严重的性能问题。

EPixelFormat(UE4) D3DFORMAT(D3D9) DXGI_FORMAT(D3D10、11、12) OpenGL Vulkan Metal 说明
PF_A32B32G32R32F D3DFMT_A32B32G32R32F DXGI_FORMAT_R32G32B32A32_FLOAT GL_RGBA32F VK_FORMAT_R32G32B32A32_SFLOAT RGBA32Float RGBA 4个通道,各通道均为32bits浮点数
PF_B8G8R8A8  

 

 

 

 

DXGI_FORMAT_B8G8R8A8_TYPELESS

注:TYPELESS表明各个分量类型不确定

可能为DXGI_FORMAT_B8G8R8A8_UNORM

可能为DXGI_FORMAT_B8G8R8A8_UNORM_SRGB

 

GL_RGBA8 VK_FORMAT_B8G8R8A8_UNORM BGRA8Unorm

RGBA 4个通道,存放归一化前的无符号整数份

各通道为8bits,其范围为[0,255]

 

假设在资源中的值为10

在shader会被解释到[0,1]之间,为10/255=0.0392

 

注:ue4的LDR,SceneColorMobile的RT为该格式

       因为B8G8R8A8每个通道被shader解释后在[0,1]之间

       不能超过1,表示不了更高的亮度

PF_A2B10G10R10 D3DFMT_A2R10G10B10 DXGI_FORMAT_R10G10B10A2_UNORM GL_RGB10_A2 VK_FORMAT_A2B10G10R10_UNORM_PACK32 RGB10A2Unorm

RGBA 4个通道,存放归一化前的无符号整数份

A通道为2bits,其范围为[0,3]

RGB通道为10bits,其范围为[0,1023]

 

假设在资源中A的值为2

在shader会被解释到[0,1]之间,为2/3=0.67

假设在资源中G的值为50

在shader会被解释到[0,1]之间,为50/1023=0.0489

PF_A16B16G16R16 D3DFMT_A16B16G16R16 DXGI_FORMAT_R16G16B16A16_UNORM GL_RGBA16F VK_FORMAT_R16G16B16A16_UNORM RGBA16Unorm  

RGBA 4个通道,存放归一化前的无符号整数份

各通道为16bits,其范围为[0,65535]

 

假设在资源中G的值为1000

在shader会被解释到[0,1]之间,为1000/65535=0.01526

PF_FloatRGB

PF_FloatR11G11B10

  DXGI_FORMAT_R11G11B10_FLOAT GL_R11F_G11F_B10F VK_FORMAT_B10G11R11_UFLOAT_PACK32 RG11B10Float

RGB 3个通道,RG通道为11bits浮点,B为10bits浮点

 

注:ue4的HDR,SceneColorMobile的RT为该格式

PF_FloatRGBA D3DFMT_A16B16G16R16F DXGI_FORMAT_R16G16B16A16_FLOAT GL_RGBA16F VK_FORMAT_R16G16B16A16_SFLOAT RGBA16Float RGBA 4个通道,各通道均为16bits浮点数 
PF_R16G16B16A16_UINT D3DFMT_A16B16G16R16 DXGI_FORMAT_R16G16B16A16_UINT GL_RGBA16UI VK_FORMAT_R16G16B16A16_UINT RGBA16Uint

RGBA 4个通道,各通道为16bits无符号整数

范围:[0,65535]  如:30000

PF_R16G16B16A16_SINT D3DFMT_A16B16G16R16 DXGI_FORMAT_R16G16B16A16_SINT GL_RGBA16I VK_FORMAT_R16G16B16A16_SINT RGBA16Sint

RGBA 4个通道,各通道为16bits有符号整数

范围:[-32768,32767]  如:-8192

PF_R8G8B8A8_UINT D3DFMT_A8R8G8B8 DXGI_FORMAT_R8G8B8A8_UINT GL_RGBA8UI VK_FORMAT_R8G8B8A8_UINT RGBA8Uint

RGBA 4个通道,各通道为8bits无符号整数

范围:[0,255]  如:80

PF_R8G8B8A8_SNORM D3DFMT_A8R8G8B8 DXGI_FORMAT_R8G8B8A8_SNORM GL_RGBA8 VK_FORMAT_R8G8B8A8_SNORM RGBA8Snorm

RGBA 4个通道,存放归一化前的有符号整数份

各通道为8bits,其范围为[-128,127]

 

假设在资源中当前值为10

在shader会被解释到[-1,1]之间,为-1+2*(128+10)/255=0.08235

PF_R32G32B32A32_UINT   DXGI_FORMAT_R32G32B32A32_UINT GL_RGBA32UI VK_FORMAT_R32G32B32A32_UINT RGBA32Uint

RGBA 4个通道,各通道为32bits无符号整数

范围:[0,4294967295]  如:200000

PF_R16F D3DFMT_R16F DXGI_FORMAT_R16_FLOAT GL_R16F VK_FORMAT_R16_SFLOAT R16Float R 1个通道,通道为16bits浮点数  
PF_R8   DXGI_FORMAT_R8_UNORM GL_R8 VK_FORMAT_R8_UNORM R8Unorm

R 1个通道,存放归一化前的无符号整数份

通道为8bits,其范围为[0,255]

 

假设在资源中R的值为90

在shader会被解释到[0,1]之间,为90/255=0.35294

PF_R32_UINT   DXGI_FORMAT_R32_UINT GL_R32UI VK_FORMAT_R32_UINT  R32Uint

R 1个通道,通道为32bits无符号整数

范围:[0,4294967295]  如:8000

PF_DepthStencil D3DFMT_D24S8 DXGI_FORMAT_R24G8_TYPELESS GL_DEPTH24_STENCIL8 VK_FORMAT_D24_UNORM_S8_UINT Depth24Unorm_Stencil8 

DS 2个通道,存放归一化前的无符号整数份

Depth通道为24bits,其范围为[0,16777215]

Stencil通道为8bits,其范围为[0,255]

 

假设在资源中D的值为56000

在shader会被解释到[0,1]之间

为56000/16777215=0.00333786

 

注:ue4非HDR,SceneDepthZ的RT为该格式

PF_D24 D3DFMT_D24S8 DXGI_FORMAT_R24G8_TYPELESS GL_DEPTH_COMPONENT24 VK_FORMAT_X8_D24_UNORM_PACK32

Depth24Unorm_Stencil8

同上,只是S通道没有使用

PF_ShadowDepth D3DFMT_D16 DXGI_FORMAT_R16_TYPELESS GL_DEPTH_COMPONENT16 VK_FORMAT_D16_UNORM

Depth16Unorm

Depth32Float

用于ShadowMap(阴影图)
PF_DepthStencil   DXGI_FORMAT_R32G8X24_TYPELESS GL_DEPTH32F_STENCIL8 VK_FORMAT_D32_SFLOAT_S8_UINT Depth32Float_Stencil8 

DS 2个通道

Depth通道为32bits浮点数

 

Stencil通道为8bits,存放归一化前的无符号整数份

Stencil通道范围为[0,255]

假设在资源中S的值为120

在shader会被解释到[0,1]之间,为120/255=0.4706

 

注:ue4的HDR高清下,SceneDepthZ的RT为该格式

注1:Metal像素格式的前缀为mtlpp::PixelFormat。如:mtlpp::PixelFormat::BGRA8Unorm

注2:UE4的BackBuffer的像素格式为:R8G8B8_UNORM

 

Small Float Formats

参见“OpenGL -- Small Float Formats”      IEEE754(wikichs

浮点位数符号位尾数位指数位最大正数最小正数十进制精度
32-bit Float 1 23 8 3.4028237 × 1038 1.175494 × 10-38 7.22
16-bit Float(half) 1 10 5 6.55 × 104 6.10 × 10-5 3.31
14-bit Float 0 9 5 6.55 × 104 6.10 × 10-5 3.01
11-bit Float(fixed) 0 6 5 6.50 × 104 6.10 × 10-5 2.1
10-bit Float 0 5 5 6.50 × 104 6.10 × 10-5 1.8

 

纹理贴图压缩概述

jpg、png、tga等图片压缩方法不适合纹理,主要原因是:

图片压缩重点是压缩其在存储设备上内存的大小(一般是为了网络传输和硬盘存储),而纹理压缩Texture compression)重点是压缩其加载到内存后的大小(纹理是游戏运行的内存大头)

每一种类型的纹理贴图都有它本身的属性需求:

① 颜色通道的个数

② 维度(2D/3D)

③ 通道数据类型(LDR/HDR)

④ 压缩质量

 

为了实现这一目标,不能再使用图片的VLC(Variable bit Length Coding)来压缩,而要采用以block)为单位的来压缩,使得可以支持硬件解码,支持随机解码(低带宽,需要那块数据,读取对应的block即可)

 

PNSRPeak signal-to-noise ratio峰值信噪比): 一种图像error metric,数值越大,误差越小。用来作为纹理压缩前后的差异度量。

bpp(bit per pixel)越大(block size越小),质量越好,内存占用越大

压缩比与bpp的关系:压缩比 = 32 bits / bpp     注:32 bits表示一个像素4个字节

bpp 压缩比
8 1:4
4 1:8
3.56 1:8.988764
2 1:16

 

纹理贴图压缩算法 

压缩算法 说明

BTC(Blcok Truncation Coding

方块编码

最早的纹理压缩算法,仅支持单通道灰度纹理(每个像素0~255)

分成若干4x4 block,每个block使用32bits,每个block独立压缩

S3TC(S3 Texture Compression)

又称DXTn、DXTC或BCn

支持RGBA 4通道,分成若干4x4 block,每个block独立压缩

DXT1(BC1)用于压缩不透明纹理,bpp为4,压缩比为1:8

DXT5(BC3)用于压缩半透明纹理,bpp为8,压缩比为1:4

BC4:用于R通道的压缩

BC5:压缩质量好于BC3,但效率要低一些。ue用该算法对RG通道的压缩来存储法线。

BC6H:仅支持RGB格式,解压后是R16G16B16,一般用于high dynamic range data(HDR)压缩。bpp为8,压缩比为1:4

BC7:与DXT5(BC3)相比,BC7能得到更好地压缩结果,但复杂度也更高,效率也更低。bpp为8,压缩比为1:4

 

手游上需在OpenGL ES上支持扩展GL_NV_texture_compression_s3tc或GL_EXT_texture_compression_s3tc

 

NVIDIA Tegra的GPU支持该标准

PVRTC(PowerVR Texture Compression

纹理贴图的宽高需为2的n次幂

对带alpha通道压缩效果不好,会出现通道损失严重的问题

 

RGB:GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG(bpp为4,压缩比为1:8) 、GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG(bpp为2,压缩比为1:16)

RGBA:GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG(bpp为4,压缩比为1:8)、GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG(bpp为2,压缩比为1:16)

 

需在OpenGL ES上支持扩展GL_IMG_texture_compression_pvrtc

PVRTexTool是PowerVR公司开发的一款贴图格式转换工具,支持GUI和命令行

ios texturetool:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/texturetool

 

Imagination的PowerVR(联发科部分android机,苹果手机)的GPU支持该标准

ATC(ATITC,ATI Texture Compression)

不透明纹理(bpp为4,压缩比为1:8):GL_ATC_RGB_AMD

半透明纹理(bpp为8,压缩比为1:4): GL_ATC_RGBA_EXPLICIT_ALPHA_AMD、GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD

 

需在OpenGL ES上支持扩展GL_ATI_texture_compression_atitc

 

高通的Adreno 320+的GPU支持该标准

ETC(Ericsson Texture Compression

基于PACKMAN算法改进而来,又称Improve PACKMAN

ETC压缩算法采用将图像中的chromatic(明亮度)和luminance(色度)分开存储的方式

 

支持RGB 3通道,不支持半透明,解压后为RGB888

分成若干4x4 block,每个block独立压缩

 

不透明纹理:bpp为4,压缩比为1:8

由于不支持透明纹理,对透明纹理处理方法有:① 直接使用未压缩的RGBA  ② 将Alpha值单独存入RGB的透明纹理中,然后用ETC来压缩

 

需在OpenGL ES上支持扩展GL_OES_compressed_ETC1_RGB8_texture

 

OpenGL ES 2.0将ETC作为基本的纹理压缩标准,所有现代移动GPU都支持该标准,所有Android设备均支持。

 

etc1tool:可用于将 PNG 图片编码为 ETC1 压缩标准格式,并将 ETC1 压缩图片解码回 PNG

ETC2

不透明纹理:bpp为4,压缩比为1:8

半透明纹理:bpp为8,压缩比为1:4

 

OpenGL ES 3.0引入,所有OpenGL 3.x类Android设备均支持。

 

etcpack:支持ETC1、ECT2、DXT1、DXT5

ASTC(Adaptive Scalable Texture Compression

自适应可伸缩纹理压缩

需在OpenGL ES上支持扩展GL_KHR_texture_compression_astc_ldr或GL_KHR_texture_compression_astc_hdr(部分es30、es31及以上、为Vulkan Level 1所必需)

ARM公司的Mali T600+、高通的Adreno 400+、NVIDIA的Tegra K1的GPU支持该标准(2016年之后的安卓手机基本支持这种压缩格式,Android正在从ETC2向ATSC转向)
苹果所有A8及以上处理器(iPhone6以后所有机型)

 

block size(2d)     	bpp			压缩比
4x4  			8			1 : 4
5x4  			6.4			1 : 5
5x5  			5.12			1 : 6.25
6x5  			4.27			1 : 7.494
6x6  			3.56			1 : 8.98876
8x5  			3.20			1 : 10
8x6  			2.67			1 : 11.985
10x5  			2.56			1 : 12.5
10x6  			2.13			1 : 15.02347
8x8			2.00			1 : 16
10x8			1.60			1 : 20
10x10			1.28			1 : 25
12x10			1.07			1 : 29.9
12x12			0.89			1 : 35.955

block size(3d)     	bpp			压缩比
3x3x3			4.74			6.751
4x3x3			3.56			8.98876
4x4x3			2.00			1 : 16
4x4x4			2.00			1 : 16
5x4x4			1.60			1 : 20
5x5x4			1.28			1 : 25
5x5x5			1.02			1 : 31.37
6x5x5			0.85			1 : 37.647
6x6x5			0.71			1 : 45.07
6x6x6			0.59			1 : 54.237

 

同等bpp下,ASTC比其他压缩格式质量更好。另外它可以通过block size去调整质量和内存的平衡,这是其它贴图压缩格式没有的。

 

无Alpha通道的贴图建议压缩格式为ASTC 8x8。如果贴图为法线贴图,建议压缩格式为ASTC 5x5。

有更高要求的贴图(比如面部、场景地面),可以设置压缩格式为ASTC 6x6,法线贴图为ASTC 4x4

 

有Alpha通道的贴图建议压缩格式为ASTC 5x5。有更高要求的贴图(比如特效、UI),可以设置压缩格式为ASTC 4x4

 

ASTC算法主要有2种:ARM-ASTC(Unity默认)和ISPC-ASTC(UE4默认)算法

ARM-ASTC的压缩参数比ISPC-ASTC多出很多,可以控制压缩过程的更多细节。

ARM-ASTC又分为ARM-ASTC-FAST、ARM-ASTC-MEDIUM

同一张纹理,同等block,一般情况下,ISPC-ASTC的速度相比ARM-ASTC-FAST要快

同一张纹理,同等block,一般情况下,ISPC-ASTC的质量相比ARM-ASTC-FAST要好,比ARM-ASTC-MEDIUM要差

ISPC-ASTC,仅仅支持4x4, 6x6, 8x8三种block大小

 

相关工具:ASTC Encodermali-texture-compression-tool

注1:Mali Texture Compression Tool可以显示压缩前后的差异,也可以用来生成各层级的mipmap

注2:高版本的Beyond Compare也可以可视化对比图片

 

Unity(ARM-ASTC)
① Unity优势在于它可以配置每一张贴图的block size
② Unity劣势在于它只提供了block size这一个参数,其余的底层参数对于每张纹理都一样。
最有效的优化就是把Normal贴图区别对待,以提高精度和性能

UE4(ISPC-ASTC)
① UE4优势在于它提供了配置文件,对所有贴图可以有统一的High-Level配置(Normal的block没法配置)
② UE4劣势在于它没法对于单张贴图提供精确的配置
③ UE4默认使用ISPC-ASTC,没有更多的底层参数进行控制压缩过程。所以想要控制该过程,可以选用ARM-ASTC

具体执行数据生成的代码在TextureFormatASTC.cpp 与 TextureFormatIntelISPCTexComp.cpp 源文件中。

对编码器的调用过程相关的代码在 TextureDerivedData.cpp 源文件中。

 

 

注:在UE4的4.18版本下,可以打ETC1a的Androd包。ETC1a下,ETC1用于非透明纹理,ETC2用于透明纹理。若设备不支持ETC2,透明纹理将在运行时解压到RGBA中。此格式可在ETC1和ETC2设备上使用,但相较于ETC2,非透明纹理的ETC1质量可能偏低。

 

注1:Input Color Format中@+$,@和$是两组数据,通常来说,@中的通道频率是相似的,才能作为一组。比如:RGB+A,RGB是一组,A单独是一组

注2:右边蓝色小块是不同bbp(对应不同的block大小)的ASTC压缩

 

不同分辨率贴图使用DXT1和DXT5压缩的大小情况:

分辨率

Mip数

DXT1

DXT5

16x16

5个mip

312字节

496字节

32x32

6个mip

824字节

1.48kb(1,520字节)

64x64

7个mip

2.80kb(2,872字节)

5.48kb(5,616字节)

128x128

8个mip

10.8kb(11,064字节)

21.4kb(22,000字节)

256x256

9个mip

42.8kb(43,832字节)

85.4kb(87,536字节)

512x512

10个mip

170kb(174,904字节)

341kb(349,680字节)

1024x1024

11个mip

682kb(699,192字节)

1.33MB(1,398,256字节)

2048x2048

12个mip

2.66MB(2,796,344字节)

5.33MB(5,592,560字节)

4096x4096

13个mip

10.6MB(11,184,952字节)

21.3MB(22,369,776字节)

8192x8192

14个mip

42.6MB(44,739,384字节)

85.3MB(89,478,640字节)

 

压缩的像素格式

EPixelFormat(UE4) D3DFORMAT(D3D9) DXGI_FORMAT(D3D10、11、12) OpenGL Vulkan Metal
PF_DXT1 D3DFMT_DXT1 DXGI_FORMAT_BC1_TYPELESS GL_COMPRESSED_RGBA_S3TC_DXT1_EXT VK_FORMAT_BC1_RGB_UNORM_BLOCK BC1_RGBA
PF_DXT3 D3DFMT_DXT3 DXGI_FORMAT_BC2_TYPELESS GL_COMPRESSED_RGBA_S3TC_DXT3_EXT VK_FORMAT_BC2_UNORM_BLOCK BC2_RGBA
PF_DXT5 D3DFMT_DXT5 DXGI_FORMAT_BC3_TYPELESS GL_COMPRESSED_RGBA_S3TC_DXT5_EXT VK_FORMAT_BC3_UNORM_BLOCK BC3_RGBA
PF_BC4   DXGI_FORMAT_BC4_UNORM GL_COMPRESSED_RED_RGTC1 VK_FORMAT_BC4_UNORM_BLOCK BC4_RUnorm
PF_BC5   DXGI_FORMAT_BC5_UNORM GL_COMPRESSED_RG_RGTC2 VK_FORMAT_BC5_UNORM_BLOCK BC5_RGUnorm
PF_BC6H   DXGI_FORMAT_BC6H_UF16   VK_FORMAT_BC6H_UFLOAT_BLOCK BC6H_RGBUfloat
PF_BC7   DXGI_FORMAT_BC7_TYPELESS   VK_FORMAT_BC7_UNORM_BLOCK BC7_RGBAUnorm
PF_PVRTC2         PVRTC_RGBA_2BPP
PF_PVRTC4         PVRTC_RGBA_4BPP
PF_ATC_RGB          
PF_ATC_RGBA_E          
PF_ATC_RGBA_I          
PF_ETC1          
PF_ETC2_RGB     GL_COMPRESSED_RGB8_ETC2 VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK ETC2_RGB8
PF_ETC2_RGBA     GL_COMPRESSED_RGBA8_ETC2_EAC VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK EAC_RGBA8
PF_ETC2_R11_EAC     GL_COMPRESSED_R11_EAC VK_FORMAT_EAC_R11_UNORM_BLOCK EAC_R11Unorm
PF_ETC2_RG11_EAC     GL_COMPRESSED_RG11_EAC VK_FORMAT_EAC_R11G11_UNORM_BLOCK EAC_RG11Unorm
PF_ASTC_4x4     GL_COMPRESSED_RGBA_ASTC_4x4_KHR VK_FORMAT_ASTC_4x4_UNORM_BLOCK ASTC_4x4_LDR
PF_ASTC_6x6     GL_COMPRESSED_RGBA_ASTC_6x6_KHR VK_FORMAT_ASTC_6x6_UNORM_BLOCK ASTC_6x6_LDR
PF_ASTC_8x8     GL_COMPRESSED_RGBA_ASTC_8x8_KHR VK_FORMAT_ASTC_8x8_UNORM_BLOCK ASTC_8x8_LDR
PF_ASTC_10x10     GL_COMPRESSED_RGBA_ASTC_10x10_KHR VK_FORMAT_ASTC_10x10_UNORM_BLOCK ASTC_10x10_LDR
PF_ASTC_12x12     GL_COMPRESSED_RGBA_ASTC_12x12_KHR VK_FORMAT_ASTC_12x12_UNORM_BLOCK ASTC_12x12_LDR

 

UE4相关补充说明

图片长宽

UE4导入图片时,要求图片的长宽必须为2的倍数。例如,在导入长宽为4095x4095的tga图片时,会报如下错误:

LogAssetTools: Warning: Failed to import 'D:\svn\T_bark_a_albedo_4095.TGA'. Failed to create asset '/Game/T_bark_a_albedo_4095'.
Please see Output Log for details.
LogFactory: FactoryCreateFile: Texture with ReimportTextureFactory (0 0 D:\svn\T_bark_a_albedo3_4095.tga)
Error: Cannot import texture with non-power of two dimensions
Error: Cannot import texture with non-power of two dimensions
Error: Texture import failed

 

当图片的长宽不为4的倍数时,不能进行纹理压缩的

 

当图片的长宽不为2的n次幂(NPOT,Non-Power Of Two ),不允许生成mipmap,也无法进行Texture Streaming

 

扩展阅读:OpenGL支持非二次幂纹理的底层原理是什么? 

 

UE4 Android包体(ASTC vs ETC2)

ue4 cook ASTC ETC2
apk包体 1.72GB 1.62GB
main.obb 1.58GB 1.49GB
pak 1.49GB 1.40GB
pak解压后 2.42GB 2.65GB

pak默认使用zlib压缩,相对lz4有比较好的压缩率(pak会小100MB)。然而lz4在性能上更优一点,数据如下:

测试手机 压缩算法 帧率 卡顿率 CPU使用率 内存峰值
iPhone 6s Plus zlib 51.6 0.85 54.7% 1221 MB
lz4 52.8 0.65 54.9% 1210 MB
iPhone 7 zlib 53.5 1.28 47.7% 1214 MB
lz4 54.9 0.84 47.2% 1218 MB

注:若想获得更好的压缩率和性能,可以使用Oodle,更多信息可参考:Zlib/Oodle/ZSTD 压缩算法性能对比

 

UE4四指呼出的控制台命令窗口上可以查看当前手机设备支持哪些纹理格式:

 

贴图cook成ASTC压缩规则

Compression Quality(Name) Compression Quality(Index) ASTC
Lowest 0 12x12
Low 1 10x10
Medium 2 8x8
High 3 6x6
Highest 4 4x4

具体选择哪个压缩方式,遵循范围从小到大的规则

① 当贴图的Compress Quality设置不为Default时,使用当前数值进行压缩打包。否则,向下继续查询。

具体详见:纹理压缩设置

 

②  uam在*DeviceProfiles.ini的TextureLODGroups结构中增加了ASTCSizeExpected字段来配置整个TextureGroup的压缩质量。当配置了该字段,使用当前数值进行压缩打包。否则,向下继续查询。

[Android DeviceProfile]
+TextureLODGroups=(Group=TEXTUREGROUP_WorldDiffuseAndEmissiveOrOpacity,ASTCSizeExpected=8,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=1,NumStreamedMips=-1, NoStreamMipCount=1 ,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=2048,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096, MinMagFilter="Aniso",MipFilter="Point", ArrayLODBiasValues=((ArrayBiasValue=(0,0,0)),(ArrayBiasValue=(0,0,0)),(ArrayBiasValue=(0,0,0)),(ArrayBiasValue=(1,1,1))))
+TextureLODGroups=(Group=TEXTUREGROUP_WorldNormalAndRoughness,ASTCSizeExpected=8,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=1,NumStreamedMips=-1, NoStreamMipCount=1 ,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=2048,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096, MinMagFilter="Aniso",MipFilter="Point", ArrayLODBiasValues=((ArrayBiasValue=(0,0,0)),(ArrayBiasValue=(0,0,0)),(ArrayBiasValue=(1,1,1)),(ArrayBiasValue=(1,1,2))))
+TextureLODGroups=(Group=TEXTUREGROUP_WorldMetallicAndAO,ASTCSizeExpected=8,LODBias=0,LODBias_Smaller=-1,LODBias_Smallest=1,NumStreamedMips=-1, NoStreamMipCount=1 ,MipGenSettings=TMGS_SimpleAverage,MinLODSize=1,MaxLODSize=2048,MaxLODSize_Smaller=-1,MaxLODSize_Smallest=-1,OptionalLODBias=0,OptionalMaxLODSize=4096, MinMagFilter="Aniso",MipFilter="Point", ArrayLODBiasValues=((ArrayBiasValue=(0,0,0)),(ArrayBiasValue=(0,0,0)),(ArrayBiasValue=(1,1,1)),(ArrayBiasValue=(1,1,4))))

注:ASTCSizeExpected为4表示4x4,6表示6x6,8表示8x8,10表示10x10,12表示12x12

 

③  最后的全局设置

该信息保存在DefaultEngine.ini以下标签中:

[/Script/UnrealEd.CookerSettings]
DefaultASTCQualityBySize=3

注:0表示12x12,1表示10x10,2表示8x8,3表示6x6,4表示4x4

 

参考

ASTC纹理压缩格式详解

各种移动GPU压缩纹理的使用方法

UE4,纹理压缩(Texture compression)

ETC2 textures(OpenGL ES SDK for Android)

ASTC textures(OpenGL ES SDK for Android)

UE4纹理压缩设置

UE4移动平台的纹理

UE4Android纹理格式

ASTC(huailiang)

各种移动GPU压缩纹理的使用方法(huailiang)

posted on 2021-09-16 00:53  可可西  阅读(5628)  评论(0编辑  收藏  举报

导航