动态GI
全库目录221
本文目录10
门打开以后,预计算结果不会自动让另一间房变亮。动态GI选择可更新的场景表示,再用有限采样与缓存摊平传播成本。屏幕、体素、距离场和探针保存的信息不同,缺失、漏光和历史滞后也要分别解释。
屏幕空间追踪
SSGI可把着色点P附近的偏移起点与半球方向D组成射线P+tD,把各步投影到屏幕,再与该UV处的表面深度比较。射线从可见深度前方穿到后方时,需要在两个步长之间细化,并用厚度容差判断是否接受命中;单层深度并没有保存实体厚度。命中后读取该表面已有的线性光照作为一次间接贡献,按方向采样密度及余弦加权。输入若已经含本次要计算的间接项,反复反馈会重复传播能量,应明确读取哪一轮照明。
例如沿相机负Z观察空间追踪,两个相邻步的z为-4和-6,查询到同一表面z=-5,说明发生深度穿越;这只能给候选区间,不能证明射线穿过的是该表面的真实三维实体。射线离屏后,算法失去查询数据,需使用其他场景表示或环境回退。把离屏当黑会丢能量,把任何穿越都当命中又会漏光,错误都能从输入信息不足解释。
体素锥追踪
体素锥追踪先保存体素化表面的辐亮度与不透明度,再按更大的覆盖尺度预过滤。距离起点t处、半角theta的锥直径约为2t tan(theta);基础体素边长s时,用log2(diameter/s)估计查询层级,并限制到可用范围。沿锥前到后累积C += T*alpha*color、T *= 1-alpha,不透明度逐步减少后方贡献。两个样本分别为红色alpha=0.5、蓝色alpha=1时,结果是半份红加半份蓝,剩余T=0。
这份各向同性体素教学模型会把单元内不同方向的占据混合。薄墙只填一部分体素时,预过滤可能变成部分透明,因此另一侧光能漏过。更细网格、方向性过滤和更完整的占据表示分别改变误差与成本;不能只增加追踪步数就恢复已经被体素平均掉的墙面。
体素锥的层级采样与占据过滤依据 Crassin等的原论文;本节数值与伪代码是明确前提下的独立教学推演,未实现完整SSGI、距离场或体素追踪器。
距离场追踪
距离场追踪改为读取世界空间场d(X)。若它是到最近表面的精确欧氏距离,沿单位方向前进d不会跨过最近表面;设当前位置离平面x=3有距离2、射线沿+X,就可从x=1一步走到3。离散插值SDF、非均匀缩放或近似距离可能高估安全步长,需使用保守距离、步长缩放和最大迭代数。仅有SDF还不能返回材质辐亮度,命中后需要表面数据或光照缓存。它改变了相交表示,没有免去照明积分。
动态探针更新
DDGI 等方法在空间布置 Probe,每个 Probe 向场景发射少量射线,更新辐照度和距离信息。运行时插值 Probe 结果。
需要解决:
- Probe 被放进几何内部;
- 可见性和漏光;
- 更新预算;
- 滚动体积和大世界;
- 时域稳定。
基于SDF的探针查询可用距离场步进替代三角形加速结构查询。大世界可采用滚动体积或分层Clipmap,各级覆盖不同尺度;新进入区域需重置,已存在区域也要按预算更新,才能跟随动态灯光和几何。
Screen Probe 把探针布置在屏幕或重建表面附近,能把计算集中到当前可见区域,并利用屏幕深度、法线和运动信息。它仍需要世界空间追踪或缓存补足屏幕外、遮挡后和反射方向缺失的信息。
距离可见性与时间更新
以规则探针DDGI为例,射线记录入射辐射亮度与首次命中距离。辐照度图按余弦权重累积光照;另一份方向图保存距离均值 与二阶矩 。命中距离用世界长度单位,未命中射线按预设最大追踪距离编码,不能与辐照度混用格式。
着色点到探针的距离为 ,沿该方向读取距离矩。简化的可见性权重为
它是单侧概率上界的近似应用,不是精确遮挡。若同一方向足迹内距离2和6各占一半,则 ;在 处,上式给0.8,而真实可见比例只有0.5。这解释了矩方法为何仍可能漏光。实际系统还会加入法线权重、探针有效性、查询偏移及经过标定的压缩权重,不能声称仅靠两个矩完全解决薄墙。
空间插值时,将 Light Probe 的八角权重与可见性、有效标记相乘,最后除以有效权重和。探针在物体内部时,可由背面命中比例分类或重定位;没有有效探针时采用明示的环境回退。
对于一批新估计 ,时间更新为 , 是历史权重。若光照突然从0变1,经过 次实际更新后结果是 。例如 时,10次更新只到约0.651;每四帧才更新一次的探针要经过40帧才达到这一程度。更新频率与时间滤波共同决定响应延迟。
为本批次选择探针,保留更新代次与世界位置
追踪新射线,分别累积辐照度、距离和距离平方
根据背面命中、有效射线数和位置变化判定历史是否有效
有效历史:按 h 混合新旧辐照度和距离矩
无效历史:直接初始化新估计,不继承原网格槽位的数据
完成纹理写入及依赖同步后,发布本批次供着色读取这是调度伪代码,场景追踪接口由宿主提供,核心矩权重与历史更新在 gi_models.py 中展开。滚动体积的槽位复用、相机瞬移或探针重定位都应携带位置/代次有效性,避免旧房间的光照进入新房间。预算减少可平摊成本,也会增大历史年龄。
Lumen的场景表示与回退
可以沿一条间接光射线理解多份表示的分工。屏幕追踪先利用当前深度补充可见细节;射线离开屏幕或无法由屏幕数据确认命中时,使用配置的世界空间追踪表示继续查询。软件路径可依靠Mesh SDF与Global Distance Field,硬件路径可追踪三角形。得到命中位置以后,还需要表面材质与照明信息,Surface Cache为部分查询提供可复用表示,Final Gather再把多方向贡献组织到着色结果。
追踪与命中照明因此是两个可分别失效的环节。屏幕上能看到的小物体可能由第一条路径补足;离屏以后若世界表示没有对应细节,结果可能变化。世界追踪确定了命中,也不意味着缓存已经覆盖该表面;缓存缺失、更新迟滞和选择不同命中照明策略,会产生另一类差异。动态门打开时,遮挡变化与缓存照明更新的时间还可能不同,需分别查看表示、命中与历史年龄。
上述职责以Unreal5.6官方技术说明为范围,不能把这里的概念顺序当作固定Pass调用表。具体屏幕追踪开关、软件/硬件路径、Surface Cache覆盖与命中照明模式,应在同一版本的可视化与捕获中配对确认。仅看最终变亮不能判定变化来自追踪修正、缓存更新还是时间滤波。
方案适用条件
| 需求 | 更常见方向 |
|---|---|
| 静态场景、低端平台 | Lightmap + Probe |
| 小范围动态间接光 | SSGI、局部 Probe 更新 |
| 大场景动态 GI | Clipmap、Distance Field、Probe、硬件 RT 的组合 |
| 高质量反射 | Reflection Probe + SSR + RT 回退组合 |
选择取决于动态范围、平台、内存、时间稳定、内容制作成本和画质目标。
验证方法
移动遮挡物、改变灯光、相机瞬移与跨体积边界分别测试。输出场景表示、有效探针、历史权重和更新时间,比较同场景离线参考。Lumen内部接口按目标Unreal版本核对,当前记录为尚未验证运行状态。test_gi.py 已检验矩上界与真实二点分布的差异、10次时间更新和历史失效重置;它没有执行场景射线。
相关主题
参考资料
- Epic:Lumen Technical Details,Unreal 5.6,场景表示、Surface Cache与追踪路径。
- NVIDIA RTXGI:Irradiance.hlsl,距离矩与查询权重;本页展示简化数学模型。
- Majercik 等:DDGI,探针成本、时间滞后和薄墙限制。