一种自适应时间性反走样算法

2020-03-05 04:22陈文倩
现代计算机 2020年3期
关键词:走样纹理层级

陈文倩

(四川大学计算机学院,成都610065)

0 引言

计算机图形学中的光栅图形显示器用离散量表示连续量,采样的频率不满足Nyquist采样定理引起的信息失真是渲染图像出现走样的主要原因,用于减少或消除走样的技术,被称为反走样技术[1]。图形学中的走样主要包括几何走样和着色走样,这些走样问题严重地影响了图像的质量,降低了渲染结果的真实感,这与人们所追求的高质量高真实感的图像相悖,所以反走样技术一直是计算机图形学领域的研究和应用热点之一,受到了学术界乃至工业界的广泛关注。

超采样反走样(SSAA)技术[2]一直都是图形学领域反走样的黄金标准,SSAA通过增加采样数能够有效地缓解图形学中的几何走样和着色走样问题,但在计算量,内存占用和传输带宽方面带来了巨大的开销,难以在实时应用中使用。随后,NVIDIA推出了GeForce3显卡,它提供了对多重采样的硬件支持,多重采样反走样(MSAA)技术[3]将可见性函数从着色当中分离出来,对每个像素只需进行一次着色计算,大大减少了计算量,但它不能解决因着色导致的走样问题,并且基于硬件的MSAA难以支持传统的延迟着色[4]框架。近年来,基于图像的后处理反走样算法[5]因与延迟着色技术有良好的兼容性,成为了计算机图形学领域的研究热点。后处理反走样算法的主要思想是对绘制出的图像进行边缘检测,然后对边缘像素点作平滑处理,一般是以边缘像素及其周围像素的颜色来计算其最终的颜色。反走样作为后期处理,可以很容易地集成到任何游戏架构的渲染管线中,但其缺乏足够的子像素精度,时间稳定性较差,还会导致最终结果变得模糊,因为边缘检测算法很难区分有意的颜色不连续和不完美渲染造成的不必要的走样。

时间性反走样(TAA)算法[6-10]的出现解决了SSAA的效率问题和后处理反走样算法的子像素精度等问题。其基本思想是将一个像素空间内的多个采样点分布在多个时间帧中,然后通过将多个时间帧中的采样点信息进行混合来得到反走样的效果。但在TAA中存在历史颜色失效的像素,标准TAA试图通过各种启发式方法来解决该问题,对于存在子像素特征的场景将造成模糊、闪烁,子像素丢失的问题。本文在TAA的基础上通过对与历史失效像素重叠的三角形执行稀疏超采样的方法来解决这些问题。

1 算法相关概述

TAA在它可以处理的情况下速度非常快并且能得到很好的反走样效果,然而在某些情况下,像素的颜色发生改变,将导致TAA中的历史颜色失效。像素颜色发生改变的原因大致可以分为两类:一类是可见性变化,由原来的不可见变为可见,如被遮挡的物体、视锥体外的物体等;另一类是着色变化,如光照环境的改变,像素是否处于阴影中,半透明物体的影响等。重投影技术[6-10]将失效的历史颜色混合进当前帧中将造成重影现象。对于历史颜色失效的像素,标准TAA试图通过各种启发式方法来解决,如最常见的邻域裁剪[11-12]方法,它将历史颜色限制在其邻域像素颜色的范围内。

1.1 闪烁

TAA中闪烁问题的根本原因在于场景中存在子像素特征。邻域裁剪方法有一个基本假设,图像中的颜色具有连续性,某个像素的历史颜色值应该位于其邻域像素颜色的范围内。如果该假设成立,则将历史颜色限制在邻域像素构成的颜色范围中是一种正确的做法。然而当像素中存在子像素特征且其邻域像素中不存在这个子像素特征时,该假设不成立,邻域裁剪把子像素特征裁剪掉将导致像素颜色在帧间不断变化,从而出现闪烁现象。该问题的基本解决方法是减小TAA中递归指数滤波器[13]的α值,使得当前帧的子像素颜色对最终颜色的贡献减少,历史颜色的权重增加,通过这种方法来减少帧与帧之间颜色的变化差异。然而该方法会导致模糊现象的加重。

1.2 模糊

TAA存在的另一个问题是模糊,造成该问题的原因主要有三个:

(1)错误的mipmap计算

由于mipmap层级与图片的分辨率有关,TAA算法在每一帧中只采样像素中的一个样本点,在计算mipmap层级时使用的是屏幕分辨率,然而TAA的本质是超采样,实际上在计算mipmap层级时应该使用超采样的分辨率。mipmap层级的计算错误可以通过对计算得到的mipmap层级增加一个偏移来解决。

(2)不断对历史颜色缓冲进行重采样

由于在每次迭代中,都使用双线性滤波器对历史颜色缓冲进行采样,该采样值来源于离采样点最近的4个像素颜色值的加权和,而这4个像素的颜色值来源于更早历史周围的加权和,以此类推,随着时间的增加,参与加权的像素的范围就越来越大。解决该问题的一个方法是使用更好的重构方法来代替线性插值方法,来使得插值出来的结果更加锐利,例如Catmull-Rom插值方法。

(3)混合了失效的历史颜色

对于历史颜色失效的像素,TAA使用当前帧子像素颜色与历史颜色的插值作为新的历史颜色,新的历史颜色值还是混合了失效的历史颜色,这将导致最终的结果带有模糊效果。

1.3 子像素细节丢失

由1.2小节可知,TAA产生模糊的原因有三个,前两个都可以采取一些有效的措施进行缓解,而对于使用启发式方法导致的模糊问题暂时还没找到合适的方法,该原因导致的模糊问题将有可能造成一些子像素细节丢失。例如场景中铁丝、细线等,由于它们过于精细,将被背景颜色模糊使其消失在视线中。

2 自适应时间性反走样算法

本文算法的主要流程是在TAA绘制遍中生成一张层次化的分割掩码纹理,其标记出了屏幕中历史颜色失效的像素,接着使用一个绘制遍对与这些像素重叠的三角形进行稀疏光栅化来得到超采样的结果,最后在一个绘制遍中将TAA的结果和稀疏超采样的结果混合得到最终的反走样图像。

2.1 构造层次化的分割掩码

稀疏光栅化的本质就是在光栅化前拒绝不需要超采样的三角形。如果三角形不与任何历史颜色失效的像素重叠,则会在几何着色器中剔除。本文使用层次化的分割掩码来判断三角形是否需要进行超采样,其构造过程如下:

(1)创建一张分割掩码纹理,格式为三个颜色通道的浮点数,并将其绑定到TAA绘制遍的帧缓冲对象上;

(2)在TAA阶段使用领域裁剪中的判断方法对像素的历史颜色的有效性进行判断,对于历史颜色失效的像素,在分割掩码纹理中写入黄色,否则写入蓝色。最终将得到如图1所示的分割掩码,其中黄色像素为需要进行超采样的像素;

图1分割掩码

(3)构造一个层次化的分割掩码,它是一个mipmapped的屏幕分辨率图像。LOD级别i中的1个纹素对应LOD级别i-1中的2×2个纹素,如果这4个纹素中有1个为黄色,则LOD级别i的纹素为黄色,否则为蓝色,最终得到的层次化的分割掩码如图2所示。

2.2 三角形剔除

本文使用图3的三角形在裁剪空间下的边界矩形作为其包围体进行剔除判断,如果三角形的边界矩形处于分割掩码的蓝色区域内则代表它不需要进行超采样,可以在超采样前将其剔除。

图3三角形的边界矩形

2.1小节构造了层次化的分割掩码,本文通过采样对应层级纹理中与三角形边界矩形重叠的2×2个纹素来判断三角形是否处于蓝色区域,这种方法可以减少纹理的采样次数,将纹理的采样次数与三角形的大小解耦,提高了三角形剔除的效率。本文使用采样对应层级的4个纹素来进行剔除判断,而不是采样该层级下一层级的1个纹素(下一层级的1个纹素总结了上一层级所对应的2×2个纹素是否有黄色)。因为在采样4个纹素的情况下纹理的LOD更容易计算,而且它更好地包含了三角形的边界矩形。图4(a)(绿色代表LOD层级j,蓝色代表LOD层级j+1,红色代表LOD层级j+2,橙色代表边界矩形,黄色代表采样的纹素)显示了在LOD层级j采样4个纹素,而如果只采样1个纹素,需要分为两种情况考虑:如果三角形的边界框刚好处于LOD层级j+1的1个纹素中,则可以在该层级采样1个纹素;但如果三角形的边界框刚好处于LOD层级j+1的4个纹素的交界处,则需要如图4(b)所示,在LOD层级j+2中采样1个纹素。所以采样1个纹素的LOD计算更加复杂,而且在某些情况下采样纹素覆盖的面积较大,将严重降低剔除的有效性。

图4采样纹素个数不同的效果对比

本文通过将三角形的三个顶点转换到裁剪空间下,分别得到最小和最大的x和y坐标来计算三角形在裁剪空间下的边界矩形。这个边界矩形将有两个用途,一方面它确定了用于层次化分割掩码纹理查找的纹理LOD层级,另一方面它还定义了用于纹理查找的纹理坐标。计算纹理LOD的公式如下:

其中,ceil函数为向上取整函数,W为三角形边界矩形在屏幕空间下的宽度,H为三角形边界矩形在屏幕空间下的高度。得到LOD后,可以使用边界矩形的4个顶点作为纹理坐标在纹理的LOD层级上进行采样,如果4个采样点得到的值都为蓝色,则将该三角形剔除。

2.3 混合

三角形剔除后,本文将对剩余的三角形使用8倍超采样来得到稀疏超采样的结果。在最终的绘制遍中,通过读取分割掩码纹理来对TAA和稀疏超采样的结果进行混合。如果纹理采样为蓝色则使用TAA的结果,反之使用稀疏超采样的结果。

3 实验结果和分析

3.1 实验环境

PC配置:Intel Core i5-4460k 3.20GHz CPU,8G内存,NVIDIA GeForce GTX-960显卡;开发环境:CLion2019软件开发平台,C++编程语言,OpenGL三维图形开发工具;场景配置:1573455个三角形面片的带有3个点光源的LivingRoom模型。

3.2 实验结果

为了验证本文算法是否能有效解决传统TAA中使用启发式方法导致的问题,本节分别使用TAA算法和本文的算法对同一场景进行渲染,并对渲染结果进行分析。

如图5(a)所示,使用了TAA算法的吊灯,其边缘的部分子像素特征丢失,并且从放大的9帧细节可以看到子像素特征在帧间不断变化,而图5(b)使用了本文算法,有效地解决了吊灯边缘子像素特征丢失及子像素特征在帧间变化导致的闪烁问题。在图5的基础上对场景中的摄像机进行移动,可以看到图6(a)中的吊灯是模糊的,它还错误地混合了背后相框的颜色,沙发的许多细节部分也被模糊掉,而图6(b)采用本文算法得到了清晰的吊灯和沙发。对比图7中的两个渲染结果,TAA得到的帆船上的细线由于模糊而丢失了细节,而本文算法能很好的将其还原出来。图8是在同一场景中两个不同视线方向得到的分割掩码图,可以看出历史颜色失效的像素还未达到整个屏幕的10%。

图5吊灯效果对比图

图6动态场景中的效果对比图

图7帆船的效果对比图

图8分割掩码图

4 结语

本文在TAA的基础上提出了一种自适应时间性反走样算法,其主要思想是将屏幕像素分类处理,在大多数像素上使用TAA的结果,对历史颜色失效的稀疏像素执行超采样。实验证明对于存在子像素特征的像素,使用超采样在同一帧中采多个样本点,能有效地保留子像素特征信息,解决了由于子像素特征在帧间变化导致的闪烁问题,并且对于历史颜色失效的像素,丢弃了先前帧错误的反走样颜色,只使用当前帧该像素的反走样结果,避免了混合错误的历史颜色而产生模糊现象,也进一步解决了子像素细节丢失的问题。在以后的研究中,将会考虑对屏幕中的每个像素使用不同的抖动以达到更好的反走样效果。

猜你喜欢
走样纹理层级
“双减”,如何确保落地实施不走样
科室层级护理质量控制网的实施与探讨
女性衰老从身体走样开始
层级护理模式对血液透析患者的影响
基于G-Buffer的深度学习反走样算法
肺纹理增多是病吗?
职务职级并行后,科员可以努力到哪个层级
童梦
2014—2016贵州英语学考、高考学生认知水平分析
TEXTURE ON TEXTURE质地上的纹理