想象你走进一位微缩模型大师的工作室。他正用木板、纸片和胶水搭建一个精致的房间模型——有床、书桌、书架,还有一扇洒进阳光的小窗。为了让客户一眼感受到真实,他做了两个关键动作:第一,他把书桌和墙壁之间的缝隙涂上阴影,让角落看起来“陷进去”;第二,他在地板上涂了一层光亮的釉,让床和书桌的倒影隐约浮现。这两个动作,恰好就是游戏实时渲染中大名鼎鼎的 SSAO 和 SSR。 SSAO(屏幕空间环境光遮蔽)负责“缝隙里的阴影”:物体与物体贴得越近、越在角落,光线越难到达,画面就该越暗。SSR(屏幕空间反射)负责“光洁表面的倒影”:湿漉漉的地板、玻璃桌面、汽车漆面,都应该反射周围景物。而它们的名字里都有“屏幕空间”——意味着这位模型大师只能利用“相机已经拍到的内容”来做文章:屏幕外的东西,他看不见,也就反射不出来。这正是理解这两项技术的总钥匙:用 2D 屏幕上的信息,去近似 3D 世界的光影细节。
对 AI 从业者而言,理解 SSR/SSAO 意味着懂得了实时渲染中“近似与性能的辩证法”——无论是设计游戏 AI 的视觉仿真环境,还是优化渲染管线的数据流,这套思想都是图形学与 AI 工程之间的桥梁。
可视化演示
演示SSR射线步进在深度缓冲中的反射交点检测、SSAO半球核采样遮蔽因子计算、Hi-Z层级深度金字塔自适应步进追踪三大屏幕空间渲染技术。
本节配有交互动效(进入视口后自动加载,约 3KB)。
SSR屏幕空间反射射线步进 从表面点沿反射向量R在深度缓冲中步进采样 射线低于深度表面时判定为命中交点 R = reflect(V, N) · Fresnel = F0 + (1-F0)(1-cosθ)^5 SSR仅利用屏幕内可见几何信息反射范围受限
屏幕空间基础
微缩模型大师开工前,会先架起一台取景相机。他透过取景器决定:“观众能看到哪些范围、哪些物件在画面内、哪些完全在取景框之外。”这个取景器里的画面,就是模型房间的“屏幕空间”——一切后续加工都只围绕这个画面展开。
在实时渲染中,屏幕空间指的是相机最终输出的那幅 2D 画面所对应的数据集合。引擎先把 3D 场景投影到屏幕上,然后为每个像素记录一套“档案”,这套档案称为 G-buffer:包括颜色(反照率)、法线方向、深度值、材质属性等。其中深度缓冲(Z-buffer)记录了每个像素离相机有多远,它是后处理技术最依赖的信息源。
屏幕空间方法(SSAO 和 SSR)都位于渲染管线的“延迟阶段”或“后处理阶段”:此时 G-buffer 已经生成,不需要再向 GPU 提交几何体,只需像图像处理一样逐像素计算。这种设计的好处是性能稳定——计算量取决于屏幕分辨率,而不是场景中三角形数量。
屏幕空间的深度值通常不是线性的:近处的精度高,远处的精度低。要比较两个像素的实际远近,必须先把非线性深度还原成线性深度:
有了这份“取景器档案”,模型大师就可以开始他的光影魔法了。但请记住:所有操作都只能基于取景器里已有的内容——一旦某个物体离开了画面,它的数据也就离开了 G-buffer。这是屏幕空间方法的红利,也是它的边界。
z_ndc 是 G-buffer 里存的归一化深度,a 和 b 是由相机近远裁剪面决定的常数。- z_ndc(归一化设备坐标深度)GPU 光栅化后输出的深度值,范围在 [0,1] 之间,但近处变化快、远处变化慢,直接比较会失真。
- a 与 b(投影常数)由透视投影矩阵的近裁剪面
near和远裁剪面far推导,消除非线性影响。 - 倒数还原将非线性值映射回线性距离,得到像素在相机空间中的真实深度。
SSAO 原理
模型大师注意到一个细节:当他把书桌推近墙壁时,书桌和墙壁之间的那道缝隙总是比房间中央的地板暗一些。客户问为什么,他说:“因为这里的光线被堵住了——光要进来,先得拐个弯。”这种“物体靠得越近、缝隙越暗”的现象,就是环境光遮蔽(Ambient Occlusion)。
SSAO(Screen Space Ambient Occlusion,屏幕空间环境光遮蔽)把这个物理现象搬进了屏幕空间。它的思路非常朴素:对每个像素,在它周围的邻域里取若干个“探针”样本点,用深度缓冲比较这些点与当前像素谁更靠近相机。如果邻域里有大量样本点比当前像素更近,说明这个像素处在“被遮挡”的位置——光不容易照到它,应该变暗。
以微缩模型来理解:你拿着一个手电筒照向房间,墙角附近的阴影往往不是锐利的,而是有一层“软暗影”——这正是 SSAO 要模拟的。它不需要真的模拟光线路径,只需查 G-buffer 里的深度档案,做简单的数学判断,就能给场景加上真实的“重量感”。
SSAO 的核心计算可以写成这样一个平均投票公式:
SSAO 的巧妙之处在于,它完全没有追踪光线,只是“看看周围有没有更近的东西挡着”。模型大师闭上眼也能画出角落的阴影——因为他知道缝隙和角落就是光的死角。SSAO 用同样的直觉,在像素级别复刻了这种判断。
D(p) 表示像素 p 的线性深度,p_i 是 p 邻域内的第 i 个采样像素,ε 是容差。中括号内的判断为真时计 1,假时计 0。AO 值越大,遮蔽越强,画面越暗。最终用 1 - AO 乘以环境光颜色即可。- N 个采样点在每个像素的周围随机挑选 N 个邻近像素作为“探针”,N 通常取 8~32,越多越平滑但越慢。
- 深度比较逐一比较邻域样本的深度与当前像素深度,判断邻域是否“挡住”了当前像素。
- 容差 ε防止深度值因数值误差造成的误判,也避免太远的物体被错误计入遮蔽。
- 取平均把所有样本的投票结果求平均,得到 [0,1] 区间的遮蔽值。
SSAO 算法
模型大师并不满足于“哪里有阴影”的粗略判断。他发现,如果探针采样不均匀,阴影边缘会出现一条条像百叶窗似的条纹;而且,所有探针都朝一个方向取,会漏掉侧面缝隙的暗影。于是他决定升级采样策略。
第一个升级是法线分布:不再是盲目地在圆形区域撒采样点,而是以像素的法线方向为中心,在一个半球范围内采样。法线朝上的地板和法线朝侧面的墙面,采样区域自然不同,这样 AO 结果能反映表面朝向。第二个升级是随机旋转:每一帧给采样点加一个随机旋转角,让条纹感不再固定在某处,配合后续降噪就能消除肉眼可见的花样纹。
第三个升级是模糊降噪:采样点再多,低分辨率下依然有噪声。GPU 上常用一个 3×3 或 5×5 的模糊核(Blur Kernel)对 AO 贴图做平滑,就像用软毛刷把刚涂上的颜料轻轻晕开。这一系列操作整合成一个带余弦权重的计算公式:
升级后的 SSAO 就像是给模型大师的软毛刷装上了“方向感应器”:他知道阴影该往哪里偏、缝隙该有多深,再顺手把刷痕抹匀。几个小技巧,让角落的暗影从“能用”变成“好看”。
n 是当前像素的法线方向,ω_i 是第 i 个采样点的方向向量,V(p_i) 是遮蔽函数。点积 n·ω_i 越大,说明采样方向越朝向法线正前方,贡献的权重越大。- 法线半球以像素法线
n为轴,只在法线朝向的那半边球里取采样方向,避免在地板底下采样。 - 余弦权重越正对法线的样本,越能代表该像素上方的光照环境,权重越大。
- 遮蔽函数 V若样本点深度小于当前像素,说明被遮挡,V 取 1,否则取 0。
- 归一化反转对 N 个样本加权平均后,用 1 减去它,得到“未被遮蔽比例”,即最终亮度系数。
SSR 原理
模型大师在地板刷完亮釉后,发现一个有趣的现象:地板上出现了床脚和书桌腿的倒影。但客户问了一句:“那把椅子呢?”大师一愣——椅子在镜头外面,取景器里根本没有它的画面,自然也没法倒影在地板上。这就是屏幕空间反射(SSR)最核心的特性和局限。
SSR(Screen Space Reflection)是一种在屏幕空间内模拟反射的技术。它的流程是:对于画面中每个需要反射的像素(比如地板上的漆面区域),根据相机视线方向和表面法线计算出一条反射射线,然后用类似光线步进(Ray Marching)的方式,让这条射线在屏幕空间中一步一步前进,每一步都检查当前深度缓冲中的深度值,看看射线是否撞上了某块“已经画好的”表面。如果能撞上,就把那个表面的颜色搬过来当作倒影。
以微缩模型来说,SSR 就是“用取景器里的影像倒映在光滑表面上”。它不需要知道 3D 房间的全貌,只需要对照 G-buffer 这张“地图”寻找射线撞到的内容。这使 SSR 比传统反射贴图真实得多——它能反射动态物体、局部细节,甚至连角色自己都能出现在地板倒影中。
反射射线的方向由反射定律决定。若视线方向为 v,表面法线为 n,则反射方向 r 为:
模型大师教会了我们重要一课:倒影只能反映“看得见的现实”。SSR 的反射同样如此——反射内容全部来自当前帧的屏幕画面。这是一把双刃剑:它让反射变得动态而廉价,却也埋下了“屏幕外物体无法反射”的先天缺陷。
v·n 是视线在法线方向上的分量,减去两倍分量就能把视线“弹”出去。- 视线向量 v从相机指向当前像素的单位方向向量,代表“你看这个像素的视线”。
- 法线向量 n当前像素的表面朝向,从 G-buffer 的法线通道读取,决定“镜面朝哪个方向”。
- 点积投影把视线分解为“垂直法线分量”和“平行法线分量”,反射只需要翻转平行分量。
- 合成反射方向用原视线减去两倍平行分量,得到关于法线对称的反射方向。
SSR 算法
模型大师想让倒影更精致,但遇到一个难题:地板面积很大,如果一小步一小步地排查倒影,计算量太大;如果一步跨太大,又容易直接越过倒影目标。他灵机一动,拿出一叠图纸——先看大轮廓,再翻细节页——这就是 SSR 中的 HZB 加速思想。
HZB(Hierarchical Z-Buffer,分层深度缓冲)本质上是一组由深度缓冲生成的多级 mip 贴图。第 0 层是原始深度图,第 1 层每 2×2 像素取一个“较近深度”,第 2 层再翻倍……于是,上层代表“这个区域离相机最近的距离”。射线步进时,先在高 mip 层大步跳跃:如果射线在高层的包围盒内没有撞到任何表面,就整片跳过;一旦撞上,就下降到低层逐级细化,最后在原始深度层用二分搜索精准定位命中点。
这个过程像极了模型大师翻图纸:先翻到总览页,确定倒影大概率落在哪个区域,再翻到细节页精确比对,而不是从第一页逐行扫描。二分搜索则像猜数字游戏——每次把范围缩小一半,十几步就能锁定目标。
HZB 每一层的深度覆盖范围决定了该层适合的步长。常用步长与 mip 层的关系为:
有了 HZB,SSR 从“蛮力搜索”升级为“智能查找”。模型大师翻完总览再翻细节,倒影的定位又快又准。不过,任何查找算法都有边界——当反射射线超出了屏幕范围,或者目标物体确实不在画面里,大师也只能摊摊手说:“这部分,我的图纸上没有。”
d 是射线已前进的距离,α 是射线圆锥的扩散角度,δ 是期望的像素级精度。mip 层数越高,每一步跨过的屏幕范围越大,速度越快但精度越低。- 步进距离 d射线从起点出发已经走过的长度,越大说明已经搜索了越远。
- 扩散角 α反射射线并非数学上的零宽度直线,而是有一个“锥形”范围,用来吸收深度误差。
- 精度 δ希望最终命中的误差不超过多少像素,δ 越小,需要的 mip 层越低,计算越慢。
- 取对数定层把“覆盖范围/精度”的比值取以 2 为底的对数,正好对应 mip 层级。
性能优化
模型大师的客户希望把同样的光影效果搬到手机上看——但手机上“算力”这根蜡烛只有桌面上的一小截。大师的策略是:不在全分辨率硬算,而是“先粗略、再精修、最后抹平痕迹”。这正是 SSR/SSAO 性能优化的核心思路。
第一招是降采样:SSAO 只需要很低的分辨率(例如四分之一分辨率)就能提供足够的暗影信息。先在低分辨率下计算 AO 贴图,再通过双线性插值放大回全分辨率,计算量骤减。SSR 也有类似的技巧:对反射计算使用半分辨率,配合时间积累恢复质量。第二招是时间滤波(Temporal Filtering):把上一帧的结果缓存下来,与当前帧混合。单帧的反射/遮蔽可能有噪点,但一混合,噪点就被抹平了。
第三招是参数调优:调节采样数、步数、搜索半径、模糊核大小等参数,在画质与帧率之间找平衡点。移动端还有一个常用技巧:根据离屏距离自适应降低效果强度,远处物体的反射和遮蔽本来就难以察觉,可以省掉。
时间滤波的混合公式非常直观:
模型大师用“小蜡烛+时间”换取了“大蜡烛+内存”的效果——低分辨率计算省了算力,时间积累补回了质量。优化不是免费午餐,但它是一门巧妙的“资源转移”艺术:把单帧的压力分摊到时间和空间上。
C_t 只占 α 的比例,上一帧积累的结果 I_{t-1} 占 1−α。α 越小,时间上的平滑越强,但画面响应越迟钝,快速移动时可能拖影。- 当前帧结果 C_t本帧 SSAO/SSR 计算出的原始结果,往往带有高频噪声。
- 历史帧结果 I_{t-1}上一帧经过时间滤波后存储的累积结果,包含多帧信息。
- 混合权重 α当前帧的置信度,通常在 0.1~0.3 之间,越小越信赖历史。
- 加权求和新结果 = 历史结果 + 当前帧的增量修正,既平滑又渐进。
工程实践
模型交付前,大师还要做最后一步:用放大镜检查瑕疵。屏幕空间方法的天然缺陷在大师手下被逐一修复:墙角漏光、倒影抖动、反射边缘断裂……每一项都有对应的“补丁”。
最常见的伪影是漏光:SSAO 在物体与物体非常贴近时,由于采样点落在物体内部或背面,计算出错误的亮区。解决办法是增加法线方向的采样偏向,并在深度比较时加阈值截断。反射抖动则多源于 SSR 步进不够精细——处理方式是 HZB 命中后强制做几步二分细化。还有边界断裂:物体一半在屏幕外时,反射会突然消失。工程上通常给反射距离设置一个上限,并在边缘做淡出处理,让截断不那么突兀。此外,SSR/SSAO 与 TAA(时间抗锯齿)配合是天作之合:TAA 的重投影机制需要运动向量,而 SSR 的时间滤波正好共享这些数据,两者协同还能互相掩盖瑕疵。
当这些伪影被量化时,我们常用“反射命中点的深度误差”来衡量质量:
模型大师终于可以交付了。光影魔术的秘诀并不神秘:接受“只看得到眼前”的局限,用聪明的算法在局限内做到最好;对无法解决的部分,用柔和的方式遮掩过去。SSAO 和 SSR,本质上都是人类在有限资源下追求真实感的实用主义杰作。
z_hit 是步进实际命中点的深度,z_ref 是反射理论应该到达的深度。误差 E 越小,反射越精准;当误差超过阈值时,就判定为无效命中并做淡出处理。- 命中深度 z_hit光线步进最终停下的那个像素的真实深度。
- 理论深度 z_ref根据反射射线和场景几何推算出的理想深度。
- 相对误差两者差值的绝对值得除以参考深度,归一化后与阈值比较。
- 阈值决策若 E 超过 10%~20%,判定为无效命中,使用淡出或其他替代反射。
AI 应用场景
游戏开发中的 AI 辅助渲染质量检测
阶段:数据驱动的自动调优与质量监控
解决的问题:SSR/SSAO 参数调整依赖美术师逐帧肉眼检查,效率低且容易遗漏特定视角下的伪影。AI 模型可以自动分析渲染帧中的漏光、反射断裂、AO 噪点等缺陷,给出参数修正建议。
具体案例:某开放世界游戏团队在开发中收集了数万张带标注的渲染帧,训练了一个小型视觉 Transformer 模型。该模型在 CI 流水线中自动检测新增场景的 SSR 边界断裂和 SSAO 漏光问题,把渲染质量回归测试从人工 3 小时缩短到 10 分钟。
自动驾驶仿真中的真实感图像生成
阶段:训练数据增强(Sim-to-Real)
解决的问题:自动驾驶 AI 需要海量带标注的道路图像,纯现实采集成本高昂。仿真渲染中的 SSR 让湿润路面和车窗产生真实倒影,SSAO 让车辆底部和路边遮挡物具备正确阴影,极大提升仿真图像的真实感,减小仿真到现实的域差距。
具体案例:某自动驾驶公司使用虚幻引擎渲染仿真街道,开启 SSR/SSAO 后的场景让视觉感知模型的平均精度提升了 8%。路面水洼反射出周边车辆,使模型学会了利用倒影判断隐藏车辆的位置。
游戏 AI 强化学习中的视觉状态编码
阶段:特征提取与状态表示
解决的问题:强化学习代理需要从游戏画面中提取有效状态特征。SSAO 提供的接触阴影能帮助 AI 判断物体间的空间关系和碰撞状态,SSR 提供的倒影信息能辅助 AI 推断“画面外区域”的存在——尽管反射不完整,但仍是线索。
具体案例:在一个 3D 寻路任务中,研究团队发现关闭 SSR 时 AI 在光滑走廊中频繁撞墙,开启后准确率提升 22%。原因在于倒影提供了墙面位置的附加线索,相当于给 AI 增加了一个“视觉先验”。
Python 演示
import numpy as np def build_depth_buffer(w=64, h=48): """构造一张伪深度图:0.0 表示近,1.0 表示远""" depth = np.ones((h, w), dtype=np.float32) rows, _ = np.mgrid[0:h, 0:w] ground_h = int(h * 0.6) depth[ground_h:, :] = (rows[ground_h:, :] - ground_h) / (h - ground_h) * 0.9 + 0.1 depth[int(h * 0.3):ground_h, int(w * 0.2):int(w * 0.4)] = 0.05 depth[int(h * 0.4):ground_h, int(w * 0.6):int(w * 0.75)] = 0.10 return depth def simplified_ssao(depth, radius=3, sample_count=16): """基于深度比较的简化 SSAO 演示""" h, w = depth.shape occl = np.zeros((h, w), dtype=np.float32) rng = np.random.default_rng(43) for _ in range(sample_count): dy = rng.integers(-radius, radius + 1, size=(h, w)) dx = rng.integers(-radius, radius + 1, size=(h, w)) rows = np.arange(h)[:, None] + dy cols = np.arange(w)[None, :] + dx rows = np.clip(rows, 0, h - 1) cols = np.clip(cols, 0, w - 1) nd = depth[rows, cols] occl += (nd < depth - 0.01).astype(np.float32) return occl / sample_count def demo(): depth = build_depth_buffer() ao = simplified_ssao(depth) dark_pixels = int(np.sum(ao > 0.3)) print("Demo 场景深度图尺寸:", depth.shape) print("AO 遮蔽显著(>0.3)的像素数:", dark_pixels) print("所有像素平均 AO 值:", round(float(ao.mean()), 4)) print("说明: 方块底边和墙角处遮蔽值高,表现为接触阴影。") if __name__ == "__main__": demo()
rows, _ = np.mgrid[0:h, 0:w]生成每个像素的行列坐标,便于向量化计算,避免 Python 逐像素循环。depth[ground_h:, :] = ...把地面区域的行映射为深度值,模拟“越远越深”的透视关系。rng.integers(-radius, radius+1, size=(h,w))为每个像素随机生成邻域偏移量,相当于 SSAO 的随机采样。rows = np.clip(rows, 0, h-1)把越界的采样坐标钳制在边界内,模拟屏幕边界处的处理方式。nd = depth[rows, cols]用高级索引取出邻域样本的深度值,这是“取探针读数”的向量化写法。occl += (nd < depth - 0.01)核心深度比较:邻域比当前像素近则投一票“被遮挡”,0.01 是容差阈值。return occl / sample_count对投票结果求平均,归一化到 [0,1] 区间,得到 AO 遮蔽程度。
常见误区
误区我一直以为 SSAO 就是全局光照的替代品,开了它阴影就全部真实了。
正解SSAO 只处理“环境光”这一项的遮蔽近似,它不模拟光线的多次弹射、不产生彩色渗色、也不处理太阳等主光源的直接阴影。它更像给模型房间的角落补上一层软阴影粉底,而不是重新给房间布光。真正的全局光照需要动态全局光照(DDGI、Lumen 等),开销比 SSAO 高一个数量级。
为何常见:SSAO 让场景“立体感”提升明显,初学者容易把“暗角变自然”误以为是完整的光照计算。
误区我开了 SSR,为什么站在悬崖边往下看,反射里看不到悬崖底部的场景?
正解SSR 的“屏幕空间”决定了它只能反射当前帧画面里已经渲染的内容。悬崖底部如果不在相机画面内,G-buffer 里就没有它的颜色和深度数据,反射自然缺失。工程上可用反射探针或平面反射作为补充方案来填补屏幕外信息。
为何常见:人们习惯了真实的镜子能反射视野外物体,于是下意识期待 SSR 也具备同样能力,忽略了“屏幕空间”这个根本限制。
误区SSAO 效果噪点多?那就把采样数从 16 加到 128,不行就 256。
正解采样数翻倍,性能开销近似线性增长,但视觉收益迅速边际递减。更聪明的做法是:低分辨率 + 少量采样 + 时间滤波 + 空间模糊的组合,往往能以 1/4 的计算量获得更干净的结果。图形学优化永远是“算力换巧劲”,而不是“蛮力堆料”。
为何常见:直观直觉是“更多样本 = 更准确”,但人眼对噪声的感知可以用时间和空间滤波轻松欺骗,性价比远高于暴力加采样。
误区SSAO/SSR 老出误差,是不是深度缓冲改成 64 位浮点就好了?
正解深度缓冲的精度问题主要源于非线性分布,而不是位宽。换成线性深度、在比较时使用相对阈值(与深度值成比例的容差),以及用 HZB 分层消除远距离步进误差,都比单纯加位宽更有效。64 位深度还会带来带宽翻倍,反而拖累整体性能。
为何常见:从业者容易把数值问题归咎于“精度不够”,而忽略了更关键的是深度空间的编码方式与误差模型。
面试题
Q1. SSAO 中 "AO" 的完整含义是什么?
- A.环境光遮蔽← 正确答案
- B.环境光反射
- C.抗锯齿优化
- D.镜头光晕效果
答案:A。AO 全称 Ambient Occlusion,即环境光遮蔽,指物体缝隙和角落因环境光难以到达而变暗的现象。环境光反射是 SSR 的范畴,抗锯齿是 AA,镜头光晕是 Bloom 相关效果,均不对应 AO。
Q2. SSR 反射数据的来源是什么?
- A.当前帧 G-buffer← 正确答案
- B.离线光照贴图
- C.场景包围盒
- D.骨骼动画数据
答案:A。SSR 在屏幕空间内工作,直接读取当前帧 G-buffer 中的颜色与深度信息作为反射来源。离线光照贴图不含动态内容,包围盒是碰撞用的数据结构,骨骼动画与反射无关。
Q3. SS声下最接近的物理类比是什么?
- A.墙角缝隙比空旷处暗← 正确答案
- B.镜面反射出倒影
- C.水面产生波纹
- D.蜡烛在风中闪灭
答案:A。SSAO 模拟的是环境光被几何遮挡的现象——墙角、物体贴合处光线难以到达,自然更暗。镜面倒影对应 SSR,水面波纹是法线贴图或流体模拟的体现,蜡烛闪灭则是动态光照,都不属于 SSAO 的核心语义。
Q4. 为什么 SSR 无法反射屏幕外的物体?
- A.屏幕外物体未写入帧缓冲← 正确答案
- B.反射计算需要更多显存
- C.屏幕外物体距离太远
- D.光追默认处于关闭状态
答案:A。屏幕空间方法的根基是“只用当前帧画面数据”。屏幕外物体既没有颜色也没有深度残留在 G-buffer 中,SSR 无从查找和采样。显存和距离不是根本原因,D 的“光追关闭”也与 SSR 无直接关系。
Q5. SSR 中 HZB 加速的核心思路是什么?
- A.用 mip 层级跳过空旷区← 正确答案
- B.对所有像素做深度排序
- C.用阴影贴图预计算反射
- D.用透镜畸变补偿误差
答案:A。HZB 把深度缓冲构造成多级 mip 链,高层代表“区域内最近深度”。射线步进时在高层级快速跨越无遮挡区域,命中包围盒再降级细化。深度排序是遮挡查询的思路,阴影贴图与反射无直接关系,透镜畸变属于相机模型问题。
Q6. SSAO 通常忽略光源方向,是因为它处理的是哪种光照?
- A.环境光级别的近似← 正确答案
- B.直接日照的阴影
- C.高光反射的高光项
- D.体积光的散射项
答案:A。SSAO 只对环境光分量做遮挡调制,不区分光源方向——它假设环境光从四面八方均匀射入。直接日照阴影由 Shadow Map 处理;高光项属于 Blinn-Phong 等光照模型的 specular;体积光是 God Ray 相关效果。
Q7. 时间滤波解决 SSR/SSAO 的最主要问题是什么?
- A.单帧噪声导致的抖动闪烁← 正确答案
- B.场景光源数量过多
- C.多边形面数超出预算
- D.纹理加载速度过慢
答案:A。低采样数的 SSAO/SSR 在单帧会有大量随机的,时间滤波将历史帧混合,利用相邻帧的互补信息消除高频噪声。光源数量、面数预算是渲染管线的整体约束,纹理加载是 IO 问题,都不是时间滤波的直接目标。
Q8. 以下哪些属于 SSAO 的常见优化手段?
- A.在低分辨率下计算并升采样← 正确答案
- B.使用时间滤波积累多帧← 正确答案
- C.随机旋转采样消除条纹← 正确答案
- D.增加场景中的光源数量
答案:ABC。降分辨率、时间滤波、随机旋转采样都是 SSAO 的主流优化手段。增加光源数不改善 AO 计算本身,反而增加光照开销,因此不属于 SSAO 的优化手段。
Q9. 以下哪些情形会暴露 SSR 的边界缺陷?
- A.反射物体一半在屏幕外← 正确答案
- B.光滑表面朝向屏幕外← 正确答案
- C.相机在场景中完全静止
- D.远距离目标超出搜索上限← 正确答案
答案:ABD。物体半出屏导致反射信息不完整,表面朝向屏幕外时反射射线直接指向无数据区域,远距离目标超出搜索半径则没有命中。只有相机静止不会暴露边界问题,静态画面反而更容易完整采样。
Q10. 工程上用“限制反射搜索距离”来缓解伪影,其本质是什么?
- A.把反射截断在可信范围内← 正确答案
- B.提升反射纹理的分辨率
- C.增加反射采样次数
- D.降低环境光遮蔽强度
答案:A。屏幕空间数据在远处越来越稀疏,射线步进超过安全距离后极易产生错误命中。限制搜索距离意味着在数据可信区域内保留反射,超出部分用淡出或替代方案,属于“用截断换取稳定”的工程策略。提分辨率、加采样、调 AO 强度都不针对边界伪影的本质。