14
本文作者: 王锐 | 2016-03-01 12:02 |
按:作者王锐,VR领域资深从业者。
这个游戏的画质好差?
图形渲染画面的反走样问题,亦或者称之为抗锯齿问题,对于游戏和图形应用的开发者而言绝对是一个老生常谈的话题。简单描述的话,走样问题总是源于图像采样率的不足所致。当我们用一张1920x1080的画面去表达一个复杂的游戏场景的时候,我们事实上是尝试用一个个的像素点来描述观察者眼中所见的几何模型和材质信息——而后者原本是可以通过精准的数学曲线和曲面去表达的——因此,使用有限的像素点就意味着我们只能从曲面上采集有限几个位置的信息,来表达这个物体的形象。如果像素点的数量太少,那么它所呈现的物体可能会是失真、不准确的,而物体的边缘往往是锯齿状的,这正是记录了不同采样信息的像素点所留下的痕迹。
(via anteru.net)
而这还远不是问题的全部。另一种形式的走样问题或许更为让人头疼:现代游戏开发者常用的一种丰富场景细节的手段,叫做法线贴图(normal mapping),其原理是使用颜色图像来记录物体表面的朝向信息,然后将这张图贴附到原本平整的几何表面上。在实时运算过程中,我们使用法线贴图来模拟这个表面的坑洼不平的效果,以及因此反射的光照信息,从而以很小的代价得到逼真的渲染效果。
不过法线贴图的使用同样需要一个采样的过程,即物体表面的每一个点都需要对应于法线贴图上的一个颜色值。但是在一定的观察者视角和距离下,因为法线贴图存在Mipmap后准确度损失的问题,会导致因为法线而计算的高光部分出现断续和运动闪烁现象。就如下图中黄色圈所提示的:原本应当是一条直线的高光效果,在图中是由很多断续的短线组成,并且这样的短线会随着视角的运动而发生变化,产生非常碍事的观感。
(via selfshadow.com)
对于VR内容的参与者来说,这当然是噩梦的开始。试想你戴上头盔,看到一位轻盈可人的少女向你走来,少女的鬓角发丝都打上了天然的马赛克,而她自信的双眸和光滑的皮肤,在阳光的照耀下闪烁着诡异的线条。再加上尚不能让人满意的头盔分辨率,以及延迟和纱窗效应等种种问题,只会让玩家迅速产生一种身“不”临其境的抽离感,无法将自己代入到虚拟的场景当中。
这两种类型的走样问题,可以统称为空间性的走样(spatial aliasing)。
与之相对应的还有时间性的走样(temporal aliasing),顾名思义,就是场景随着时间变化而发生运动的过程中,因为场景渲染对于高速运动的物体的采样率不够,因此发生了失真的状况。这也被称为车轮效应(wagon-wheel effect),例如在电视画面中看到汽车飞驰,或者直升机爬升的镜头的时候,我们会感觉轮子或者螺旋桨是反向转动的。
不过放在游戏场景中,问题可能会更大一些,爆炸,喷射,甚至是VR玩家头盔的高速转动,都可能带来时间性的走样问题,从而造成场景不自然的跳动,这甚至可能是3D游戏晕动症的另外一种潜在的影响因素。能否解决这样的问题,以及如何高效地解决这些看起来简单却又暗藏杀机的走样问题,想必会给越来越多的VR内容开发团队带来巨大的挑战。而这样的挑战也许是前所未有的:毕竟传统的PC和主机游戏中,玩家并不需要非常高的分辨率和屏幕刷新率参数,只要面对屏幕时没有大的瑕疵就好;而VR游戏颠覆式的体验,眼睛与屏幕的过近距离,则是在另一方面扩大了这些传统问题的影响,使之可能进一步成为限制开发者脚步的桎梏。
(via and.intercon.ru)
最传统的一种反走样思想,就是把原本需要渲染的画面尺寸放大很多倍之后,渲染一张更高分辨率的图像(这一过程也称作超采样,supersample),然后再重新缩小到实际需要的尺寸输出。在重新输出的过程中,每个最终的像素结果,在高分辨率的图上都有多个对应的像素值可以进行加权平均处理,从而提供了各种提升画面质量和降低画面锯齿的可能性(而这个过程被称作下采样,downsample)。这一理想状况下的方案也被称作SSAA(super-sampling anti-aliasing)。
当然,对于实时渲染的画面而言,需要被采样的绝不仅仅是最终的色彩图像而已,通常还要考虑深度缓存(depth buffer)和模板缓存(stencil buffer)的重采样,并且对于画面上的每一个采样点都要执行一次像素计算(即调用像素着色器,pixel shader),这一切的工作都对显示设备的带宽和像素填充率产生了不可忽视的压力,进而直接影响到实时画面的渲染效率——而对于VR内容而言,执行效率的保证恰恰是重中之重。这样的矛盾,无疑是所有从业者的一块心病。
幸好,现代计算机硬件支持的MSAA(multi-sampling anti-aliasing)并不会单纯到对每种采样点都斤斤计较的程度,它只会对输出画面的每个像素执行一次像素计算,并且将结果输出到这个像素在大图上的每一个采样点,混合之后输出一个平滑的最终结果。
(via confettispecialfx.com)
从图中可以看到,因为示例像素(方框所示)正好位于一个黄色三角形的边缘,而它对应的深度采样点(depth sample)有部分在三角形之外,另一部分在三角形之内,因此重新混合输出的颜色值自然产生了一种模糊的效果,即几何物体边缘锯齿的平滑处理。如果像素点完全处于三角形的内部或者外部,那么混合后的颜色值与着色器的输入值将不会有任何变化。
而很多游戏设置界面中常见的MSAA 2x,MSAA 4x等选项,设置的正是每个像素对应的采样点的数目。显而易见,采样点的数目越多,渲染更大分辨率的中间画面耗费的资源和时间也就越大,而最终结果则会更加理想。
via 《刺客信条》
MSAA如今基本成为了所有主流三维游戏必备图形品质选项之一,毫无疑问,它也会是大部分VR游戏在考虑提升自身游戏品质时的首选优化方案——尽管因此会让本来就捉襟见肘的渲染效率问题更加严重,尽管单纯的MSAA并不能解决多种其它形式的走样问题,例如时间性的走样,以及因为透明贴图映射而在三角形内部产生的锯齿。而为了更好地改善这些问题,人们也在不断努力着,这才有了如今同样广为人知的FXAA。
如今的PC显示硬件性能相比当年早已是突飞猛进了,但是对于移动平台而言,MSAA看起来还是洪水猛兽一般,稍加滥用就会让整个系统的五脏六腑都被掏空。在这种局面下,足够简单和低成本的反走样方案当然会更受欢迎,比如基于图像后处理(post processing)的方法。
图像后处理并不是什么新鲜的概念,甚至可以用照片的美化过程来做简单类比。你使用相机拍摄了一张照片(实时渲染得到一帧图像),然后打开PhotoShop或者美图秀秀或者其它奇形怪状的软件,调整对比度、亮度,去掉红眼、雀斑,甚至附上LUT之类的高级货,这都是图像后处理的具体流程。而这一过程中显然也可以做一些和改善画面锯齿相关的事情,比如,查找看起来像是边缘的地方,然后把它模糊掉,让它看起来不是那么明显。
这种方案仅仅是使用了标准分辨率的图像数据,不需要渲染和计算额外的采样点,因此也不会产生过多的显存消耗和计算量。无论在PC平台,移动平台,主机平台,还是别的什么低端设备上,理论上都可以应用此类方法。针对这一目标,NVIDIA提出了一种名为FXAA(fast approximate anti-aliasing)的后处理反走样方法:首先根据当前渲染结果的深度信息来查找可能的几何边缘,然后直接对这些边缘像素进行平滑处理。这一方法甚至可以直接在NVIDIA的显卡控制面板中开启,并且直接作用于所有运行于当前显示设备的任意程序之上。
然而,我们之所以说这类方法只能获取“可能”的几何边缘,是因为此时在显卡中已经不存在几何信息的概念了。真正能够用数学方法去描述的几何顶点与三角形,经过了光栅化过程之后,已经转化成了一张屏幕大小的图像而已,我们可以从中得到每个像素点对应的颜色值与深度值,并且从中估算像素点原本是否是在三角形的边缘位置。与MSAA同样,如果用户使用了透明贴图来表达边缘,那么这一策略将很难收到效果;而那些原本可能不需要平滑的区域,也存在着被“误伤”的可能性。
并且,类似FXAA这种基于图像的平滑处理,很多时候也很难满足现代游戏玩家刁钻的口味,很多人的反映是FXAA的画面结果“很糊”,灰蒙蒙的好像被沙尘覆盖。如果再与VR内容面临的另一个臭名昭著的问题,即纱窗效应(screen-door effect),相结合的话,结果也许会更加让人头痛吧。至少从目前看来,单纯的后处理反走样手段是难以填饱VR内容开发者们的饥饿肚皮的。
(via en.wikipedia.org)
在MSAA基础上发展起来的硬件采样抗锯齿方法还有很多,例如解决了显存数据存储量过大问题的CSAA(coverage sampling anti-aliasing);或者可以自定义混合方式的CFAA(custom filter anti-aliasing)。而FXAA的同道者和继承者同样大有人在,例如预先学习可能的边缘类型,然后根据样式查找边缘的MLAA(morphological anti-aliasing);以及先全局做某个方向的模糊处理,之后从另一个方向查找边缘信息的DLAA(directionally localized anti-aliasing,如下图所示)。可谓是八仙过海,各显神通。
(via and.intercon.ru)
而有关法线贴图产生的走样问题,也有不少人做出了自己的贡献。其一就是Toksvig提出的Mipmapping normal maps,他通过一个额外的系数计算,对法线计算的镜面反射结果进行了修正。而这个修正对于法线贴图本身的采样问题会产生一定的补偿作用,从而降低了闪烁走样问题出现的几率(下图中,右侧为Toksvig方法的实现效果,实际运行中基本上去除了法线贴图的走样问题)。
(via selfshadow.com)
另一种针对法线贴图问题的解决方法叫做LEAN Mapping,它的解决方案更为合理和严谨,并且能够基本保持高光计算的本来面目,不过其实现要复杂得多,对于实际系统运行效率的影响更是无法忽略。
值得注意的是,上述这些方法都只是针对第一种走样现象,即空间性的走样而苦心钻研的解决方案。那么对于时间性的走样,我们是否也有良方呢?幸好,答案是肯定的。
要解决场景物体随时间的运动所产生的走样问题,我们可能需要这样的一套流程来处理:
1、从场景中找到所有高速运动的物体,包括因为观察者的高速运动而在视野中产生运动的物体;
2、计算这些物体从上一帧到这一帧运动的距离,也就是它的运动速度;
3、光栅化之后,对于结果图像的每个像素点,找到覆盖这个点的所有运动物体;
4、去除那些实际上被遮挡的物体的影响因素;
5、根据运动物体的参数,计算和调整当前像素的实际显示结果。
而NVIDIA为GTX600以及更高配置的显示卡提供的TXAA反走样方案,则把上述过程所需的信息定义为:上一帧的图像缓存,本帧的图像缓存,以及场景的运动向量(motion vector)数据缓存,并且图像缓存必须是经过了MSAA反走样处理的,即包含了每个像素点的多重采样信息,以便完成准确的运动和覆盖程度计算。
(via gameplorer.de)
毫无疑问,这可能是目前效果最为强大的反走样方法了,它同时解决了大部分空间性走样和时间型走样的问题,几乎可以达到电影级别的抗锯齿水准,最适合应用到VR内容当中,立竿见影地解决头盔运动过程中的不适感和锯齿感。如果未来已来的话,TXAA,抑或其它的Temporal AA手段,绝对会是其中的一份子,尽管对于玩家而言它只是幕后的英雄。
不过,现实往往并不像理想那么美好,MSAA的性能损耗已经让VR行业的从业者们难以忽视,再加上一个胃口更大的TXAA,要保证75Hz乃至120Hz的屏幕刷新率就更是难上加难,而移动端目前还颇为孱弱的图形处理能力,想要把如此强劲的算法流程纳入自己的麾下,恐怕现阶段还有好长的一段路要走。
当然这里也存在着一些争论:时间性的走样问题源于场景中高速运动的物体或者观察者自身。一个戴着头盔却总是拼命甩头和雀跃(并且因而产生了temporal aliasing)的玩家,也许并不需要更关心他所目睹的场景是不是有让人不适的锯齿;而高速运动的车轮,直升机螺旋桨,或者高级宇宙飞船的隆隆扇叶,也不一定就要出现在游戏者面前,让他们感觉眼花缭乱。那么如果可以从内容制作上就尝试去回避这些问题的话,是否就不必像本文一样太过杞人忧天了呢?也许吧,但是回避终究不是解决困难的手段;何时亮剑,怎样亮剑,也许这是所有的从业者在希望与矛盾中艰难前行的时候,都需要思考和迟早面对的一个问题。
(编者注:当然啦,锯齿其实只是画质差的一部分因素,还有可能是本来画质就很差,哈哈==)
雷峰网原创文章,未经授权禁止转载。详情见转载须知。