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

  • 相关阅读:
    CSS3 字体
    capitalized-comments (Rules) – Eslint 中文开发手册
    heapq (Data Types) – Python 中文开发手册
    Java中的Java.lang.Math类| 1
    shell脚本的条件测试与比较
    centos7关闭防火墙
    vmwaretool安装
    mongodb
    php中0与空 Null false的区别
    git使用总结
  • 原文地址:https://www.cnblogs.com/rickerliang/p/2045906.html
Copyright © 2020-2023  润新知