Screen Space Ambient Occlusion

Screen Space Ambient Occlusion

    简称SSAO,是实现AO的一种方法,其运算量低且效果还可以接受,所以用作实时渲染AO算法。SSAO又细分有多种算法,其中有Crytek的SSAO,有nVidia的HBAO等,而最简便的是GameDev上一篇SSAO文章里的方法。无论什么方法,都是通过采样像素附近区域的几何信息,计算遮蔽因数。HBAO方法比较复杂,但有理论依据,而GameDev的方法比较简单,通过调整相关参数就能得到满意效果,如下图(是的,又是茶煲一个):

 

本文也就是GameDev方法的中文注释。

    既然SSAO称为SSAO,那么这个方法肯定是在Screen Space内实施的,Screen Space也就是Deferred Shading内Geometry Stage的输出。在Geometry Stage,场景内所有物体的Geometric Information都记录到G-Buffer上。一般情况下,G-Buffer的分辨率与BackBuffer相同,也就是说,G-Buffer与计算机屏幕是点对点的,所以,凡是围绕G-Buffer做文章的技术,都可以称之为基于Screen Space的技术,例如有基于Screen Space的AA算法,有Screen Space Subsurface Scattering算法等。

    此方法基本思路是,遮蔽因数由1.遮蔽与被遮蔽者之间的距离及2.遮蔽者的Normal与被遮蔽者之间的夹角有关:Occlusion = max( 0.0, dot( N, V) ) * ( 1.0 / ( 1.0 + d ) )。其中,N是当前像素(被遮蔽者)的Normal,V是由被遮蔽者指向遮蔽者的归一化向量,d是遮蔽与被遮蔽者之间的距离,如图:

 

NVd都可以从G-Buffer获取,具体方法可参阅我之前的《Deferred Shading》,这里也粗略说一下,N就是G-Buffer的Normal(view space),V=normalize(P1-P2),P1及P2分别是遮蔽者和被遮蔽者的view space position,P1及P2从G-Buffer的Depth恢复出来。需要注意的是,这里的NVd一定要在同一个Space下(例如在View Space),这样的计算结果才有意义。

    遮蔽者也就是Occluder通过采样像素临近区域来获取,采样坐标是上下左右1像素旋转45度及90度确定,并且加入噪声texture对采样坐标进行一定的位移,减少采样模式的重复出现。

    SSAO处理是在Geometry Stage之后进行,可以作为单独一个Stage或者与Lighting Stage结合在一起。下面的SSAO及NOAO的对比:

 

 

请注意茶煲的把柄附近区域的颜色。

    GameDev上还介绍了Backface occlusion的实现,增强AO效果。

    SSAO是一个不错渲染效果,有兴趣的朋友可以自己试试,对于已实现Deferred Shading的renderer来说,添加SSAO效果相对来说很方便。

原文地址:https://www.cnblogs.com/rickerliang/p/2045906.html