ASTC(Adaptive Scalable Texture Compression)是Arm与AMD联合开发的高级纹理压缩技术,已成为Khronos组织OpenGL ES和Vulkan API的标准扩展。这项技术的核心价值在于其突破性的自适应特性——通过动态调整压缩策略,在保持固定128比特/块输出的同时,实现0.89到8 bits/texel(bpt)的灵活比特率。
与传统图像压缩不同,ASTC采用基于块的压缩架构,这是为了满足实时图形渲染的两个关键需求:
ASTC支持从4x4到12x12的多种块尺寸(包括非方形块),通过公式比特率=128/(宽×高)计算实际压缩率。例如:
实际项目中,6x6(3.56bpt)到8x8(2bpt)是最常用的平衡点,能在画质和性能间取得较好折衷
ASTC采用梯度插值法存储颜色信息,每个压缩块包含:
解压时通过线性插值计算实际颜色:
math复制Color_{texel} = Color_{start} × (1-weight) + Color_{end} × weight
对于复杂色块,ASTC引入分区机制(最多4个分区),每个分区使用独立的颜色梯度。通过算法生成的固定分区模式(见图2-5),只需存储分区索引即可还原复杂色彩分布。

(图示:8x8块的分区模式,不同颜色代表不同分区)
常规二进制编码在存储量化值时存在严重浪费。例如存储5级量化值:
ASTC采用创新的BISE(Bounded Integer Sequence Encoding)方案:
具体实现公式:
code复制值 = (trit × 2^N) + 二进制部分
每个块可独立选择:
这种动态分配使ASTC能在128比特内最大化信息密度。实测数据显示:
从Arm官方GitHub获取最新编译器:
bash复制git clone https://github.com/ARM-software/astc-encoder
cd astc-encoder
mkdir build && cd build
cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release ..
make -j8
基本压缩命令示例:
bash复制# LDR线性空间压缩(6x6块,中等质量)
./astcenc -cl input.png output.astc 6x6 -medium
# sRGB空间压缩(5x5块,高质量)
./astcenc -cs ui_texture.png ui_comp.astc 5x5 -thorough
# HDR纹理压缩(4x4块,最高质量)
./astcenc -cH environment.exr env_astc.astc 4x4 -exhaustive
| 预设选项 | 压缩时间 | 相对质量 | 适用场景 |
|---|---|---|---|
| -fast | 1x | 85% | 快速迭代 |
| -medium | 3x | 95% | 常规使用 |
| -thorough | 8x | 98% | 发布版本 |
| -exhaustive | 20x | 99.5% | 关键资产 |
法线贴图需要启用专用模式:
bash复制./astcenc -cl -normal normal_map.png nrm_comp.astc 5x5 -thorough
着色器中重建Z分量的GLSL代码:
glsl复制vec3 normal;
normal.xy = texture(normalMap, uv).ga * 2.0 - 1.0;
normal.z = sqrt(1.0 - dot(normal.xy, normal.xy));
csharp复制// 运行时检测支持情况
bool astcSupported = SystemInfo.SupportsTextureFormat(TextureFormat.ASTC_6x6);
ini复制[Android]
TextureFormatASTC=True
纹理压缩设置:
材质中正确处理sRGB:
hlsl复制Texture2D ColorTexture;
SamplerState ColorSampler {
Filter = MIN_MAG_MIP_LINEAR;
AddressU = Wrap;
AddressV = Wrap;
};
float4 SampleColor(float2 UV) {
return ColorTexture.Sample(ColorSampler, UV);
}
| 纹理类型 | 推荐块大小 | 比特率 | 适用场景 |
|---|---|---|---|
| UI/文字 | 4x4 | 8bpt | 高清晰度 |
| 角色皮肤 | 5x5 | 5.12bpt | 中距离 |
| 环境贴图 | 6x6 | 3.56bpt | 动态光照 |
| 远景地形 | 8x8 | 2bpt | 背景物体 |
Mipmap生成策略:
python复制# 伪代码示例
for mip in texture.mipmaps:
if mip.level > 3:
mip.compress(ASTC_8x8)
else:
mip.compress(ASTC_6x6)
HDR处理方案对比:
| 方案 | 动态范围 | 带宽 | 适用场景 |
|---|---|---|---|
| 原生ASTC HDR | 超高 | 高 | 天空盒 |
| RGBM编码 | 中高 | 中 | 常规HDR |
| BC6H | 超高 | 高 | PC平台 |
code复制原始内存 = 宽度 × 高度 × 4(RGBA) × 2(if HDR)
ASTC内存 = ceil(宽度/块宽) × ceil(高度/块高) × 16字节
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 块状伪影 | 比特率过低 | 改用更小块尺寸 |
| 颜色带 | 权重位不足 | 使用-thorough模式 |
| Alpha闪烁 | 未用双平面 | 添加-dual_plane参数 |
| 法线错误 | 未启用-normal | 重新压缩并指定模式 |
Adreno Profiler:
RenderDoc:
自定义着色器调试:
glsl复制// 检查压缩误差
vec4 original = texture(origTex, uv);
vec4 astc = texture(astcTex, uv);
float error = length(original.rgb - astc.rgb);
FragColor = vec4(error.xxx * 10.0, 1.0);
在移动设备实测中,ASTC相比ETC2可降低30%的纹理带宽,同时减少15%的GPU功耗。某商业游戏项目的数据显示,在采用6x6压缩方案后:
这种级别的优化效果,正是ASTC成为移动图形开发事实标准的原因所在。掌握其技术细节和优化技巧,是现代图形程序员必备的核心能力之一。