屏幕空间
- 可以拿到的所有信息只能从屏幕中所看到的获取,即在做全局光照之前能在屏幕上看到的->直接光照。
- 换句话说,对现有的渲染进行后期处理。
环境光遮蔽
为什么要做环境遮蔽?
- 实施成本低
- 增加了场景的立体感
什么是环境光遮蔽?
- 全局光照的近似
- 在屏幕空间上获取信息
重要假设1:
- 我们不知道间接光照信息
- 对于屏幕空间上的任何一个点,假设从任何方向的间接光照是个常数
- 这和blin-phong着色模型中的环境光照(自发光)相似。
重要假设2&3:
- 考虑可见性的不同:任何一个shadow point接收来自不同方向的间接光照强度是一样的,但是不同方向的间接光照不一定会都接收的到。
- 此外,假设所有的shadow point都是漫反射材质。
比如说 下图中的两个点,来自不同方向的间接光照相同,但是红色部分的间接光照被挡住了(不可见)接收不到。左图中的可接收到的多一些所以亮一些,右图接收到的少一些所以暗一些。
如何判断间接光照可见度
在世界空间里,可以做光线追踪,从shadow point在一定范围内(不限制范围的话光线肯定会发生碰撞)往各个方向发射一段光线,将这些光的可见性加权平均起来。
在屏幕空间上做出一个大胆的假设:
- 任何一个shading point 往它的半径为R的球内采样很多的点,判断采样的点是否能被shadow point直接看到
- 如何知道哪些点能被shadow point直接看到呢?从camera看向物体记录物体的深度,如果采样的点的深度小于shadow point点的深度,那么就认为该采样点能被shadow point 直接看到,否则就认为不能看到 。(下图中中间的红点这种情况可能会判断错误,但是工业界上这种误差可以忽略)
- 但是现实情况下,任何一个shadow point 的visibility(可见性)应该是从法线的半边球来判断,不可能是从整个球的方向判断可见性(光线不可能从物体的底部传过来)(这里是假设不知道屏幕空间上每个shadow point的法线方向)。所以这里再假设如果有一半的采样点可见,就当做没有东西挡住该shadow point ,可见度为1;否则,就将可见点除以所有的点得到可见度(0~1之间),将可见度乘以环境光照就是该点的间接光照强度(环境光照强度)。
可能出现的问题
图中在桌角处地面的一定范围内采样,采样点会采样到桌子上,(在屏幕空间上,所以不知道shadow point的桌面后的附近的点的深度)所以会认为该点的深度肯定会小于shadow point点的深度,会错误地认为该点可见性为1,会出现这种不自然的情况
采样:
可以先使用少量的sample,得到一张noise的AO
然后再做一遍降噪处理