实时全局光照Screen Space Ambient Occlusion(SSAO)

屏幕空间

  •  可以拿到的所有信息只能从屏幕中所看到的获取,即在做全局光照之前能在屏幕上看到的->直接光照。
  • 换句话说,对现有的渲染进行后期处理。


 环境光遮蔽

 为什么要做环境遮蔽?

  •  实施成本低
  • 增加了场景的立体感

什么是环境光遮蔽?

  • 全局光照的近似
  • 在屏幕空间上获取信息

重要假设1:

  • 我们不知道间接光照信息
  • 对于屏幕空间上的任何一个点,假设从任何方向的间接光照是个常数
  • 这和blin-phong着色模型中的环境光照(自发光)相似。

 重要假设2&3:

  •  考虑可见性的不同:任何一个shadow point接收来自不同方向的间接光照强度是一样的,但是不同方向的间接光照不一定会都接收的到。
  • 此外,假设所有的shadow point都是漫反射材质。

        比如说 下图中的两个点,来自不同方向的间接光照相同,但是红色部分的间接光照被挡住了(不可见)接收不到。左图中的可接收到的多一些所以亮一些,右图接收到的少一些所以暗一些。

如何判断间接光照可见度

        在世界空间里,可以做光线追踪,从shadow point在一定范围内(不限制范围的话光线肯定会发生碰撞)往各个方向发射一段光线,将这些光的可见性加权平均起来。

 在屏幕空间上做出一个大胆的假设:

  1.  任何一个shading point 往它的半径为R的球内采样很多的点,判断采样的点是否能被shadow point直接看到
  2. 如何知道哪些点能被shadow point直接看到呢?从camera看向物体记录物体的深度,如果采样的点的深度小于shadow point点的深度,那么就认为该采样点能被shadow point 直接看到,否则就认为不能看到 。(下图中中间的红点这种情况可能会判断错误,但是工业界上这种误差可以忽略)
  3. 但是现实情况下,任何一个shadow point 的visibility(可见性)应该是从法线的半边球来判断,不可能是从整个球的方向判断可见性(光线不可能从物体的底部传过来)(这里是假设不知道屏幕空间上每个shadow point的法线方向)。所以这里再假设如果有一半的采样点可见,就当做没有东西挡住该shadow point ,可见度为1;否则,就将可见点除以所有的点得到可见度(0~1之间),将可见度乘以环境光照就是该点的间接光照强度(环境光照强度)。

 可能出现的问题

        图中在桌角处地面的一定范围内采样,采样点会采样到桌子上,(在屏幕空间上,所以不知道shadow point的桌面后的附近的点的深度)所以会认为该点的深度肯定会小于shadow point点的深度,会错误地认为该点可见性为1,会出现这种不自然的情况

 采样:

 可以先使用少量的sample,得到一张noise的AO

 然后再做一遍降噪处理

 参考视频

猜你喜欢

转载自blog.csdn.net/qq_48626761/article/details/127244737