← ALL ARTICLES

动态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为例,射线记录入射辐射亮度与首次命中距离。辐照度图按余弦权重累积光照;另一份方向图保存距离均值 μ=E[d]\mu=E[d] 与二阶矩 m2=E[d2]m_2=E[d^2]。命中距离用世界长度单位,未命中射线按预设最大追踪距离编码,不能与辐照度混用格式。

着色点到探针的距离为 rr,沿该方向读取距离矩。简化的可见性权重为

σ2=max⁡(m2−μ2,0),v(r)={1r≤μσ2σ2+(r−μ)2r>μ.\sigma^2=\max(m_2-\mu^2,0),\qquad v(r)=\begin{cases}1&r\le\mu\\ \dfrac{\sigma^2}{\sigma^2+(r-\mu)^2}&r>\mu. \end{cases}

它是单侧概率上界的近似应用,不是精确遮挡。若同一方向足迹内距离2和6各占一半,则 μ=4,σ2=4\mu=4,\sigma^2=4;在 r=5r=5 处,上式给0.8,而真实可见比例只有0.5。这解释了矩方法为何仍可能漏光。实际系统还会加入法线权重、探针有效性、查询偏移及经过标定的压缩权重,不能声称仅靠两个矩完全解决薄墙。

空间插值时,将 Light Probe 的八角权重与可见性、有效标记相乘,最后除以有效权重和。探针在物体内部时,可由背面命中比例分类或重定位;没有有效探针时采用明示的环境回退。

对于一批新估计 E^t\widehat E_t,时间更新为 Et=hEt−1+(1−h)E^tE_t=hE_{t-1}+(1-h)\widehat E_t,h∈[0,1)h\in[0,1) 是历史权重。若光照突然从0变1,经过 kk 次实际更新后结果是 1−hk1-h^k。例如 h=0.9h=0.9 时,10次更新只到约0.651;每四帧才更新一次的探针要经过40帧才达到这一程度。更新频率与时间滤波共同决定响应延迟。

text
为本批次选择探针,保留更新代次与世界位置
追踪新射线,分别累积辐照度、距离和距离平方
根据背面命中、有效射线数和位置变化判定历史是否有效
有效历史:按 h 混合新旧辐照度和距离矩
无效历史:直接初始化新估计,不继承原网格槽位的数据
完成纹理写入及依赖同步后,发布本批次供着色读取

这是调度伪代码,场景追踪接口由宿主提供,核心矩权重与历史更新在 gi_models.py 中展开。滚动体积的槽位复用、相机瞬移或探针重定位都应携带位置/代次有效性,避免旧房间的光照进入新房间。预算减少可平摊成本,也会增大历史年龄。

Lumen的场景表示与回退

可以沿一条间接光射线理解多份表示的分工。屏幕追踪先利用当前深度补充可见细节;射线离开屏幕或无法由屏幕数据确认命中时,使用配置的世界空间追踪表示继续查询。软件路径可依靠Mesh SDF与Global Distance Field,硬件路径可追踪三角形。得到命中位置以后,还需要表面材质与照明信息,Surface Cache为部分查询提供可复用表示,Final Gather再把多方向贡献组织到着色结果。

追踪与命中照明因此是两个可分别失效的环节。屏幕上能看到的小物体可能由第一条路径补足;离屏以后若世界表示没有对应细节,结果可能变化。世界追踪确定了命中,也不意味着缓存已经覆盖该表面;缓存缺失、更新迟滞和选择不同命中照明策略,会产生另一类差异。动态门打开时,遮挡变化与缓存照明更新的时间还可能不同,需分别查看表示、命中与历史年龄。

上述职责以Unreal5.6官方技术说明为范围,不能把这里的概念顺序当作固定Pass调用表。具体屏幕追踪开关、软件/硬件路径、Surface Cache覆盖与命中照明模式,应在同一版本的可视化与捕获中配对确认。仅看最终变亮不能判定变化来自追踪修正、缓存更新还是时间滤波。

方案适用条件

需求更常见方向
静态场景、低端平台Lightmap + Probe
小范围动态间接光SSGI、局部 Probe 更新
大场景动态 GIClipmap、Distance Field、Probe、硬件 RT 的组合
高质量反射Reflection Probe + SSR + RT 回退组合

选择取决于动态范围、平台、内存、时间稳定、内容制作成本和画质目标。

验证方法

移动遮挡物、改变灯光、相机瞬移与跨体积边界分别测试。输出场景表示、有效探针、历史权重和更新时间,比较同场景离线参考。Lumen内部接口按目标Unreal版本核对,当前记录为尚未验证运行状态。test_gi.py 已检验矩上界与真实二点分布的差异、10次时间更新和历史失效重置;它没有执行场景射线。

相关主题

参考资料