像素格式与纹理压缩
在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(wiki,chs)
浮点位数 | 符号位 | 尾数位 | 指数位 | 最大正数 | 最小正数 | 十进制精度 |
---|---|---|---|---|---|---|
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即可)
PNSR(Peak 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 |
纹理贴图压缩算法
压缩算法 | 说明 |
最早的纹理压缩算法,仅支持单通道灰度纹理(每个像素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 |
需在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转向)
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 Encoder、mali-texture-compression-tool 注1:Mali Texture Compression Tool可以显示压缩前后的差异,也可以用来生成各层级的mipmap 注2:高版本的Beyond Compare也可以可视化对比图片
Unity(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
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
参考
ETC2 textures(OpenGL ES SDK for Android)