概念页
纹理压缩
Texture Compression
固定码率纹理压缩由 GPU 实时解码:减少显存占用、增大有效缓存、降低访问带宽,也能在同样内存下用更大纹理。BC (DXTC) 系列是桌面标准,ETC/EAC、PVRTC、ASTC 用于移动平台。它们都是有损的,压缩慢、解压快;法线贴图需要专门处理。
为什么用固定码率块压缩
- 例:未压缩 3 字节/纹素、512² 纹理占 768 kB;6:1 压缩时 1024² 纹理只占 512 kB。
- JPEG、PNG 在硬件中解码代价高。S3TC(DirectX 叫 DXTC,DX10 起叫 BC)压缩结果大小固定、各块独立编码、无共享查找表,解码简单快速。
- 所有 BC 格式都对 4×4 纹素块编码:每个量存两个参考值,每个纹素存一个插值因子,在两参考值之间的线上取值。
BC 格式
| 名称 | 每块 / 每纹素 | 参考值 | 索引 | Alpha | 说明 |
|---|---|---|---|---|---|
| BC1/DXT1 | 8 B / 4 bpt | RGB565×2 | 2 bpt | – | 一条颜色线,相对 24 位 RGB 为 6:1 |
| BC2/DXT3 | 16 B / 8 bpt | 同 BC1 | 2 bpt | 4 bpt 原始值 | |
| BC3/DXT5 | 16 B / 8 bpt | 同 BC1 | 2 bpt | 两个 8 位参考值 + 3 bpt 插值 | |
| BC4 | 8 B / 4 bpt | R8×2 | 3 bpt | – | 单通道 |
| BC5 | 16 B / 8 bpt | RG88×2 | 2×3 bpt | – | 两个 BC4 |
| BC6H | 16 B / 8 bpt | 见说明 | 见说明 | – | HDR,每块 1–2 条线,可选分区,参考色可差分编码 |
| BC7 | 16 B / 8 bpt | 见说明 | 见说明 | 可选 | 高质量 LDR RGB/RGBA,1–3 条线 |
- BC1 的 2 位索引选择两个参考色或两个中间值;另一种 DXT1 模式保留一个值表示透明像素。
- OpenGL 中 BC6H、BC7 叫 BPTC FLOAT 和 BPTC。也可用于立方体和体积纹理。
- 缺点:有损;BC1–BC5 一个块里的颜色都在 RGB 空间的一条直线上,例如红、绿、蓝无法同时出现在一个块里。BC6H、BC7 支持多条线,质量更高。
移动平台格式
- ETC(OpenGL ES):4×4 块 64 位,每 2×4 或 4×2 子块存基础色,从小型静态表中选四个常量,每纹素选一个加到亮度上;质量与 DXTC 相当。
- ETC2(OpenGL ES 3.0):利用"无用位组合"(如差分编码溢出的情况)增加新模式:两种四色模式和一种 RGB 平面模式(处理平滑过渡)。EAC 压缩单通道,4 bpt,可与 ETC2 组合,两个 EAC 通道可压法线。ETC1/ETC2/EAC 属于 OpenGL 4.0 core、OpenGL ES 3.0、Vulkan 和 Metal。
- PVRTC:PowerVR 硬件(主要是 iPhone、iPad),2 或 4 bpt,用相邻块插值出两个低频信号,每纹素 1–2 位在两者间插值。
- ASTC:n×m 块压成 128 位,块大小 4×4 到 12×12,码率 0.89–8 bpt;每块可选线数与端点编码,支持 1–4 通道、LDR 和 HDR;属于 OpenGL ES 3.2 及以后。
法线贴图压缩
- 为 RGB 设计的格式通常不适合法线。利用单位长度且(切线空间中)z 为正,只存 x、y,运行时 ;多数 GPU 不原生支持三通道纹理,这样也不浪费通道。
- 再用 BC5/3Dc 存 x、y:每块参考值构成 xy 平面上的包围盒,3 位插值因子把它分成 8×8 的候选法线网格。也可用两个 EAC 通道。
- 不支持 BC5/EAC 时的常见退路:DXT5 的 green 和 alpha 通道(精度最高)存两个分量。
压缩不对称与质量技巧
- 花几秒甚至几分钟压缩可显著提高质量,通常离线完成;也可只花几毫秒近实时压缩,例如每隔一两秒重新生成的天空盒。解压由固定功能硬件完成,极快——数据压缩不对称。
- Kaplanyan 的建议:颜色和法线贴图都以每分量 16 位制作;颜色纹理做直方图重归一化后压缩,在着色器里用每纹理的缩放和偏移还原,可减少色带;若 75% 像素高于 116/255 就用线性空间存,否则用 sRGB;BC5 对 x、y 独立压缩不一定找到最佳法线,建议用角度误差 作为度量。
- 在 YCoCg 空间压缩:正变换和逆变换(几次加法)都是线性的,硬件可直接在 YCoCg 空间过滤;有损版本之外还有用移位实现的可逆版本(Co、Cg 需多 1 位)。Van Waveren 和 Castaño 用它实现 CPU/GPU 上的快速 DXT5 压缩:Y 放 alpha 通道(精度最高),Co、Cg 放前两个通道。CPU 生成的纹理最好在 CPU 压缩,GPU 渲染出的纹理最好在 GPU 压缩。
- 色度通常变化缓慢,可在 2×2 像素上平均以省 50%;也有转 HSV 后把色相和饱和度各降采样 4 倍的做法。
- 研究表明,模型上叠加多张纹理并使用复杂着色模型时,纹理质量常可降低而察觉不到差异。
GEA 的视角:S3TC/BCn 与特性级别(卷 II 11.3.14.4、11.4.5.3)
- 磁盘上的纹理可以是任何引擎能读的格式(TGA、PNG、BMP、TIFF 等);内存中通常是二维(带跨距)像素数组,格式如 RGB888、RGBA8888、RGB565、RGBA5551(卷 II 11.3.14.4)。
- DirectX 支持 S3 纹理压缩 (S3TC) 家族,也叫 DXTn 或 BCn(Block Compression)。基本思路:把纹理分成 4×4 像素块,每块用一个小调色板存颜色。
- 订正:严格说 S3TC 只指 S3 Graphics 1998 年的 DXT1–DXT5,对应 BC1–BC3;BC4/BC5(源自 ATI 的 3Dc)和 BC6H/BC7(D3D11 新增)不属于 S3TC,只是同属 BCn 块压缩家族;BC6H、BC7 也不再是"小调色板"那么简单,而是多分区、多模式的端点插值(MS Learn "Texture Block Compression in Direct3D 11";Wikipedia "S3 Texture Compression")。
- 压缩纹理反而更快:4×4 相邻像素存在一个 64 位或 128 位机器字里,访存模式更利于缓存,而且缓存能装下更多纹理。代价是压缩伪影,通常不明显,但有些场合必须用未压缩纹理。
- 按特性级别的支持(卷 II 11.4.5.3):BC1–BC3 所有特性级别(DirectX 9 及以上)都支持;BC4、BC5 从 10_0 起;BC6H、BC7 从 11_0 起。特性级别见 图形 API 设备、管线状态与资源。
这些与本页「BC 格式」中 RTR4 的内容一致,GEA 的介绍更简略,没有涉及移动端格式和法线贴图压缩。
出处
- realtime_rendering_4ed.pdf 第 6 章 Texturing
- Game_Engine_Architecture_4th_Edtion_Volume_2_-_Jason_Gregory.pdf
- Jason Gregory《Game Engine Architecture》第 4 版(2026)卷 II 第 11 章 11.3.14.4、11.4.5.3 节
相关页面
图形学纹理过滤与 MipmapTexture Filtering & Mipmap纹理在屏幕上被放大时需要插值,被缩小时一个像素覆盖许多纹素,必须预先滤波才能避免混叠。放大用最近邻、双线性或双三次;缩小的主流方案是 mipmap + 三线性插值,斜视角下用各向异性过滤减少过度模糊。注意:过滤纹理值只在输入与着色结果线性相关时等价于过滤最终颜色。图形学纹理映射管线Texturing Pipeline纹理通过修改着色方程中使用的值(颜色、粗糙度、法线等)来高效表现表面材质的变化。通用纹理管线是:空间位置 → 投影函数得到纹理坐标 → 对应函数变换到纹理空间 → 取值 → 值变换 → 用于着色。本页还整理纹理坐标约定、纹理表示方式、程序纹理、纹理动画、材质贴图、alpha 贴图和纹理光源。图形学法线贴图与凹凸贴图Normal & Bump Mapping凹凸贴图是一类在像素着色中修改着色法线来表现中尺度细节的技术:几何法线不变,只改变光照计算使用的法线,从而在不增加几何的情况下显得更立体。最常用的形式是切线空间法线贴图,需要每顶点的切线框架;法线贴图的过滤是难点。图形学大场景渲染与虚拟纹理Large Scenes & Virtual Texturing当场景数据远大于内存(如主机只有 8 GB,而游戏世界有数百 GB)时,需要按需把数据流送进内存。本页讲三类技术:虚拟纹理(把巨大的 mipmap 链切成瓦片,只让可见瓦片驻留在显存,通过页表/间接纹理寻址)、纹理转码(磁盘上用高压缩比的可变码率格式,加载时转成 GPU 块压缩格式),以及按平面瓦片组织资产的通用流送。这些方法几乎总是与剔除和 LOD 配合使用;地形部分见 地形渲染。图形学顶点压缩与精度Vertex Compression & Precision网格数据像纹理一样可以压缩:传输用的整体压缩(Draco 等)一次性解码,渲染用的定长压缩让顶点着色器在 GPU 上逐顶点解码,从而降低内存、带宽并改善缓存。另一面是精度问题:大世界中单一坐标系会让远离原点的物体抖动,需要相对相机的变换或分段原点。图形学GPU 架构案例GPU Architecture Case StudiesRTR4 第 23.10 节剖析三种架构:面向移动设备、以能效为先的 sort-middle 分块架构 ARM Mali G71 Bifrost;NVIDIA Pascal(GTX 1080)的 SM/TPC/GPC 层级与介于 sort-middle 和 sort-last fragment 之间的 tiled caching;AMD GCN Vega 的计算单元、异步计算引擎、DSBR 与 HBCC。硬件厂商通过对尚未制造的 GPU 做大量参数化仿真来决定 MP 数量、缓存、光栅引擎、ROP 数等——各种单元数量的原因归根结底是"这样效果最好"。图形学硬件深度剔除与纹理单元Hardware Depth Culling & Texture UnitsGPU 的深度管线先在瓦片级用 HiZ 单元做 zmax/zmin 粗剔除,再逐采样做 early-z 深度测试以免执行被遮挡片元的像素着色器,必要时退回到着色后的 late depth test;深度缓冲同样有瓦片压缩与快速清除。纹理单元以固定功能硬件完成寻址、过滤、钳位与解压(比软件快可达 40 倍),按 quad 有限差分求导数以选择 LOD,并依靠瓦片化/Morton 交织存储和纹理缓存提高局部性。图形学像素与帧缓冲优化Pixel & Framebuffer Optimization需要着色的像素通常远多于顶点,所以像素处理优化往往最划算。核心手段:保证占用率以隐藏纹理延迟、按距离切换着色器 LOD、利用 early-z 并通过从前往后排序或 z-prepass 减少过度绘制、缩小帧缓冲每像素存储(色度子采样、YCoCg 棋盘),以及只在需要时开启混合、避免 GPU 回读。几何与光栅化阶段的常用优化也一并列出。图形学预计算光照与光照贴图Precomputed Lighting & Light Maps烘焙 (baking) 是把辐射度或路径追踪等离线 GI 结果预先算好存起来,运行时直接查询。静态几何参与预计算并完整交互,动态物体只作接收者。数据可以是辐照度,也可以带方向(SH、H 基、AHD、球面高斯、环境立方体等),存储在光照贴图、顶点或体积/探针中,各有接缝、漏光、内存等取舍(RTR4 11.5.1、11.5.2、11.5.4 节)。图形学局部反射探针Localized Reflection Probes镜面全局光照需要高角分辨率但只关心反射方向附近的小立体角。实时中最流行的方案是在场景中稀疏放置局部环境贴图(反射探针),配合反射代理体做视差校正;它实现简单、快、美术可控,但有拉伸和漏光问题。另有体素锥追踪和平面反射等替代方案(RTR4 11.6–11.6.4 节)。游戏开发 · UE5烘焙、打包与 Zen 加载器Cooking, Packaging & Zen Loader打包是一组构建操作:编译 (Build) → 烘焙 (Cook,把资产转成目标平台格式) → 暂存 (Stage) → 打包 (Package) → 可选的部署 (Deploy)。UE5 的运行时加载器 Zen Loader 会在暂存阶段离线算好包与对象的依赖图,并把数据装进 .utoc/.ucas 容器(IoStore),由 I/O 分发器以很低的 CPU 开销定位数据块;.pak 只用于不常访问的零散文件。图形学图形 API 设备、管线状态与资源Graphics API Devices, Pipeline State & Resources所有图形 API(OpenGL、DirectX、Vulkan、Metal)都围绕同一组概念:代表 GPU 的设备、描述各阶段配置的管线状态、承载数据的资源及其视图。GEA 把 API 分成高层(OpenGL、D3D11 及更早)和底层(D3D12、Vulkan、Metal、PlayStation 的 Gnm),并介绍 D3D11 的特性级别、设备上下文与延迟上下文、D3D12 的命令列表、PSO 和根签名。本页按 GEA 的整理讲这些跨 API 的共同概念,不是任何一个 API 的教程。