Games202-lecture9-全局光照(屏幕空间)

Games202-lecture9-全局光照(屏幕空间)

Zh-Hui Programmer

大纲

这一节课主要是把”屏幕空间的方向性遮挡”和”屏幕空间反射”讲完。

屏幕空间的方向性遮挡(Screen Space Directional Occlusion)

回忆一下SSAO

假设了深度深浅来代替是否被环境光遮挡

引入SSDO

SSDO是SSAO的加强版,类似RSM,被点亮的地方会作为次级光源照亮其它区域

SSDO的间接光来自于相机(屏幕),RSM是来自于Shadow Map

SSDO的做法

类似于Path Tracing,在着色点随机发射一条射线,打到遮挡物就是反射过来间接光,没有打到遮挡物就是用直接光照亮。

对比SSAO和SSDO,SSAO假设环境光来自无限远,SSDO假设间接光来自近处(判断遮挡会设置一个距离的阈值)。

SSDO的数学原理,把光照分为两种情况进行计算:对非遮挡(V=1)情况计算直接光照,对遮挡物体(V=0)计算间接光照

在Shading Point考虑法线方向的半球,与SSAO一样用从相机的深度来判断哪些点被遮挡(ABD点)和哪一些点可见(C点),然后用不可见点(对应在屏幕上的点,即屏幕表面的点)计算间接光照,用可见点(也是对应屏幕上的点)计算直接光照,然后把光照累加起来就行了。

当然,也会出现与SSAO相同的问题,即从相机的深度判断容易出现误判(第三张图的A点本来应该被P点可见,B点不应该被P可见),最正确当然是从点P渲染一张ShadowMap来判断,但是这样带来的开销太大了。

SSDO的问题

GI只存在于短距离,可见性的考虑不准,只能解决在屏幕范围内的GI

屏幕空间的反射(Screen Space Reflection)

SSR是解决GI的一种方式(主要是解决间接光镜面反射的问题),可以理解为屏幕空间的光线追踪,但是不是与几何物体求交

观察到现实中镜面反射大部分内容来自于已经在屏幕中存在的内容,这样只需要考虑对屏幕空间的内容来做反射,这样相对于光线追踪可以节省计算量

SSR也可以做Glossy的反射,但是这样可能反射的光线需要多根,计算量变大了。所以一般SSR只用来做镜面反射,这样高端的移动设备也能开启SSR。

SSR的做法

大致的思路,从ShadingPoint发出一根光线,沿着光线方向与屏幕像素求交,最后用交点的颜色作为反射的颜色

需要延迟渲染的内容,法线、深度以及直接着色后的颜色Buffer

光线步进的做法,有一个着色点和一个反射方向,沿着反射方向每次增加一定距离,直到这个点超过了深度图上的值(用深度图作为可见性判断,如果没有在屏幕上的信息可能会计算错),用对应深度图的交点作为实际反射的交点。

加速RayMarch

步长太长可能不准,太短又可能要进行很多次,所以要用动态决定步长来加快RayMarch的速度。

预计算,把Depth做Mipmap,用最小的深度作为下一层的深度值。这个相当于是Hierarchy Z的图(HIZ需要的数据)

原理:如果光线与高层(粗粒度)的值不相交,则一定不会与更细粒度的值相交。

伪代码,如果没有交点就增加层级,如果有交点后就减少层级求交

示例:

有一个问题:当起点不是2幂次时,mipmap不能查询,所以要么先步进到2的幂次,要么用层间的混合值

SSR的着色

用反射到的ShadingPoint颜色作为可以出射的Radiance,然后积分起来(镜面反射一般只考虑反射方向)

思考:

问题1:没有距离衰减,因为不是从光源反着采样积分

问题2:次级光源的可见性是考虑了的,因为是Tacing出来的,肯定不会有遮挡

SSR的现象

我这里认为以下现象一般都不会在游戏里面看到,因为游戏里面一般SSR都是用来做镜面反射的,一般来说都只Trace一根光线,而且应该都是反射方向(非BRDF重要性采样,当然如果TAA下应该用采样更接近正确效果)

现象1:如果准确考虑BRDF,那么specular反射是锐利的,diffude反射是模糊的

现象2:如果准确考虑BRDF,越近越清楚,越远越模糊

现象3:如果准确考虑了BRDF,法线分布是椭圆,那么会出现雨天车灯长条的效果(各向同性)

现象4:每个像素的粗糙度和法线不一样,粒度是像素

SSR的提高

可以用BRDF(NDF)来做重要性采样

复用交点,可以增加Sample数量:比如说每个ShadingPoint出射一个光线,但是ShadingPoint可以用隔壁ShadingPoint的交点的信息加进来,权重用BRDF快速算出来。

可以Filter 直接光Shading的Color值(但是深度怎么Filter),然后用一次采样来代替多次采样

SSR总结

好处:性能好,效果好,遮挡效果准确

坏处:diffuse的情况效率低,缺少不在屏幕的信息

引用

Games202-Lecture9-实时全局光照(屏幕空间)

  • 标题: Games202-lecture9-全局光照(屏幕空间)
  • 作者: Zh-Hui
  • 创建于 : 2025-01-26 13:13:55
  • 更新于 : 2025-03-28 14:00:25
  • 链接: https://hui1520.top/2025/01/26/Games202-lecture9/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论