Hi-Z Screen-Space Cone-Traced Reflections
基于层次化深度的屏幕空间锥追踪反射

这篇文章主要是讲一版加强版的屏幕空间反射,如果理解的HI-Z 实现的屏幕空间反射的话这篇文章理解难度就降低很多了,比如这篇文章中 Unity URP实现屏幕空间反射(SSR)对屏幕空间的Hi-Z 优化原理解释的比较清楚。
文章中将算法分为了5个阶段:
- Hi-Z Pass(Hi-Z 构建阶段)
- Pre-Integration Pass(预积分阶段)
- Ray-Tracing Pass(光线追踪阶段)
- Pre-Convolution Pass(预卷积阶段)
- Cone-Tracing Pass.(锥体追踪阶段)
这5个阶段的功能可以划分成两个部分来理解:
第一部分是Hi-Z 构建阶段 与 光线追踪阶段 这部分构成了镜面反射是屏幕空间反射的核心。
第二部分是预积分阶段、预卷积阶段 和 锥体追踪阶段 构成的粗糙反射,他是屏幕空间反射的拓展,文章的创新点就在于此。
第一部分:
屏幕空间反射原理可以简单归结为下图:

文章中的演示图:

光线追踪阶段的步进依赖于采样屏幕空间深度图,而Hi-Z则是通过预处理深度图从而实现步进阶段的优化。
下图为层次化深度图的结构:

第二部分:
这个部分主要是实现粗糙度反射
预积分阶段:
这个阶段主要作用是根据Hi-Z深度图,统计当前区域的可见性也就是空白区域的比例,在后续的锥体追踪阶段 中使用
参考实现代码:

从代码的实现中可以了解到,他所计算的可见性是基于屏幕空间的,不是基于世界空间的,实现代码中只是简单的基于一个范围内最大最小深度的差值,与之前计算的可见性来评估当前计算的可见性。


与Hi-Z的构建顺序一样,这个纹理是从Hi-Z的原始分辨率(MIP 0)开始网上递归构建可见性,后一张可见性的 Mip纹理依赖于上一层的Mip
预卷积阶段:
这一步是调整屏幕空间反射的时候采样颜色缓存那一步,也就是获取反射面颜色。
为了模拟光线在微观粗糙表面上的发散,最开始的算法是从每个表面点发射32条光线计算碰撞表面的颜色后求平均。

这种方式的缺点就是过于耗费性能。
所以文章为了优化粗糙表面的反射,文章改为对对颜色缓存进行模糊处理来模拟不同粗糙度表面的散射系数,并映射到不同的Mip图上。与Hi-Z与可见性缓存一样,这个阶段也是生成一个层次化缓存纹理。

这样粗糙表面上的粗糙反射就从多条光线采样平均,改为Mipmap查找,不同的粗糙度可以采样不同的预处理模糊纹理表示反射结果:
效果:

锥体追踪阶段:
这个阶段主要是为了整合之前的三项层次化缓存(深度缓存、可见性缓存、颜色缓存)计算最终计算出粗糙表面反射。
这个阶段的思路是以计算点的反射方向为中心构建一个圆锥,积累该圆锥的光线的积分就是发散的颜色。
上一个阶段说过,为了模拟光线在微观粗糙表面上的发散,最开始的算法是从每个表面点发射N条光线计算光线碰撞表面的颜色后求平均,这些光线集合则对应为这个圆锥

对应到实际应用上的场景就是 4.17 图,为了简化三维空间的运算,文章将该圆锥映射到屏幕空间上的二维三角区域。

所以这三份层次化纹理则是为了计算这个区域的颜色信息以近似粗糙反射颜色。
观察实现代码:

该算法的的流程是:
计算mip level
读取对应可见性值(visibility)
读取对应颜色值
然后累积,该累计过程直到可见性为1为止。

效果:

拓展:
1,平滑淡出伪影(Smoothly Fading Artifacts)
这一段主要讨论的是如何处理屏幕外的反射数据,屏幕空间反射的固有问题就是他的反射信息只能在屏幕空间内,反射步进到屏幕空间外的话是采样不到颜色信息的,文章表示通过控制淡出来掩盖这部分问题。

2,表面外推(Extrapolation of Surfaces)
这一段意思不是很清楚,大概说的是对于在光线步进时没有找到交点的时候,可以尝试通过周围颜色做边膨胀滤波(bilateral dilation filter)代替。
3,提高光线步进精度(Improving Ray-Marching Precision)
这一段主要是考虑大深度场景,一般大世界的深度缓存为了提高超远距离的深度采用的是反转Z,即1 / Z 来代替,对应的Hi-Z也要对应修改
4,近似多次光线反弹(Approximate Multiple Ray Bounces)
目前屏幕空间反射只考虑反射一次,如果有些材质会导致多次反射的话,屏幕空间反射的结果就失效了,比如两个镜子相对放着。

文章提出的思路很简单,就是利用前一帧的反射结果
对于多次光线反弹的反射,光线步进与反射表面求交后,采样的不是颜色缓存,采样的是历史反射结果。

5,时间滤波(Temporal Filtering)
时间滤波的思路和TAA的思路类似,还是利用历史帧的信息。在表面外推里利用的周围信息填补步进求交失败的像素点,这里用的是历史帧的信息去填补
6,在物体后方穿行(Travel Behind Surfaces)
利用Hi-Z中存储的最小深度和最大深度来判断这次步进是否可以直接穿过物体,不是很明白这个拓展的应用场景。
7,朝向摄像机方向的光线步进(Ray Marching Toward the Camera)
反射方向一般是远离摄像机的,考虑到有些表面反射方向是靠近摄像机的,Hi-Z里应该考虑存一个最大深度,因此贴图格式要从单通道改为多通道。
8,垂直拉伸的各向异性反射(Vertically Stretched Anisotropic Reflections)
理解的不是很清楚,大概是某些观察角度下应该对反射结果在垂直角度上拉伸
优化:
1,结合线性搜索与 Hi-Z 遍历(Combining Linear and Hi-Z Traversal)
2, 改善纹理读取延迟(Improving Fetch Latency)
3,交错空间相干性与信号重建(Interleaved Spatial Coherence and Signal Reconstruction)
4,Cross-Bilateral Upsampling 或 Temporal Super-Sampling
参考资料: