zoukankan      html  css  js  c++  java
  • 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效果相对来说很方便。

  • 相关阅读:
    uniapp 分包加载
    input和textarea中的placeholder与光标位置不一致问题
    uniapp调取摄像头扫码和生成二维码
    uniapp分享功能加传递参数
    js将后台传递的数组添加自定义的键值对
    uniapp返回上一层级带参数
    引入的字体文件包太大
    直接给变量赋值接口数据
    富文本编辑器上传不了微信文件夹的图片,使用vue-quill-editor编辑器
    博客园样式修改
  • 原文地址:https://www.cnblogs.com/rickerliang/p/2045906.html
Copyright © 2011-2022 走看看