实测照片数据揭示:屏幕空间环境光遮蔽(SSAO)渲染效果是否失真?
角落不该是那样的:关于屏幕空间环境光遮蔽
游戏开发者对屏幕空间环境光遮蔽(SSAO)情有独钟,甚至会做出疯狂之事。业余开发者截图中,凸角在角落附近更亮;专业开发者的游戏里,会出现怪异光晕和难看瑕疵。即便避免这些问题,采用 SSAO 的游戏画面仍不对劲,房间角落常异常黑暗。
作者认为,这是因为人们觉得房间角落本就暗,并据此编写代码,产生了不真实效果。具体而言,SSAO 在这些情况下失效,由四个因素导致:使用 SSAO 而非环境光遮蔽(AO)带来的近似误差;使用 AO 而非辐射度算法带来的近似误差;将 SSAO 暗化效果应用于所有光照而非仅环境光产生的误差;调优误差,即 AO 效果的启发式权重设置过强。
角落不该是那样的(大多数时候)
展示的都是照片,非渲染图。照片用佳能 5D Mk II 拍摄,导出为 JPEG 格式,曝光时间 1/80 秒到 1/8 秒不等。原始大尺寸 JPEG 图片在 Adobe Photoshop 中每个维度约缩小为原来的四分之一,缩小前用 Photoshop 中 16 像素宽的高斯模糊对色度通道进行模糊处理,以减少长曝光图片中的色度噪点。
一个显著变暗的角落
作者在公寓找到一个看似典型 SSAO 渲染效果的角落,但实际并非如此。墙壁(c)无法接收光线,墙壁(d)有较多光线照射。墙壁(d)左侧边缘变暗,主要是左上方屏幕外光线产生的柔和阴影,而非 AO。墙壁(b)和墙壁(c)之间左侧角落虽投下阴影,但因离光源近,阴影扩散成大片柔和影子。
墙壁(d)顶部边缘是阴影,因光源嵌入式,光线从凹槽反射,凹槽边缘使墙壁顶部无法接收光线。墙壁(c)右侧边缘以及天花板(a)靠近墙壁(d)边缘处的变暗效果,可能是朗伯点积引起的间接光照效果,被夸大了。墙壁(c)和天花板(a)之间的边缘,靠近时会变暗,但其变暗程度及是否为心理错觉有待确定。
相机可能无法真实感知,但至少我们能绘制图表
照片声称采用 sRGB 色彩空间,但转换后可能无法得到线性光值,存在复杂色调映射处理,难以确定照片反映现实的程度。不过可了解对照片的感知,通过查看边缘像素值并绘图,能直观看到边缘两侧表面靠近边缘时的变暗情况。
例如,对穿过(c)和(d)之间边缘的线采样绘图,左侧靠近边缘时光照变暗更快,右侧呈线性上升,边缘处有明显下降,原因不明。(a)和(d)之间边缘图表类似,(a)和(c)之间边缘效果更接近“现实世界的 AO”,靠近边缘处明显变暗,但程度降低,中心无下降。比较图表需谨慎,因线段透视缩短情况不同,图表会自动缩放。
没有明显柔和阴影的角落样本
展示一张包含三个角落的图片,分别分析左侧、中间、右侧角落。左侧角落唯一直射光来自左侧,现实中较暗,天花板靠近边缘稍变暗,墙壁仍亮。中间角落长曝光照片亮度适中,图表比预期平坦,很多变暗效果可能是马赫带效应。右侧角落主要是间接光照,后墙效果轻微,左侧墙壁和天花板效果明显,但因透视缩短被增强。
房子里最暗的房间
黑暗浴室边缘有一些变暗,但程度不大。放大近景拍摄后,查看具体数值,不同图表对比可能因线段在世界空间中长度不同导致差异。
更多角落
离光源近的角落,边缘亮度衰减部分是直射光衰减,无额外需 SSAO 模拟的边缘亮度衰减。当前打字位置上方的角落,不像糟糕的 AO 暗化效果,右侧墙壁因朝向光源更亮,左侧墙壁在显示器边界上方因另一盏灯阴影明显变暗,基本无角落变暗效果,只有左侧墙壁靠近天花板的线有明显变暗效果,但使用 AO 会让其他部分更不真实。
最后一件事
查看天花板和墙壁之间的边缘,光源在右侧,向左移动光线变暗,环境光影响增大。图表显示天花板边缘暗化效果增强,墙壁呈现相反效果。
我的观点
墙壁之间的凹边界处存在边缘暗化效果,但很微妙,只在某些情况下出现。只有相对表面因其他原因在边缘处明显变暗时,才会出现强烈边缘暗化效果,这可能并非 SSAO 所呈现的效果。
附录 A
给出根据点列表和图像文件名生成图表的代码。