文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>Screen Space Ambient Occlusion

Screen Space Ambient Occlusion

时间:2011-05-13  来源:rickerliang

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效果相对来说很方便。

相关阅读 更多 +
排行榜 更多 +
找茬脑洞的世界安卓版

找茬脑洞的世界安卓版

休闲益智 下载
滑板英雄跑酷2手游

滑板英雄跑酷2手游

休闲益智 下载
披萨对对看下载

披萨对对看下载

休闲益智 下载