【GAMES202】Real-Time Global Illumination(screen space)2—实时全局光照(屏幕空间)2

一、Screen Space Directional Occlusion (SSDO)

1.Idea

【GAMES202】Real-Time Global Illumination(screen space)2—实时全局光照(屏幕空间)2_第1张图片

SSDO可以理解为SSAO的升级版,SSAO中我们假设了任何一个着色点接收的来自四周的间接光照为常数,简化了计算。但实际上,我们是可以精确的求出间接光照的,所以没必要做这个假设。并且如上图所示,SSAO确实能使物体角落产生变暗,但它无法达到上图中最右下角图中的效果,即互相的反射,如图中的蓝方块上会有一些黄色,这种才是我们想要的全局光照的效果,而不是SSAO这种简单的变黑。

2.SSAO&SSDO

【GAMES202】Real-Time Global Illumination(screen space)2—实时全局光照(屏幕空间)2_第2张图片

对比一下SSAO的做法,我们发现其实SSDO和SSAO的假设是完全相反的,如上图所示,左边表示SSAO,右边则表示SSDO。我们发现在SSAO中被认为会被遮蔽的方向,在SSDO中却被认为成了是间接光来源的方向。实际上这两种做法都是不准确的。SSAO的做法默认了间接光都来自远处而忽略了近处表面贡献的间接光,而SSDO则忽略了远处的间接光照而只考虑了近处。所以才会导致相反的情况,而实际上要想得到准确的全局光照,近处和远处的间接光是都要考虑在内的。

3.Compute

【GAMES202】Real-Time Global Illumination(screen space)2—实时全局光照(屏幕空间)2_第3张图片

回到渲染方程,对于Visibilty=1,也就是不被遮挡的地方,SSDO不考虑,而对于Visibility=0的地方,SSDO认为接受到了间接光照,这时候就需要把贡献考虑进去了。如上图所示。至于如何计算,参考我们前面说的RSM等方法,考虑周围的patch,认为反射物体都是Diffuse的,那么间接光照的贡献自然可以计算。 

【GAMES202】Real-Time Global Illumination(screen space)2—实时全局光照(屏幕空间)2_第4张图片

SSDO的检测采样做法和SSAO完全一样,如上图所示,在法线方向半球,(这里我们就假设已经知道法线了),撒点,然后根据深度图和投影到Camera的深度的对比来判断是否能对P点产生遮挡。

如果被遮挡,如上图第二幅图所示,根据法线计算它们对P点的贡献之和。其次图1的C点没有被挡到,于是我们可以直接采样环境光的直接光照,也就是说SSDO还提供了一种做环境光照的方法,当然这里并不是重点。

同样的,因为这只是一种近似的判断方法(因为我们并不想从P点发出射线去追踪,这种做法开销太大了),所以近似仍然会和SSAO发生同样的问题,如上图第三幅图所示,就是屏幕空间深度并不能完整描述世界空间信息导致的,这个问题在上篇的SSAO中的拐角几何导致的错误和False occlusion中已经解释过了,这里不再赘述。

4.Issues

【GAMES202】Real-Time Global Illumination(screen space)2—实时全局光照(屏幕空间)2_第5张图片

SSDO的质量和计算开销还是不错的。它的问题主要集中在SS上,也就是集中在屏幕空间的问题上。屏幕空间的共有问题就是只能获取屏幕上的信息,而对于所有深度大于我们屏幕上片元深度的其它信息我们全都不知道。

由于屏幕空间的特性就会导致上图所示的现象。如图,当我们的视角能看到荧光绿色方块的正面的时候,我们可以清晰地看到地面上反射出的荧光绿色的间接光照,但当视角转变,我们看不到方块正面的时候,地面上反射的间接光照也随之消失,因为从屏幕上根本获取不到它的信息,这显然是不正确的。

【GAMES202】Real-Time Global Illumination(screen space)2—实时全局光照(屏幕空间)2_第6张图片

另一个问题在我们上面提SSAO和SSDO区别的时候已经说了,SSDO只能解决一个小范围的全局光照问题,对于远处的间接光照没有考虑,所以如果用SSDO渲染上面的图时,图中正方体的标注面是绝对不会反射出绿色墙面的。 

二、Screen Space Reflection (SSR)

【GAMES202】Real-Time Global Illumination(screen space)2—实时全局光照(屏幕空间)2_第7张图片 左:开启SSR  |  右:关闭SSR

SSR其实可以理解为一种光线追踪,因为它的本质其实和我们前面提到的Path Tracing基本一样。只不过就只是在屏幕空间做而已。 

1.Basic Algorithm—Mirror Reflection 

【GAMES202】Real-Time Global Illumination(screen space)2—实时全局光照(屏幕空间)2_第8张图片

关于SSR我们先来考虑最简单的情况,也就是镜面反射的SSR,如上图,最基础的输入就算法线和深度,根据这些信息,我们要计算地面上每个像素反射的颜色是什么。

【GAMES202】Real-Time Global Illumination(screen space)2—实时全局光照(屏幕空间)2_第9张图片

这里我们用到了光线步进,如上图,根据深度我们知道像素的起始点,我们又知道法线和视线方向,自然就知道反射方向。从反射方向步进,每步进一步,我们都可以投影回Camera比较步进终点的深度和相机记录的最浅深度,如果步进终点的深度>深度图的最浅深度。我们自然就可以求交点了。当然,这里肯定要做步长的选择,步长过大可能会导致求交失败,过小又会造成过大的计算量。

2.Depth Mip-Map

【GAMES202】Real-Time Global Illumination(screen space)2—实时全局光照(屏幕空间)2_第10张图片

为了解决上面提到的步长问题,人们引入了一种新的东西,叫做Depth Mip-MapMip-Map我们很熟熟悉了,那么这里的Depth Mip-Map和普通的Mip-Map有什么区别呢?普通的Mip-Map形成的金字塔的每上一层图上的一个像素是下面一层四个像素的平均值我们知道。而Depth Mip-Map形成的图上的每上一层的像素的深度是下一层四个像素深度的最小值,这就是它们的区别。

【GAMES202】Real-Time Global Illumination(screen space)2—实时全局光照(屏幕空间)2_第11张图片

为什么要做Depth Mip-Map呢?自然是为了解决我们提到的步长问题,Depth Mip-Map能我们直接跳过哪些不可能相交的像素,这很像我们在GAMES101中提到的加速结构,如KD树,BVH这些。实际上,上面Depth Mip-Map所说的每上一层就取最小值就是不断建立节点的过程。

Depth Mip-Map的逻辑如上图所示,看第一幅图,两个标亮的蓝色框的深度在上一层级被标注成了一样的,实际上就是下一层级中它们两个的最小深度,当检测相交的时候,如果光线连最浅深度都没有相交,那么就不可能与该层级下的任何一个像素有交点了,这和我们以前说的层次结构是一个道理。

另一种情况如第二幅图,检测到了某一较高层级(下面有两个子节点—标亮蓝色的部分)的交点,则向下搜索。发现和右边的子节点有交点,如第三幅图。之后再检测和右边的子节点的哪个子节点有交点。

3.Process

【GAMES202】Real-Time Global Illumination(screen space)2—实时全局光照(屏幕空间)2_第12张图片

之后我们来介绍一下使用了Depth Mip-Map后SSR的流程,伪码如上图所示。

【GAMES202】Real-Time Global Illumination(screen space)2—实时全局光照(屏幕空间)2_第13张图片

主要流程如上图顺序所示,1.先以一个较低的层级,也就是较少像素的步长步进,发现无相交。2.往上一个层级,也就是加大一个层级的步长步进,发现仍然没有交点。3.继续向上一个层级这次步长是步进4个像素,此时发现有交点。4.在上一步有交点的根节点向下搜寻子节点,发现和右边子节点有相交。5.这里特殊情况,由于最右边两个像素在同一层级,所以此时虽然光线只步进到左边的像素,但是已经接触了整个层级的最浅深度,于是两个子节点都没找到交点,但是没关系。6.由于没找到交点,于是再往上一个层级向前步进,这时碰到了6所示的两个绿色像素的层级的最浅深度。【GAMES202】Real-Time Global Illumination(screen space)2—实时全局光照(屏幕空间)2_第14张图片

于是再次向下一个层级搜索,这次找到了交点,整个算法完成。不难看出,整个算法其实就是一个不断试探找到自适应步长的过程。 

那么终止条件是什么呢?显然当光线已经步进到屏幕之外时如果还没有交点那自然就终止了。

其次算法的Level若减为负数,自然也需要终止,它表示找到了交点。

其次,记得我们前面提到过Mip-Map只能做2的k次方的查询,如果以上图为例就是只能1,2像素为一个层级,3,4像素为一个层级,而2,3则不能组成一个层级求最小值,如果非要用,只能通过插值或其它判断形式。

4.Issues

(1)Hidden Geometry Problem

【GAMES202】Real-Time Global Illumination(screen space)2—实时全局光照(屏幕空间)2_第15张图片

SSR和所有屏幕空间的做法一样都有的问题就是无法还原出世界空间下的完整的场景信息,如上图所示,因为Camera看不到手的背面,自然就默认手的背面不存在,所以会出现反射物体的缺失。如上图所示,地面上没有手心的反射。

(2)Edge Cutoff 

其次,同样的,由于是屏幕空间做法,屏幕外的信息我们自然也无法获取。会出现反射被切断的效果,因为无法反射到屏幕外的物体。 

但是通常人们会对光线步进距离做一个能量衰减,这样反射的越远的地方会越虚化,一定程度上减小了不好的效果。如上图所示。

5.Shading in SSR 

【GAMES202】Real-Time Global Illumination(screen space)2—实时全局光照(屏幕空间)2_第16张图片

那么如何计算SSR的Shading呢?那自然还是回到渲染方程了,BRDF如果是前面我们提到的Specular那就是镜面反射了,BRDF是一个δ函数,积分就没了,直接沿着反射光寻找被打到物体的Radiance即可。 如果是Glossy,那就是蒙特卡洛积分。

其次,我们的反射物在SSR中仍然被认为是Diffuse的,因为我们仍然只知道像素到Camera的Radiance,而不知道像素到反射物的Radiance,那就默认假设是Diffuse,就都一样了。

其次,SSR是考虑了Visibility项的,也就是它考虑了可见性,并且这里也不需要考虑光的衰减,因为这里是采样BRDF,而不是采样光源。

6.Realizable requirements

SSR我们前面提到,它其实就是一种简略的Path Tracing,自然Path Tracing能得到的效果它都能得到,比如:

• 1.Sharp and blurry reflections:锐利的反射和模糊的反射,这其实就是镜面反射和Glossy的反射,用不同的BRDF就能实现,我们前面提到过。

• 2.Contact Hardening

【GAMES202】Real-Time Global Illumination(screen space)2—实时全局光照(屏幕空间)2_第17张图片

这种现象会导致距离仿射平面近的地方反射锐利,而远的地方模糊。这是由于BRDF的反射锥形造成的,距离越远,锥体的范围也就越大,那计算光线贡献的范围也就会变大,自然也就模糊了,这是很正常的现象,因为正确的BRDF就是会得到这种现象。

 • 3.Specular elongation

【GAMES202】Real-Time Global Illumination(screen space)2—实时全局光照(屏幕空间)2_第18张图片

SSR也可以做各项异性的反射,如上图所示,反射效果被拉长了,这就是各向异性的BRDF导致的结果。 只要考虑了正确的BRDF,这些效果SSR都可以实现。

 • 4.Roughness and Normal

【GAMES202】Real-Time Global Illumination(screen space)2—实时全局光照(屏幕空间)2_第19张图片

7.Improvements

(1)BRDF Importance Sampling

【GAMES202】Real-Time Global Illumination(screen space)2—实时全局光照(屏幕空间)2_第20张图片

关于SSR还有一些提升的方法,我们知道蒙特卡洛解积分需要PDF,但是这里我们知道反射方向,知道BRDF,我们就没有必要向四周均匀的随机采样了,只需要拿合适的PDF让我们更接近反射的锥体,也就是lob的方向进行采样就可以了,因为我们前面提到过,PDF越拟合我们的BRDF得出的结果越准,这也就是重要性采样—Importance Sampling

(2)Hit point reuse across neighbors【GAMES202】Real-Time Global Illumination(screen space)2—实时全局光照(屏幕空间)2_第21张图片

还有,我们如果反射的是Glossy,从着色点出发的光线那就不只有1条而是很多条,我们自然觉得这样开销比较大,所以人们发明了时间和空间的复用方法,这里我们只简单介绍空间的复用方法。

任何一个着色点都可以利用周围像素追踪到的信息,如上图所示。如果左边着色点的光线追踪到了如上图紫色物体,那么它旁边的着色点很大概率也会受紫色物体的贡献,我们稍微调整紫色物体对左边着色点的贡献值就可以把它当成对右边点的贡献,这无形之中增加了采样数量,也就是说上图中我们只发出了两条光线,但是达到了4条光线的效果。这就是空间复用的简略的思路。

(3)Prefiltered samples

【GAMES202】Real-Time Global Illumination(screen space)2—实时全局光照(屏幕空间)2_第22张图片

还有,我们之前说环境光照的时候,讲Split Sum,说到了一个提前的滤波,把环境贴图提前模糊,然后按对应的镜面反射方向直接采样的方法。这里由于我们是屏幕空间,那我们仍然可以把屏幕这些信息也留到一张图上提前模糊然后沿Specular方向采样。

但是我们之前说环境贴图的时候是假设了环境光都来自无限远处,而屏幕空间却有自己的深度,各个点的深度不一样,我们当然不希望前景的颜色糊到背景上,或者背景的颜色糊到前景上。并且深度本身我们也不能进行模糊,没有实际意义。那怎么办呢?这里涉及到Joint bilateral filter(联合双边滤波),在之后的实时光线追踪会介绍到。

8.Summary

• 优点

- 对于Glossy和Specular效果有较好的表现

- 较好的质量

- 对BRDF采样无需考虑衰减,并且考虑了Visibilty

• 缺陷

- SSR本质上是一种Path Tracing,所以对Diffuse的物体比较难做

- 屏幕空间做法共有的缺点,屏幕以外信息的丢失


参考

GAMES202_Lecture_09.pdf

Lecture9 Real-time GLobal Illumination (screen space cont.)_哔哩哔哩_bilibili

你可能感兴趣的:(GAMES202高质量实时渲染,计算机图形学,实时渲染,学习笔记,图形渲染,全局光照)