想象一下,你正站在一间刚装修完的房间里。天花板上的主灯把整个房间照得通亮,但你总会发现:衣柜和墙壁的夹缝里、沙发靠背与地面的交界处,总有一圈洗不掉的暗影。如果整个房间亮得没有一丝阴影,每个物件反而会像悬浮在空气中,显得格外假。 在三维渲染中,这种“悬浮感”长期困扰着图形学工程师。传统光照模型就像一桶均匀的灰油漆,把环境光刷在场景每个角落,完全不管缝隙和夹层本该更暗。这就是环境光遮蔽技术的用武之地——而SSAO(屏幕空间环境光遮蔽)是其中最聪明的那位“角落侦探”,它不在三维世界里翻箱倒柜地追光,而是等画面渲染成照片后,拿一把小镜子探进每一处夹缝,悄悄记下“这里应该暗一点”。 本文要用一个贯穿全程的比喻——角落侦探——带你刷完SSAO的完整知识链:算法原理、采样策略、参数调优与工程落地。

岗位关联

对AI从业者而言,SSAO理解后能帮助你写出更逼真的渲染模型与实时视觉算法,是游戏开发、虚拟现实和数字孪生等方向必备的硬核技能。

目录
  1. 可视化演示
  2. 光照模型局限
  3. 核心思想
  4. 算法流程
  5. 采样策略
  6. 参数调优
  7. 工程实战
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

\u53ef\u89c6\u5316\u5c55\u79faSSAO\u5728\u5c4f\u5e55\u7a7a\u95f4\u91c7\u6837\u90bb\u57df\u6df1\u5ea6\u3001\u8ba1\u7b97\u906e\u853d\u7a0b\u5ea6\u5e76\u751f\u6210\u67d4\u548c\u9634\u5f71\u7684\u6838\u5fc3\u6d41\u7a0b\uff0c\u4ea4\u4e92\u5207\u6362\u89c2\u5bdf\u91c7\u6837\u6838\u3001\u6df1\u5ea6\u906e\u853d\u4e0e\u6548\u679c\u5bf9\u6bd4\u3002

本节配有交互动效(进入视口后自动加载,约 3KB)。

\u91c7\u6837\u6838\u53ef\u89c6\u5316 \u534a\u7403\u5f62\u91c7\u6837\u6838\u56f4\u7ed5\u50cf\u7d20\u6cd5\u7ebf\u5206\u5e03 \u91c7\u6837\u70b9\u68c0\u6d4b\u90bb\u57df\u51e0\u4f55\u906e\u853d AO = \u03a3(sample - depth) \u70b9\u51fb\u5207\u6362\u67e5\u770b\u6df1\u5ea6\u906e\u853d

光照模型局限

角落侦探第一次接到任务,是被业主投诉:房间里的家具全像被PS抠图后贴上去的。侦探看了看渲染方程,发现罪魁祸首是环境光那一项——在经典的光照模型(如Lambert、Phong)里,环境光通常被设成一个常数,相当于往整个场景里泼一桶均匀的灰油漆。无论墙角还是桌面,收到的环境光一模一样。

这在物理上是说不通的。真实世界里,光线在墙角、缝隙间来回弹射时会被墙面多次吸收,能量衰减得很快,所以夹缝天然比开阔处暗。但传统模型偷了懒,用一个常量冒充所有间接光照,于是物体与地面接触的位置没有任何“接触阴影”,看起来就像轻轻飘在地面上。

这个问题的本质是:光线在几何缝隙之间弹射的衰减信息,被建模过程略去了。而角落侦探的解决方案很聪明——他不去重写全局光照,只在渲染出的图像上找缝隙。

公式化的遮蔽程度可以这样定义:

所以,第一个要解决的光照模型局限,用侦探的话说就是:“我不重装整个房间的灯,只给该暗的缝补上阴影。”

A(p)=(1N∑i=1NV(p,si))kA(p) = \left( \frac{1}{N} \sum_{i=1}^{N} V(p, s_i) \right)^{k}
中心像素 \(p\) 的遮蔽因子 \(A\),等于它周围 \(N\) 个采样点中“被挡住”的比例,再用指数 \(k\) 调节对比度。
  1. 采样点集合对像素 \(p\) 周围 \(N\) 个点 \(s_1, s_2, \dots, s_N\) 分别判断是否被遮挡。
    N:采样总数,si:第i个采样点N:采样总数,s_i:第i个采样点
  2. 遮挡判定函数\(V(p, s_i)\) 取 1 表示采样点被遮挡,取 0 表示能照到光。
    V(p,si)∈{0,1}V(p, s_i) \in \{0, 1\}
  3. 遮挡率平均把所有 \(V\) 加起来除以 \(N\),得到被遮挡样本的占比,越接近 1 说明此处缝隙越深、越该暗。
    1N∑i=1NV(p,si)\frac{1}{N} \sum_{i=1}^{N} V(p, s_i)
  4. 指数调对比对比例取 \(k\) 次幂,\(k>1\) 时让中间程度的遮蔽向两端压缩,阴影过渡更干净。
    (⋅)k\left(\cdot\right)^{k}

核心思想

角落侦探看清问题的第一原则:绝不在三维世界里翻箱倒柜。传统全局光照要遍历场景中的所有几何体、光源,做无数次光线求交,成本高得吓人。侦探选择站在已经“拍好”的照片前动手——这就是“屏幕空间”的意思。

渲染管线中,GPU 在生成画面时一定会附带一张深度缓冲,它记录了每个像素离相机有多远。这份深度图在侦探眼里,就是一张房间的“立体地形图”——哪里凸起、哪里凹陷、哪里有缝,全藏在数值的相对大小里。

于是,核心套路变成三步:取当前像素的深度值,在它周围撒一圈采样点,读取采样点的深度值做比较。如果某个采样点的深度比中心更“近”(离相机更近),说明中心的光线被那个凸起挡死了,这个方向就要算作遮挡。

这就好比侦探拿着一把刻度尺,站在墙角比划:尺子伸向某个方向,若触到墙就算被挡住。整体流程不需要知道墙用什么材质、灯光在哪儿、阴影锥怎么画,只需一张深度图就能推理出遮蔽信息。

用公式表达遮挡判定:

深度缓冲就是侦探的“标尺”,有了它,屏幕空间的计算就完全不需要三维几何信息。

V(p,si)={1,D(si)<D(p)−ε0,otherwiseV(p, s_i) = \begin{cases} 1, & D(s_i) < D(p) - \varepsilon \\ 0, & \text{otherwise} \end{cases}
当采样点深度 \(D(s_i)\) 比中心深度 \(D(p)\) 小超过阈值 \(\varepsilon\) 时,视为有几何体挡在中心与光源之间。
  1. 中心像素深度\(D(p)\) 是当前像素的深度值,它代表这条光线方向上最近的那个表面。
    D(p)D(p)
  2. 采样点深度\(D(s_i)\) 是中心周围邻域内某个偏移位置的深度值。
    D(si)D(s_i)
  3. 深度偏差减去 \(\varepsilon\) 是为了避免平面自身的数值误差造成误判,称为深度偏差。
    D(p)−εD(p) - \varepsilon
  4. 比较判断采样点深度更小说明它更靠近相机、在中心前方凸起,中心被它挡住了。
    D(si)<D(p)−εD(s_i) < D(p) - \varepsilon

算法流程

设计好思路后,角落侦探的完整查案流程分为四步。

第一步,重建法线。虽然深度图只有“远近”信息,但侦探可以从深度的坡度推算出表面的朝向——就像看地图上的等高线,坡越陡,朝向越偏。用深度值在水平和垂直两个方向的梯度做叉积,就能得到每个像素的近似法线。

第二步,生成采样核。知道了表面法线,就能在其朝向的半球空间里随机撒采样点,保证采样点都落在“表面之上”的那一侧,不会被表面自身挡住。

第三步,深度比较测试。对每个采样点读深度、与中心深度按上节的公式比较,统计被遮挡个数。

第四步,输出遮蔽因子。把遮挡比例归一化后写入一张灰度图,称为AO贴图,后续光照合成时用它把对应像素调暗。

法线重建公式:

至此,从深度图到法线、再到采样核,侦探已经备齐了全部侦查工具,只需挨个像素执行比较即可。

n(p)=normalize((∂D∂x,∂D∂y,−1))\mathbf{n}(p) = \mathrm{normalize}\left( \left( \frac{\partial D}{\partial x}, \frac{\partial D}{\partial y}, -1 \right) \right)
从深度图在 \(x\)、\(y\) 方向的偏导重建三维法线。
  1. 深度梯度\(\frac{\partial D}{\partial x}\) 表示深度沿水平方向的变化率,陡峭边缘变化大。
    ∂D∂x,∂D∂y\frac{\partial D}{\partial x}, \frac{\partial D}{\partial y}
  2. 构造三维向量把水平、垂直两个梯度与 \(-1\) 组成三维向量,它的方向垂直于表面。
    (∂D∂x,∂D∂y,−1)\left( \frac{\partial D}{\partial x}, \frac{\partial D}{\partial y}, -1 \right)
  3. 归一化除以向量长度,得到单位法线向量。
    normalize(⋅)\mathrm{normalize}(\cdot)

采样策略

直接在每个像素周围随机撒 16 个点,得到的 AO 图会布满噪点,像侦探的墨点撒得东一个西一个,毫无章法。因此采样策略讲究三个技巧。

第一是半球采样定向。采样点必须落在法线半球内,否则会让大部分采样点到表面背面去,白白浪费采样次数。配合均匀随机分布或余弦加权分布,能让采样方向更贴近真实光线的入射概率。

第二是随机旋转。如果所有像素使用同样一组固定偏移方向,会出现规律的带状伪影——像百叶窗一样一条条的。解决办法是给每个像素的采样核乘一个随机旋转矩阵,让噪声被打散成高频颗粒,便于后续模糊。

第三是空间模糊。打散后的高频噪声用一个小半径模糊核即可消除,但有缝隙边缘不能过度模糊,否则会把阴影“糊开花”。所以工程中常用双边滤波——只在深度相近的像素之间做平均,保留几何边缘。

加随机旋转后的采样方向:

这一套“半球定向 + 随机旋转 + 模糊降噪”的组合拳,正是侦探控制画质的关键手艺。

si′=R(θ)⋅si\mathbf{s}_i' = \mathbf{R}(\theta) \cdot \mathbf{s}_i
把标准采样核 \(\mathbf{s}_i\) 绕法线旋转一个随机角度 \(\theta\),以打散规律性伪影。
  1. 采样核\(\mathbf{s}_i\) 是法线半球内生成的一组方向向量。
    si∈R3\mathbf{s}_i \in \mathbb{R}^3
  2. 旋转矩阵\(\mathbf{R}(\theta)\) 是绕法线轴旋转 \(\theta\) 角度的旋转矩阵,每个像素随机取不同的 \(\theta\)。
    R(θ)\mathbf{R}(\theta)
  3. 旋转后采样方向\(\mathbf{s}_i'\) 是实际采样的新方向,因为随机旋转,相邻像素之间噪声没有相关性,就不会形成带状条纹。
    si′\mathbf{s}_i'

参数调优

角落侦探出任务时,随身携带一个工具箱,里面有几个关键的旋钮,决定阴影最终是“清淡”还是“厚重”。

采样半径:半径越大影响范围越广,阴影更柔和,但容易把不相干的几何体也算进来,产生俗称的“光晕”;半径太小则只能覆盖极窄的缝隙,看不到大范围遮挡。样本数量:样本越多噪声越低、结果越准,但性能开销线性增长。遮蔽强度:控制遮蔽因子的缩放比例,强度高阴影深,强度低则若有若无。深度偏差:防止平面自遮挡的小阈值,调得过大会让薄片物体漏掉阴影,调得过大则产生“膨胀”感。

一个常用的经验关系是:把遮蔽因子强度调到柔和范围,让暗部落在 0.85–0.95 的亮度区间,视觉上最自然。

遮蔽强度调整公式:

参数调优没有万能解,侦探只能像厨师试盐一样,在不同场景里反复品尝和微调。

C′(p)=C(p)×(1−k⋅A(p))C'(p) = C(p) \times (1 - k \cdot A(p))
原始颜色 \(C(p)\) 乘上衰减系数即可得到加了AO的效果,\(k\) 为遮蔽强度旋钮。
  1. 原始颜色\(C(p)\) 是光照计算后该像素原本的颜色。
    C(p)C(p)
  2. 遮蔽因子\(A(p)\) 来自之前的深度比较统计,0表示无遮蔽,1表示完全遮蔽。
    A(p)A(p)
  3. 强度旋钮\(k\) 控制AO对最终亮度的影响权重,可以连续调节阴影浓淡。
    kk

工程实战

最后一步,角落侦探要真正走进工业流水线,和渲染管线并肩作战。

在实际项目中,SSAO通常放在延迟渲染的几何阶段之后、光照合成之前。延迟渲染管线已经天然生成G-Buffer,其中包含了深度和法线信息,正好免费提供给SSAO使用。如果放在前向渲染中,则需要额外渲染一张深度图,开销增加一些。

性能优化方面,最通用的做法是半分辨率计算:把AO计算放在宽度和高度都缩小一半的缓冲上,然后再双线性上采样回全分辨率。这个技巧能砍掉约75%的采样开销,而肉眼几乎察觉不到差异,因为AO本身就是低频信息。

当然,工程上也有取舍。移动端GPU上通常只用 8 个采样点加四分之一分辨率;而PC大作的PC版本则可上到 32 个采样点、完整的半分辨率步进。还要注意缺陷:SSAO只能看到屏幕内物体的遮蔽,屏幕外几何信息缺失,边缘处可能出现错误暗边;对大面积低频遮挡(比如天光从窗户撒入)也力不从心,这时需要升级到GTAO、HBAO+等更高级算法。

角落侦探至此完成了使命:他没有推倒重建光照系统,却用极低的成本让场景告别“悬浮感”。这正是屏幕空间技术在实时渲染世界中经久不衰的魅力。

AI 应用场景

手游开放世界:角色与地面接触阴影

阶段:实时渲染后处理

解决的问题:传统移动端光照模型让角色像浮在地面上,缺少接触点的那一圈柔影,让画面显得廉价。

具体案例:某开放世界手游引入移动端SSAO,将AO计算降至四分之一分辨率、每像素仅8个采样点,配合强力高斯模糊。玩家角色站在墙角、蹲在草丛中时,脚底和墙体接触点会自然出现一圈暗影,整体场景立体感显著提升,而帧率仅下降2毫秒。

建筑可视化:室内角落的层次感

阶段:离线渲染与实时预览结合

解决的问题:建筑效果图中,室内墙角、桌腿与地板交界处缺乏暗部层次,导致空间纵深感不足。

具体案例:建筑设计平台在实时预览中启用SSAO后,茶几与地毯的接触处出现淡淡阴影,衣柜与墙面缝隙也自然压暗。设计师无需等待光线追踪出图,就能在交互漫游中感受到真实的空间关系,显著提高方案汇报效率。

数字人虚拟演播室:消除拼接感

阶段:虚拟制作实时合成

解决的问题:数字人与虚拟场景合成时,人物脚底和桌面接触处缺少阴影,看起来像后期抠像没抠干净。

具体案例:在虚拟制片流程中,SSAO被用于对数字人与场景的合成画面做后处理,人物与虚拟地面交接处自动生成接触阴影,将“飘浮”的违和感降到最低。该方案不需要改动底层渲染引擎,接入快捷,成为中小型虚拟演播室的常用增强手段。

Python 演示

python64 行
import numpy as np class SSAOSimulator:    def __init__(self, width=64, height=64):        self.width = width        self.height = height        self.bias = 0.02        self.radius = 0.15        self.sample_count = 16     def make_scene_depth(self):        # 生成一张简化深度图:斜平面 + 凸起方块        x = np.linspace(0, 1, self.width)        z = np.linspace(0, 1, self.height)        grid_x, grid_z = np.meshgrid(x, z)        depth = 0.5 + 0.2 * grid_z        block = (grid_x > 0.4) & (grid_x < 0.6) & (grid_z > 0.4) & (grid_z < 0.6)        depth[block] = 0.25        return depth     def calc_ao(self, depth):        h, w = depth.shape        ao = np.zeros((h, w))        offsets = []        # 在法线立方的近似下半球方向撒随机偏移(屏幕空间二维)        for _ in range(self.sample_count):            ang = np.random.rand() * 2 * np.pi            rad = np.random.rand() * self.radius            offsets.append((np.cos(ang) * rad, np.sin(ang) * rad))        for i in range(h):            for j in range(w):                center = depth[i, j]                blocked = 0.0                for dx, dz in offsets:                    ni = int(i + dz * h)                    nj = int(j + dx * w)                    if 0 <= ni < h and 0 <= nj < w:                        if depth[ni, nj] < center - self.bias:                            blocked += 1.0                ao[i, j] = blocked / self.sample_count        return ao     def blur_ao(self, ao, kernel=3):        h, w = ao.shape        pad = kernel // 2        out = np.zeros((h, w))        for i in range(pad, h - pad):            for j in range(pad, w - pad):                out[i, j] = ao[i-pad:i+pad+1, j-pad:j+pad+1].mean()        return out     def run(self):        depth = self.make_scene_depth()        ao = self.calc_ao(depth)        ao_smooth = self.blur_ao(ao, 5)        return depth, ao, ao_smooth if __name__ == '__main__':    sim = SSAOSimulator()    depth, ao, ao_smooth = sim.run()    print("深度图范围: {:.3f} ~ {:.3f}".format(depth.min(), depth.max()))    print("遮蔽因子范围: {:.3f} ~ {:.3f}".format(ao.min(), ao.max()))    print("模糊后遮蔽因子范围: {:.3f} ~ {:.3f}".format(ao_smooth.min(), ao_smooth.max()))    print("凸起方块中心遮蔽因子: {:.3f}".format(ao_smooth[32, 32]))
目的:用 numpy 模拟SSAO的核心计算流程,从一张深度图出发完成邻域采样、深度比较和模糊降噪,输出遮蔽因子分布。
  1. depth[block] = 0.25在场景深度图中放置一个凸起的方块,模拟墙角或遮挡物。
  2. offsets.append((np.cos(ang) * rad, np.sin(ang) * rad))在二维平面内随机撒采样偏移,模拟屏幕空间的方向采样。
  3. if depth[ni, nj] < center - self.bias采样点深度小于中心深度时,认为中心被挡住,累加遮蔽计数。
  4. ao[i, j] = blocked / self.sample_count遮挡数除以样本数得到遮蔽因子,越接近1代表缝隙越深。
  5. self.blur_ao(ao, 5)对原始AO图做模糊,消除随机采样产生的颗粒噪声,得到柔和的阴影效果。

常见误区

误区SSAO是在三维场景里发射光线、计算光线弹射,类似于光线追踪,所以效果和全局光照一样。

正解SSAO并不发射光线。它只是把渲染好的深度图当作一张二维高度图,在像素邻域内采样深度做大小比较,用比值近似遮挡程度。它连屏幕外的几何体都不知道,只利用已有的深度缓冲推算局部遮蔽,是一个启发式近似。

为何常见:名字里有“遮蔽”“环境光”,容易让人联想到真实光线传播;加上看效果图很像软阴影,就误以为做了全局光照。

误区SSAO采样半径设得越大,就能捕捉越大的遮蔽范围,阴影效果一定越好。

正解半径过大会产生“光晕”伪影,即某些正常表面也被周围无关几何体误判为遮蔽,导致大面积灰蒙蒙。半径应当与画面中的几何尺度匹配,比如人物脚底用0.3~0.5米、建筑周边用1~2米,按场景单位灵活调节。

为何常见:新手容易只盯“阴影更明显”这个现象,忽略了过度遮蔽造成的整体发灰和质量下降。

误区深度偏差是防止自遮挡的,那干脆设大一点,一劳永逸不出现灰斑。

正解偏差过大会让真正的细小缝隙被忽略,比如布料褶皱、人物手指间的暗影会完全丢失,AO效果变平。偏差的作用是抵消深度缓冲精度误差,不用于抹平真实遮蔽。正确做法是让偏差与采样半径成比例,并参考深度缓冲的精度量级。

为何常见:自遮挡问题调试起来很烦,调大偏差似乎是立竿见影的解法,但副作用需要仔细检查才能发现。

误区只要场景里有遮挡关系,SSAO都能识别出来。

正解SSAO只认识“屏幕空间”里有信息的几何体。如果遮挡物在相机视野之外,深度缓冲里根本没有它的数据,SSAO自然无法感知。因此在屏幕边缘或物体刚出现的位置,AO会出现明显的跳变伪影。这是TAAO、HBAO+等方法试图缓解的固有缺陷。

为何常见:屏幕空间听起来像“每个像素的信息”,但深度图本质是相机可见表面,背后信息天然缺失。

误区有了SSAO,场景就不需要其他全局光照技术了。

正解SSAO只负责“遮蔽”这一个维度,主要影响环境光的局部衰减。它不处理镜面反射、折射、漫反射多次弹射之间的颜色渗透。真正的大范围全局光照(如天光渐变、镜面反射色彩浸润)仍需Lightmap、Irradiance Volume或实时光追等方案补充。

为何常见:展示效果中AO带来的接触阴影提升极为直观,让人误以为这就是全部全局光照功劳。

面试题

Q1. SSAO中“屏幕空间”指的是什么?

单选题 · easy

  • A.在透视投影裁剪后的二维图像空间计算结果← 正确答案
  • B.在三维模型的世界坐标系中计算
  • C.仅在光源空间中进行采样
  • D.在CPU端进行几何求交计算

答案:A。屏幕空间指相机看到的二维画面空间,SSAO利用的是深度缓冲在屏幕像素网格上的采样,不依赖三维几何世界。它像侦探在拍好的照片上工作,而不是回到房间现场。

Q2. SSAO输入的关键数据源是什么?

单选题 · easy

  • A.顶点颜色
  • B.深度缓冲← 正确答案
  • C.法线纹理
  • D.环境贴图

答案:B。SSAO核心输入是深度缓冲,因为它的算法本质就是比较邻域像素深度值。法线纹理在改进版本中用于让采样核贴合表面,但不是最基础输入。

Q3. SSAO与传统环境光常量模型相比,主要改善了什么问题?

单选题 · easy

  • A.阴影分辨率过低
  • B.物体接触处缺少阴影导致悬浮感← 正确答案
  • C.高光过曝
  • D.纹理分辨率不够

答案:B。传统光照模型把环境光设为常量,角落和缝隙被刷成同样亮度,于是物体像“漂浮”在场景中。SSAO按邻域深度比较补充接触阴影,消除悬浮感。

Q4. 深度重建法线时,通常对深度图做什么操作?

单选题 · mid

  • A.做傅里叶变换提取高频
  • B.计算水平与垂直方向的偏导数并组成三维向量← 正确答案
  • C.对深度值取对数
  • D.直接读取颜色缓冲的RGB通道

答案:B。法线重建利用深度图在x和y方向的梯度,构造出垂直于表面的向量,归一化即得近似法线。这像根据等高线盘的坡度判断山的朝向,而不是靠“山体颜色”。

Q5. 下列哪些措施可以改善SSAO的带状伪影?

多选题 · mid

  • A.对每个像素随机旋转采样核← 正确答案
  • B.增加空间模糊半径← 正确答案
  • C.对所有像素使用相同的固定偏移采样
  • D.降低采样半径

答案:AB。随机旋转能把规律性的带状条纹打散为高频噪声,再配合空间模糊过滤噪声,两者需要一起用。选项C正是带状伪影的成因,选项D只会缩小遮蔽范围,对带状形态改变有限。

Q6. 为什么SSAO无法感知屏幕外的遮挡物体?

单选题 · mid

  • A.因为采样点数量有限
  • B.因为深度缓冲只包含相机可见的表面信息← 正确答案
  • C.因为GPU无法访问屏幕外纹理
  • D.因为环境光强度太高

答案:B。深度缓冲记录的是每个像素上离相机最近的表面,屏幕外的几何体根本不在缓冲里,无法参与采样比较。侦探只看得见照片范围内的景物,照片外一概不知。

Q7. 关于SSAO中的深度偏差参数,下列说法正确的是:

多选题 · hard

  • A.用于避免平面自身的自遮挡误判← 正确答案
  • B.设置过大会导致细小缝隙的阴影消失← 正确答案
  • C.与采样半径无关,可以随意设
  • D.能消除屏幕边缘的信息缺失问题

答案:AB。深度偏差给比较加了一个容差,防止深度缓冲精度误差带来的自遮挡灰斑;但设置过大会把真实细微的凹凸也说成“没遮挡”,丢失细节。它不能解决屏幕边缘信息缺失。

Q8. 半分辨率SSAO的核心优化原理是?

单选题 · mid

  • A.减少像素染色次数
  • B.AO是低频信息,低分辨率计算后上采样视觉差异小← 正确答案
  • C.用深度缓冲代替颜色缓冲
  • D.模糊核会自动降噪无需计算

答案:B。环境光遮蔽是变化平缓的低频分量,先在半分辨率缓冲上采样、再做双线性上采样回全分辨率,肉眼几乎察觉不到差异,但采样开销减少约75%。

Q9. SSAO的效果会受到哪些参数显著影响?

多选题 · mid

  • A.采样半径← 正确答案
  • B.样本数量← 正确答案
  • C.相机曝光值
  • D.遮蔽强度← 正确答案

答案:ABD。采样半径决定影响范围,样本数量决定噪声水平,遮蔽强度决定暗部浓淡。相机曝光是色调映射层的参数,会全局影响亮度但不会改变AO计算本身。

Q10. 下列哪种算法与SSAO同属屏幕空间环境光遮蔽范畴?

单选题 · extreme

  • A.球谐光照
  • B.HBAO+← 正确答案
  • C.阴影贴图
  • D.环境映射

答案:B。HBAO+是NVIDIA在SSAO基础上发展的屏幕空间环境光遮蔽算法。球谐光照常用于光照烘焙,阴影贴图是直接光源的阴影算法,环境映射处理反射,三者都不属于屏幕空间环境光遮蔽家族。