虚拟纹理
2026/7/26大约 4 分钟
虚拟纹理 (Virtual Texturing) - 按需加载的纹理流式技术
引言:核心思想
游戏的纹理总量可达数十上百 GB,远超显存。虚拟纹理借鉴虚拟内存的思想:
把一张(或全部)巨大纹理在逻辑上视为完整的,但物理上只把当前帧真正采样到的小块(page/tile)驻留显存,其余留在磁盘/内存按需换入。显存占用与纹理总量解耦。
类比操作系统的虚拟内存:逻辑地址空间很大,物理内存有限,靠页表 + 缺页换入。
一、关键结构
| 结构 | 作用 |
|---|---|
| 页(Page / Tile) | 把大纹理切成固定小块(如 128×128),流式与驻留的最小单位 |
| 页表(Page Table / Indirection Texture) | 记录"逻辑页 → 物理页缓存中的位置"的映射,本身是一张小的间接纹理 |
| 物理纹理(Physical Texture) | 显存中一块固定大小的图集,存放当前驻留的页 |
采样时:先查页表得到物理位置,再到物理纹理取值 —— 一次间接寻址。
二、按需流式与反馈机制
关键问题:怎么知道这一帧需要哪些页?
- 反馈(Feedback):渲染时(或专门的 prepass)记录每个像素想采样的逻辑页与 mip 级别,写入一张低分辨率的反馈缓冲。
- 流式加载:分析反馈,把缺失且需要的页从磁盘异步加载、解压,写入物理纹理图集,更新页表。
- 缺页处理:新页还没到位时,用更粗的 mip(父页)临时顶替,避免闪烁 —— 类似 mip 回退。
三、两种典型形态
| 形态 | 说明 |
|---|---|
| 流式虚拟纹理(Streaming VT) | 把预先制作的巨大纹理集虚拟化、按需流式(如地形大图集、UE 的 Streaming Virtual Texture) |
| 运行时虚拟纹理(Runtime VT) | 运行时把多层材质合成/烘焙进虚拟纹理并缓存,避免每帧重复合成(如地形多层混合、贴花累积) |
四、优点与代价
优点
- 显存占用与纹理总量解耦:可用远超显存的纹理资产。
- 恒定的物理纹理开销:物理图集固定大小,内存可预算。
- 减少重复着色(Runtime VT):材质合成结果缓存复用。
- 适合超大地形、开放世界的海量贴图。
代价
- 采样多一次间接寻址(查页表),有开销。
- 反馈 + 流式系统复杂:需要反馈分析、异步加载、页表管理、缺页处理。
- 缺页瑕疵:页未及时加载会短暂显示低清(mip 回退)。
- 各向异性/过滤跨页:页边界的过滤需特殊处理(边界扩边 padding)。
五、与虚拟几何、纹理压缩的关系
| 技术 | 虚拟化的对象 | 共同思想 |
|---|---|---|
| 虚拟纹理 | 贴图的页/mip | 只驻留当前可见、所需分辨率的部分 |
| 虚拟几何 | 网格的 LOD 簇 | 同上(几何版) |
两者常配合:把"资产总量"与"运行时驻留量"彻底解耦。虚拟纹理里的页通常仍用 块压缩格式(BC/ASTC) 存储与驻留,进一步省带宽。
六、总结
虚拟纹理借鉴虚拟内存思想,将巨大的逻辑纹理切分为固定大小的页,通过页表间接寻址,配合反馈驱动流式加载,实现显存占用与纹理总量的解耦。核心技术栈包括页表(间接纹理)、物理纹理图集、反馈缓冲和缺页回退机制。两种典型形态——流式虚拟纹理(Streaming VT)和运行时虚拟纹理(Runtime VT)——分别适用于预置大图集的按需流式与运行时材质合成的缓存复用。虚拟纹理常与虚拟几何、块压缩纹理配合,构成完整的高效资产流式方案。
附:核心概念速查
| 概念 | 说明 |
|---|---|
| 虚拟纹理 | 逻辑纹理完整、物理只驻留可见页,显存与总量解耦 |
| 页 / Tile | 大纹理切分的固定小块,流式最小单位 |
| 页表 / 间接纹理 | 逻辑页 → 物理位置的映射 |
| 物理纹理 | 显存中固定大小的页缓存图集 |
| 反馈 Feedback | 记录本帧需要哪些页/mip,驱动流式 |
| 缺页回退 | 页未就绪时用更粗 mip 顶替 |
| Streaming VT / Runtime VT | 流式预制大图 / 运行时合成缓存 |
