基于 Unity Built-in Render Pipeline 的虚拟阴影贴图系统,通过虚拟纹理技术实现高效的动态阴影流式加载。
- VirtualShadowMaps — 挂载到平行光,管理虚拟纹理页表、Shadow Atlas 和阴影渲染
- VirtualShadowCamera — 挂载到相机,基于视锥体进行页面请求和 LOD 管理
- VirtualShadowVolume — 定义阴影覆盖区域,收集场景中的阴影投射物体
- VirtualShadowDebug — 提供分屏对比和调试可视化功能
- 虚拟纹理页表系统,支持 8 级 Mipmap LOD
- 基于距离和视锥体的动态页面请求算法
- LRU 缓存管理,最大化 tile 复用率
- 支持预烘焙静态阴影和运行时动态渲染两种模式
- PCSS 软阴影过滤(26 点 Poisson 采样)
- 分帧异步加载,避免单帧卡顿
页面请求阶段:
VirtualShadowCamera.UpdateRequest → 距离估算 → 视锥体剔除 → 视线角度过滤
→ 生成请求队列 → 更新 IndirectionTexture
阴影渲染阶段:
预烘焙模式: 从磁盘加载 EXR → 复制到 Shadow Atlas
运行时模式: VirtualShadowMapBaker → 渲染深度 → 复制到 Shadow Atlas
阴影采样阶段:
世界坐标 → IndirectionTexture 查询 → 获取 Tile 信息
→ 变换到 Shadow Atlas 坐标 → PCF/PCSS 采样 → 阴影值
- IndirectionTexture (页表):256×256 ARGBHalf 纹理,存储 (TileX, TileY, MipLevel, MipScale)
- Shadow Atlas:动态 tile 池,通过 LRU 算法管理有限的内存槽位
- TileIndexTable:多级页表结构,支持快速查询和最近邻回退
三重过滤机制:
- 距离估算 —
estimate = distance² × cellSize²,近处加载高精度页面 - 视锥体重叠 — 只加载与相机视野重叠的区域
- 视线角度 — 预加载相机前方即将看到的区域
最粗糙级别(Level 7-8)无条件加载,确保远距离基础阴影覆盖。
- GPU Instancing 绘制 IndirectionTexture,单次 DrawCall 处理所有页面
- 每帧限制最大请求数(
maxPageRequestLimit),平滑加载曲线 - 相机移动检测,静止时跳过不必要的更新
- CommandBuffer 分离渲染,避免与 Unity 内置阴影冲突
- 现代化 Inspector UI,支持 Low/Medium/High/Ultra 四档质量预设
- Setup Wizard 一键配置场景组件
- 实时统计面板显示活跃页面数、请求数、内存占用
- 纹理预览和调试可视化
Assets/
├── Scripts/
│ ├── VirtualShadowMaps.cs 核心管理类,处理页表和渲染
│ ├── VirtualShadowCamera.cs 相机端页面请求逻辑
│ ├── VirtualShadowMapBaker.cs 运行时阴影烘焙器
│ ├── StreamingTile/ 虚拟纹理基础设施
│ │ ├── TileIndexTable.cs 多级页表数据结构
│ │ ├── IndirectionTexture.cs 页表纹理管理
│ │ ├── MosaicTexture.cs Shadow Atlas 管理
│ │ └── EvictionCache.cs LRU 缓存实现
│ └── ...
│
├── Shaders/
│ ├── CascadedOcclusionMaps.hlsl 阴影采样核心函数
│ ├── AdaptiveRendering/
│ │ ├── DrawIndirection.shader IndirectionTexture 绘制
│ │ └── DrawMosaic.shader Shadow Atlas 更新
│ └── Internal-DeferredShading.shader 延迟渲染集成
│
├── Editor/
│ ├── VirtualShadowMapsInspector.cs 主 Inspector + 烘焙工具
│ ├── VirtualShadowCameraInspector.cs 相机 Inspector
│ ├── VirtualShadowMapSetupWizard.cs 配置向导
│ └── ...
│
└── Bistro/ Amazon Lumberyard Bistro 测试场景
- Unity 2022.3+,Windows/Mac/Linux
- Built-in Render Pipeline(不支持 URP/HDRP)
- 打开菜单
Window > Virtual Shadow Maps > Setup Wizard - 选择场景中的平行光(Directional Light)和主相机
- 选择质量预设(推荐从 Medium 开始)
- 点击 "Setup Virtual Shadow Maps" 完成配置
- 在 VirtualShadowMaps Inspector 中调整参数:
Max Tile Pool: 控制内存占用(64-256)Bias / Normal Bias: 调整阴影偏移,消除 acnePCSS Filter: 启用软阴影
- 在 VirtualShadowCamera Inspector 中调整
Level of Detail(默认 5.0) - 可选:使用 Baking Tools 预烘焙静态阴影
- 项目修改了
Internal-DeferredShading.shader,升级 Unity 版本时需手动合并 - 运行时模式性能开销较大,建议静态场景使用预烘焙
VirtualShadowVolume.Collect()会扫描场景中所有 Renderer,大场景可能耗时较长- 最大支持 256×256 页表(65536 个虚拟页面),超大场景需调整
pageSize参数
Assets/Editor/LOOKUP_TEXTURE_DESIGN.md— IndirectionTexture 设计原理Assets/Editor/BAKING_GUIDE_CN.md— 阴影烘焙完整指南
本项目包含的 Bistro 场景资源受以下许可约束:
Bistro 场景:© 2017 Amazon Lumberyard
场景资源版权信息见 Assets/Bistro/Bistro_v5_2/LICENSE.txt。
