SSAO
SSAO介绍
之前写SSAO的时候最后一直没达到想要的效果,最近闲下来又重新写了下,才发现自己之前真的蠢- -!(位置和法线忘转到视口坐标)。这里就好好整理一下这个算法,以免下次想拿起来又不知道怎么入手。
SSAO,即屏幕空间环境光遮蔽(Screen-Space Ambient Occlusion),说到SSAO,在这之前就需要了解AO(Ambient Occlusion),即环境光遮蔽。在很多古老的游戏里,我们所知道的环境光,游戏开发人员通常只给了一个单一的颜色值,但这实际上效果远差于真实场景。比如在我们的房间里,四个角落的光线会远远暗于其他地方。我们的光在散射的时候,在这种褶皱,孔洞中通常会难以反射出来到达我们的眼睛,所以这些地方看着会更加的暗。
如下图:
我们发现相比前两幅图,加上SSAO的第三幅图有更加真实的感觉,没有添加SSAO的图一和图二会给我们一种物体浮在空中的感觉,而图三则会给人正确放置的感觉。
但是环境光遮蔽采用对空间中每一点发射大量光线,并在片元周围几何体计算光线丢失,这会带来极大的性能开销。在2007年,Crytek公司发布了一款叫做屏幕空间环境光遮蔽(Screen-Space Ambient Occlusion, SSAO)的技术,并用在了他们的看家作孤岛危机上。这一技术使用了屏幕空间场景的深度而不是真实的几何体数据来确定遮蔽量。这一做法相对于真正的环境光遮蔽不但速度快,而且还能获得很好的效果,使得它成为近似实时环境光遮蔽的标准。
SSAO的原理比较简单:对于铺屏四边形(Screen-filled Quad)上的每一个片段,我们都会采样周边的深度值计算一个遮蔽因子(Occlusion Factor)。这个遮蔽因子之后会被用来减少片段的环境光照分量。遮蔽因子是通过采集片段周围半球型核心(Kernel)的多个深度样本,并和当前片段深度值对比而得到的。高于片段深度值样本的个数就是我们想要的遮蔽因子。