块压缩格式(如BC1)的MipMap生成及小尺寸层级处理疑问
针对BC1块压缩格式的Mip层级生成方案
首先先修正原图128×64的常规Mip层级编号错误,完整层级如下:
Mip 0: 128 x 64 Mip 1: 64 x 32 Mip 2: 32 x 16 Mip 3: 16 x 8 Mip 4: 8 x 4 Mip 5: 4 x 2 Mip 6: 2 x 1 Mip 7: 1 x 1
针对BC1这类要求尺寸为4的倍数的块压缩格式,正确的Mip层级生成与处理方式如下:
1. 需完整生成全链路Mip层级
不能在4×4层级停止,必须生成到1×1的层级。这是因为硬件在纹理采样的LOD过渡过程中依赖完整的Mip链,DirectX规范对此有明确说明:
采样硬件使用虚拟尺寸;采样纹理时会忽略内存填充。对于小于4×4的MipMap层级,2×2的映射仅会使用前4个texel,1×1的块仅会使用第一个texel。但目前没有API结构可暴露包含内存填充的物理尺寸。
2. 小于4×4层级的填充规则
对于尺寸不足4×4的Mip层级,需先填充至4×4的虚拟尺寸再进行块压缩,填充逻辑遵循边缘重复原则:
- 若维度横向不足4,重复最右侧的texel填充至4列;纵向不足4则重复最底部的texel填充至4行。
- 比如Mip5(4×2):将第2行的内容重复填充到第3、4行,得到4×4的虚拟块;
- 比如Mip6(2×1):横向将第2列重复填充到3、4列,纵向将第1行重复填充到2、3、4行;
- 比如Mip7(1×1):用唯一的texel值填充整个4×4块。
- 这种填充方式能保证LOD采样过渡平滑,契合硬件默认的纹理Clamp寻址逻辑,避免出现颜色断层。
3. 压缩与采样的实际逻辑
块压缩基于填充后的4×4块编码,但硬件采样时会严格按照该Mip层级的虚拟尺寸读取有效区域,填充的冗余部分会被直接忽略,不会影响最终采样结果。
内容的提问来源于stack exchange,提问作者Zebrafish
相关产品推荐
相关产品推荐

