前两节解决了"怎么省"和"怎么救",本节正面回答那个终极问题:全局光照本身,实时预算里装得下吗?答案是装不下完整的,但货架上有六七种"局部版本"任你挑——每种都是在 6.3 族谱基础上砍掉某个维度换帧率。本节把货架逐层过一遍:烘焙与探针的静态派、屏幕空间的取巧派、光追探针与混合管线的全动态派,最后给一套可执行的选型流程。
最便宜的全局光是预先算好的。光照贴图把静态表面的间接光烘焙成纹理,静态场景里效果满分、运行时零成本——代价是动态物体享受不到(角色身上没有环境反射的光色变化)。探针是它的动态补丁:在场景里按网格摆放光照探针,每个探针存一份周围入射光的球面表示(低阶球谐是主流),动态物体走到哪就插值周围探针的系数——角色脸上有环境色了,成本是每物体几十次插值。探针的软肋在漏光:探针存的是"体积化"的光照,墙两侧的探针插值会让角色贴墙时身上透出墙那边的光。工程解法从简单到复杂依次是:探针避开墙摆放、给探针配遮挡系数、以及下面要说的动态光追探针。
屏幕空间方案从已渲染的画面里"顺便"提取光照信息:屏幕空间反射沿深度缓冲的反射方向步进找交点,屏幕空间 GI 用相邻像素的颜色差分近似入射辐射。共同优点是只读现成缓冲,成本极低;共同的死穴也一致——视野之外一无所知。第 1 章那面照不到窗外霓虹的镜子就是它们的照妖镜:光源在画面外、反射体在画面外、被遮挡的表面,全都拿不到。所以工业界把屏幕空间方案定位成"第一层近似的兜底":能覆盖的部分用它(便宜),覆盖不到的落回更贵的方案或直接接受缺失。
硬件光追成熟后,货架的顶层换成了全动态方案。光追探针(以距离场探针与动态漫反射探针为代表)把探针从"烘焙的罐头"变成"现场采集的鲜货":每个探针每帧向场景发射几十条射线采样入射辐照度与最近距离,存进八面体映射;物体照常插值,但光照是当前帧的——门开了,走廊的光真的会流进来。射线预算的算术:一百乘一百的探针网格乘每探针六十四射线,按需稀疏更新(近处密、远处疏、可见性优先)才压得进预算。混合管线则把整个第 6 章按预算切分:光栅化管主体着色,光追接管屏幕外依赖的效果——阴影射线查硬阴影、反射射线查镜面、探针射线查漫反射 GI,各路输出进 7.2 的降噪器再合成。商业引擎的现行旗舰方案正是混合管线的集大成:表面缓存把场景材质烘成可快速查询的卡片,屏幕空间追踪打头阵,光线步进与硬件光追兜底,全链路时序化。它们共同验证了本章的判断:实时 GI 不是"一个算法",而是"一组方案在预算里的排班"。

完整选型案例。场景:燃烧的房屋,火焰作为动态光源,家具可破坏翻倒,目标旗舰平台 60 帧。第一步判动态性:光源动(火焰闪烁)、遮挡动(家具翻倒)、间接光必须响应——烘焙与静态探针整层出局。第二步初配中层:屏幕空间 GI 兜底近处,火焰的直接光照用光栅化管线的逐光源前向渲染。第三步补顶层:一个跟随相机稀疏更新的光追探针网格(近处 64 射线、远处 16 射线,可见性裁剪优先更新近探针)提供全动态漫反射 GI,火焰的间接光由此照亮墙面;硬阴影用主光源阴影射线。第四步验收:家具翻倒瞬间墙面光斑跟着移动且无闪烁——探针更新节奏与时序降噪咬合良好;贴墙观察时角色身上出现轻微漏光——探针按可见性加权后消除。解读:这套排班的每一层都有兜底与失效说明,选型文档里写清楚"什么情况下这层会错",比堆参数重要得多。变式:若目标平台是移动端,顶层出局,火焰间接光降级为预计算的"燃烧光照探针动画"——用美术资产买回动态感的假象,成本几乎归零。
三层货架不是并列选项,多数项目最终把它们叠成一条混合管线——先用便宜层兜底,再让贵层补关键短板。落地骨架长什么样,十行伪码抓住全部分工:
function frame_gi(gbuffer, probes, prevHistory): # 第一层:屏幕空间兜底,全分辨率、零射线 ssGi = screen_space_gi(gbuffer) # 第二层:光追探针,稀疏网格、低射线数 for probe in probes.dirty_or_visible(camera): probe.radiance = trace_diffuse(probe.pos, rays = 48, visibility_clip = true) # 插值:像素取周围 4 探针,按距离与可见性加权 ptGi = interpolate(probes, gbuffer.pos, gbuffer.normal) # 第三层:镜面反射走逐像素射线,7.1 的半分辨率配方 refl = trace_reflection_halfres(gbuffer) # 汇合:屏幕空间为主、探针补屏外、时序累计降噪 gi = denoise(temporal_accumulate(blend(ssGi, ptGi, refl))) return gi
骨架里三个词各有讲究。脏探针指被动态光源或移动物体波及的探针,只更新它们是稀疏更新的前提;可见性裁剪指先做一次便宜的遮挡测试、再决定要不要花射线;汇合处的按深度渐变混合给屏幕空间方案留了兜底位——探针插值在近处永远不如屏幕空间锐利,两者按距离渐变交接是主流做法。把这段骨架记熟,读任何商业引擎的全局光照模块都有地图在手。
顺手回答一个立项会高频问题:探针网格密度怎么定?经验值是房间级密度(两三米间距)配近处加密。探针的任务是表达低频漫反射间接光,网格过密只会把更新与插值成本推高、画质增益趋零——全局光照的频率上限由漫反射自身决定,探针密度超过它纯属浪费。这也解释了探针与屏幕空间为何是互补而非竞争:一个管低频全覆盖,一个管高频近场锐利。
最后补一条升级路线图供排期参考:第一步上烘焙与探针(画面立涨、成本趋零),第二步接屏幕空间与反射射线(动态性补齐),第三步再上全动态光追探针与降噪(圣杯收编)。倒着做是新手最常见的浪费——还没有探针体系就先追全动态全局光照,预算与团队都会被拖垮。排期表的另一面是验收标准:每升一层都要在目标场景拿到可量化的画质提升(误差指标或盲测得分),拿不出就缓行该层。
骨架与排期之外留一个工程提醒收尾:混合管线里每一层的输出都要有独立的调试开关——只看探针层、只看屏幕空间层、只看光追层,三张中间图常驻调试视图。混合方案排障的第一步永远是"把混合拆开看单层",哪层坏了一眼定案;没有分图层调试的混合管线,出问题就是一团浆糊。这个习惯第 9 章的热图方法论会正式收编,这里先用起来。到此,实时预算下的三件武器——采样优化、降噪、方案货架——全部交货。
方案货架配齐了,但它的一切前提是"射线查询本身要快"。下一章下到硬件层:RT Core、图形 API 与整个软件生态。