实时全局光照Screen Space Reflection (SSR)

INTRODUCTION

什么是SSR?

  1.  它是在实时渲染中引入的一种全局光照的方法
  2. 实行光线追踪
  3. 但是不需要3D基本体

基本原理

屏幕空间反射(Screen Space Reflection,SSR),是一个非常著名的基于屏幕空间的技术。由于镜面反射的波瓣很窄,意味着可以使用少量的光线模拟反射,从而就可以得到不错的效果。算法本身的原理非常简单:

  • 对于屏幕空间上的物体的每个像素,根据该像素 对应的法线和视线信息,求解出反射向量;
  • 当前点沿着反射向量在屏幕空间进行步进,判断步进后的坐标深度与深度缓存中存储的物体深度是否相交;
  • 若相交,取交点处的物体颜色作为最终的反射颜色;

SSR的两项基本任务

  1. 交集:任何光线与场景的交集
  2. 着色:相交像素对着色点的贡献

 

可以观察到反射是重新利用屏幕空间里的数据。


基本SSR算法-镜面反射

对于每一帧

  • 计算反射光线
  • 沿射线方向的轨迹(使用深度缓冲器)
  • 用交点的颜色作为反射色

SSR不仅是只能做镜面反射效果,还可以做glossy材质效果

镜面效果是将从camera的入射光线与场景中的反射面相交计算得到的反射光线与场景中的物体相交的颜色作为反射的颜色

glossy材质效果是将camre发射的入射光线与反射面相交后得到的lobe上取多个点,将多个点的颜色加权计算得到反射点的颜色。

也还可以做地面不平和地面积水的效果,SSR不要求反射面只能是镜面,只要知道反射面的法线分布就可以做任何的光线追踪。

 


实现流程

  1. 给出一个屏幕空间的场景
  2. 输入场景的法线分布图
  3. 输入场景的深度图
  4. 根据场景的法线分布和深度分布计算SSR后的反射的图
  5. 将场景反射的图加到场景中,就得到了SSR的效果图


 如何实现?

目的:寻找反射光线与场景中相交的点

        对于屏幕空间上的物体的每个像素,根据该像素对应的法线和视线信息,求解出反射向量;沿反射光线方向步进,每一步检查深度,判断步进后的深度与深度缓存中存储的物体深度是否相交;若相交,取交点处的物体颜色作为最终的反射颜色。

  1. 每一步,检查深度值
  2. 质量取决于步长大小
  3. 可以被优化


SSR的优缺点

优点:

  • 针对任何面都可以实时反射,不需要求平面。
  • 不需要额外的DrawCall,没有Planar Reflection那种翻倍DC的问题,计算都在GPU,解放CPU。
  • 只需要额外的后处理Pass处理,无需大规模改动引擎管线,容易集成。
  • 可以与Reflection Probe等结合使用。

缺点:

  • 需要全屏深度和全屏法线,延迟渲染管线中是可以免费拿到的!但是前向渲染的话,需要额外渲染一遍DepthNormalMap。
  • Shader中需要进行RayMarching,对于GPU的负载较大,且步进是有一定步长的,它本身不可能非常精确。
  • 效果存在自身缺陷,由于只有屏幕可见的物体信息,不在屏幕内的,就完全不会反射。这属于技术本身的瓶颈。

严重的问题:

        SSR的所有可用信息都是来自屏幕空间,所以有些信息在屏幕空间中并没有显示,虽然我们人为地知道这些背后的信息的存在,这会造成SSR的结果会有一些误差,比如下图中的手的反射,屏幕空间上只能记录最外层的数据,不能记录被遮挡住的手心,所以最后的反射效果并不能显示手心的信息。


Hi-Z Trace(Hierarchical-Z)算法

Hierarchical-Z缓冲区,也称为Hi-Z缓冲区,是通过获取Z-buffer中四个相邻值得最小值或最大值,将其存储在原有缓冲区一半大小的缓冲区来构造的。

Hi-Z结构的最小值版本是如何运行的,如下图所示:

我们都知道,深度可以认为是场景几何结构的一种表示。

如下图,这是将Hi-Z各级缓冲反投影到世界空间的可视化结果。

  • 可以看出当Hiz的层级越高,就表示这是对场景越粗略的近似。


原文链接:https://blog.csdn.net/qjh5606/article/details/120102582

准备工作:将场景中的深度做一个mipmap,但是这个mipmap与平时的不同,之前提到的mipmap是存储一个图像金字塔,上层的图像的像素是下一层的四个像素的平均,而这里的区别是上层像素深度存的是下层像素深度的最小值

 为什么使用深度Mipmap结构?

  • 与在3D场景中的BVH,KD-tree类似,使用一种等级策略作为加速结构;
  • 能够快速跳过一些不可能相交的像素点
  • 最小运算保证了一个保守的逻辑:如果一个光线不能与最大的结点相交,name它肯定不能与其任何子节点相交。

如下图,在最精细的级别,但没有相交,所以会移动到更粗糙的一层。


如下图,因为上面没有相交,所以到了粗糙的一层。因而跳过了许多空白的空间。

​​​​​​​

如下图,因为上面还是没有相交,就会进入下一层。一旦我们找到与 Z 平面的交点,我们就会移动到层次结构中更精细的级别。在这里,我们发生了相交。


因为发生了相交,所以要进入更精细的级别,如下图。 

 继续步进,一旦我们在最精确的层级相交,我们就找到了交点。

 Hi-Z通过采用大步长并通过在层次结构级别中索引来达到快速收敛。


参考文章

参考视频

猜你喜欢

转载自blog.csdn.net/qq_48626761/article/details/127348803
ssr