渲染中常用抗锯齿的使用经验总结

我们都知道抗锯齿在渲染中出现的原因主要是为了解决图像中的“锯齿”问题,今天小编总结了一些常用的抗锯齿使用经验,希望对你有所帮助。
空间抗锯齿
在以较低分辨率展示高分辨率图像时,空间抗锯齿技术能够最大限度地减少图像锯齿,被称为混叠的失真伪影,确保图像的清晰度和真实性。
SSAA(Super Sample Anti-Aliasing)超级采样抗锯齿
4X SSMA:使用4倍屏幕分辨率大小的后台缓冲区和深度缓冲区,当数据从后台缓冲区传输到屏幕显示时,会对后台缓冲区的4个子像素进行平均值计算,并将其作为屏幕像素的颜色值。这种处理方式能够提高图像的清晰度和视觉效果,减少锯齿和混叠现象的出现。(需要计算4倍屏幕分辨率的像素颜色,极其耗时)
MSAA(Multi-Sample Anti-Aliasing)多重采样抗锯齿
4X MSAA:使用4倍的屏幕分辨率大小的后台缓冲区和深度缓冲区,但只需要计算1倍屏幕分辨率的像素颜色,然后降采样将每个像素分成4个子像素,根据子像素的覆盖性确定子像素的颜色,当数据要从后台缓冲区调往屏幕显示时,会将后台缓冲区按照4个像素一组进行平均值计算作为屏幕像素的颜色值。(只需要计算1倍屏幕分辨率的像素颜色)。
后处理抗锯齿
FXAA(Fast Approximate Anti-Aliasing)快速近似抗锯齿
1、入数据是渲染图像和可选的亮度数据。
2、获取亮度数据。该数据可以从渲染步骤作为 alpha 通道从渲染步骤传递到 FXAA 算法中,作为嵌入到图像中的 alpha 通道进行抗锯齿处理,从渲染的图像中计算,或者通过使用绿色通道作为亮度数据进行近似。
3、通过使用亮度数据的高通滤波器查找高对比度像素。发现的低对比度像素不会被 FXAA 进一步更改。可以调整排除低对比度像素的高通滤波器以平衡速度和灵敏度。
4、使用相邻像素之间的对比度来启发式查找边缘,并确定边缘是在水平方向还是垂直方向。像素的混合方向将垂直于该像素上检测到的边缘方向。
5、通过分析 3x3 像素网格中的亮度数据,以相关像素为中心像素,计算高对比度像素的一个混合因子。
6、在确定边缘的方向和持续时间时,我们沿着检测到的边缘进行搜索。通过这种方式,我们可以确定边缘何时结束以及实际边缘的方向。为了更准确地计算第二个混合因子,我们需要考虑实际边缘的方向。为了提高质量,我们可以增加搜索分辨率并确定在搜索边缘结束之前需要搜索多远。相反,为了提高速度,我们可以减少搜索的分辨率和范围。
7、使用选定的混合方向和计算出的两个混合因子的最大值来混合像素。
MLAA(Morphological Anti-Aliasing)形态学抗锯齿
MLAA 使用后期处理过滤器,分析场景物体的几何结构,进行边缘检测和重建(识别出 U形、Z形、L形 的边缘),然后将边缘像素颜色于背景色进行混合,达到消除锯齿的效果。
时间抗锯齿
时间抗锯齿是一种用于计算机生成视频的空间抗锯齿技术,它结合来自过去帧和当前帧的信息以去除当前帧中的锯齿。
TAA(Temporal Anti-Aliasing)时间抗锯齿
在 TAA 中,每个像素每帧采样一次,但在每一帧中,样本位于像素内的不同位置。在过去帧中采样的像素与在当前帧中采样的像素混合以产生抗锯齿图像。
TAA算法设计:
时间抗锯齿的核心思想是通过将运算量分散到多帧图像中,实现像素采样的超采样。在每一帧中,我们只计算一个像素点的值,然后随着时间的推移,通过累积多帧图像,我们获得了更多的采样像素。将这些采样像素混合在一起,就相当于进行了多个像素的超采样。为了确保每帧中的像素值有所不同,我们需要在每帧中进行一定的抖动(Jitter)。这种抖动确保了不同帧中相同位置的像素值不会完全相同,从而实现了多帧之间的运算量分摊。通过将像素采样分散到多帧中进行超采样,我们可以提高采样效率,有效缓解图像中的锯齿现象。
大致的设计流程图如下:
1、抖动样本:人为对相机的投影矩阵添加抖动信息,让同一像素在不同帧上计算得到不同的颜色值,然后我们通过混合不同帧上同一位置像素的颜色。示意图如下图:
样本的分布模式是我们可以自定义的,目前广泛使用的是均匀分布,有如下图5示例:分层分布和低差异序列。低差异序列还有包含许多其他的序列,Halton目前用的较多。
分层分布(左)和Halton (2,3)序列(右)
这里简单介绍一下Halton序列。在统计学中,Halton 序列是用于为数值方法(如蒙特卡罗模拟)生成空间点的序列。Halton序列是由某质数a定义的(0, 1)之间的一组数。这些数是按照如下规则确定的:
2、帧间数据重投影:利用运动向量获取上一帧同一像素的位置坐标,从而在上一帧中采样与当前帧同一像素的颜色。运动向量其实就是前一帧的像素位置与当前帧同一像素的位置差。
在《GPU Gems3》中介绍了一种运动向量的计算方法:利用深度纹理和当前帧的视角*投影矩阵的逆矩阵来求得该像素在世界空间下的坐标。然后将前一帧的视角*投影矩阵*该坐标就可得到前一帧NDC坐标化后顶点的位置,最后将NDC坐标变换到屏幕空间坐标即为该像素在前一帧的屏幕位置。最终两坐标差即为运动向量。
3、色调映射:在大多数渲染引擎中,后处理效果一般是在线性 HDR色彩空间中实现的。为了防止高能量颜色样本被高光或镜头光晕等效果夸大,我们需要首先需要在线性 HDR 空间中获取输入帧样本。另一方面,由于色调映射通常是非线性的,因此最好在色调映射后的空间中应用诸如抗锯齿之类的滤波操作,以在图像上产生正确的边缘梯度。解决此冲突的一种变通方法是在应用 TAA 之前对样本进行色调映射,并将输出的色调映射反转回线性 HDR 空间以提供给后处理链的其余部分。
本质上来讲,色调映射是要解决的问题是进行大幅度的对比度衰减将场景亮度变换到可以显示的范围,同时要保持图像细节与颜色等对于表现原始场景非常重要的信息。同时一定程度上可以改善高光噪声闪烁的问题,如下图所示:
4、历史验证:实际上,从前一帧重新投影的历史像素数据不应该未经检查就随意使用。它们可能由于场景遮挡变化而无效,或者由于照明和阴影变化而陈旧。未能正确处理此类情况可能会导致强烈的时间伪影,例如重影,如下图所示。
为了缓解这个问题,可以检测历史帧像素与当前帧像素的差异,若差异过大,将差值拉回当前帧像素范围内。可以选择邻近的5个像素或者9个像素算出最小值和最大值,构成像素的AABB包围盒。将重投影得到的历史像素值截断Clamp或是裁剪Clip到AABB中,如下图所示。
同时有实验表明,上述截断/裁剪的颜色,在YCoCg颜色空间进行会有更好的表现效果,如下图所示。
在上面两图的上图中我们可以明显的看到红色边缘的时间伪影,而下图则表现的比较正常。