Unity游戏画面参数解析与应用:垂直同步动态模糊抗锯齿
Posted 心之凌儿
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity游戏画面参数解析与应用:垂直同步动态模糊抗锯齿相关的知识,希望对你有一定的参考价值。
前言
最近会在B站刷到一些关于
等等这样关于画面与性能调整的的视频,看完之后受益良多,UP主们经过实际测试获取到宝贵的游戏画面对于性能表现影响的数据,可以很好的帮助到游戏爱好者对游戏画面参数的调教
对于一个游戏开发者而言,通过这样的视频也可以了解到一些影响到游戏性能的一些关键点,还是推荐大家看看的
好巧不巧,在此之后,又看到了大学同学在群里分享了一张关于原神画面设置的图片,具体如下图所示,根据他的参数设置来看,由于笔记本配置比较高,所以直接把所有的参数调整到比较高的一个状态。根据这个案例可以很明显的看出,游戏厂商有时设置的一些参数不一定会被玩家所理解,从人类的思维方式来说也是,如果我不了解这些参数,就会认为高了比低了好,打开比关闭表现好
但是垂直同步、动态模糊、抗锯齿这些参数是用来解决一定场景下的负面参数的,并不就是打开就一定要比关闭好
所以对于一个游戏开发者而言,就需要对这些参数有一定的敏感度。这篇文章就简单的分析一下关于游戏画面参数相关内容。首先通过我的直观感受,大概的将这些参数分为三个方面:
- 用来权衡画面与性能表现,如分辨率、渲染精度、渲染质量、场景细节等等
- 解决特定情况下的画面的负面效果,比如垂直同步、动态模糊、抗锯齿等
- 增强视觉效果的特定技术,如体积雾、反射、
Bloom
等
第一类与第三类可以很直观的去理解,所以就不多介绍了,这里就主要说一下第二类的参数相关的内容
一、 垂直同步:
显示器在刷新画面时,会逐行扫描屏幕像素,这些水平扫描线在垂直方向的堆积就形成了完整的画面,而这些画面的信息来自于显卡输出的每帧画面信息
简单的来说,整个画面的输出工作流程为,在显卡渲染完成后,输出一帧的画面信息到某一缓存区域,而当下一游戏帧画面完成后,会直接替换掉缓存区域的信息,而显示器的画面输出则是与屏幕刷新率有关,并且显示器相对于显卡而言,对于画面的信息处理是一个过程变化,即显示器在一定的时间间隔内从上到下一行一行读取显卡缓存的画面信息
由于这样的工作流程,当游戏帧数大于屏幕的刷新率的时候,就容易出现这样的一个问题,即显示器一个画面未刷新完成时,缓存区域内缓存画面信息却变为了下一帧的内容。那么显示器剩余的画面信息读取的就是下一帧的信息,这样最后的显示器最后的画面就是由两帧或者多帧画面组合而成,而在这一过程,若游戏镜头移动的过快,导致显卡输出的两帧画面的信息差异较大,就会在显示器上显示出截断的画面
垂直同步如何解决两者差异:
首先同步百度百科的解释来说明垂直同步的一些基本信息:垂直同步又称场同步(Vertical synchronization
),从CRT
显示器的显示原理来看,单个像素组成了水平扫描线,水平扫描线在垂直方向的堆积形成了完整的画面。显示器的刷新率受显卡DAC
控制,显卡DAC
完成一帧的扫描后就会产生一个垂直同步信号。我们平时所说的打开垂直同步指的是将该信号送入显卡3D
图形处理部分,从而让显卡在生成3D
图形时受垂直同步信号的制约
在Unity中,如果想要开启垂直同步,可以在Quality
下面找到Vsync Count
,而关于其对应的三个选项分别为:
Don't Sync
:不需要垂直同步Every V Blank
:开启垂直同步Every Second V Blank
:每隔一个垂直空白同步
也可以直接通过脚本中的API
来直接控制:
public static int vSyncCount ;
而关于这一选项的具体的含义,可以根据Unity文档中介绍来了解到其应在每帧之间传递的垂直同步数。使用'Don't Sync' (0)
则不等待垂直同步。 值必须为 0、1、2、3 或 4
二、动态模糊
我们日常接触的电影的帧数大多都是24帧左右,但是给我们的感觉却是非常的流畅,而电子游戏的帧数就算达到了四五十帧也会有一定的卡顿感,这是为什么呢
游戏动态模糊由来
这要从两者的画面呈现原理说起,在我们拍摄电影时,每一帧的画面记录的信息是一帧曝光时间段内记录的信息,如果在这段曝光时间内画面内的物体发生了位移,那么在镜头内占据的像素信息也是变化的。简单的举个例子,我们在拍摄一张运动场景的图片时,会发现画面是连贯性模糊的,比如这张我拍的北京五环的夜景照片,可以看到运动的汽车产生了明显的模糊效果:
同样对于电影而言,每一帧画面的信息也是记录一段时间的信息,简单的验证,当我们看到电影中快速移动的镜头时,如果按下暂停,就会发现画面是非常模糊的,如图所示:
出现这种运动模糊的情况是,相机的快门不是瞬时的,而是与曝光时间有关,会持续的接受进来的光的信息,而随着时间的流逝,对于运动的物体来说,传入相机传感器的信息会持续改变并叠加而产生模糊的效果,那么根据相机的成像原理来说,是不是画面曝光时间足够短的话就可以得到清晰的画面呢,答案是否定的,如果缩短曝光时间,可能就会造成进光量不足,而无法获取足够的环境信息
为什么这种模糊的画面可以给人流畅的感觉呢,这是因为人的大脑在处理这些模糊的画面时,会自动的进行画面的修正而产生视觉暂留的效果,从而联想到前后的画面,组合成连贯的画面。
与相机的成像过程稍微不同的是,游戏里面的每一帧画面都是通过计算机实时计算出来的结果,而一帧里面的画面信息代表某一瞬间计算处的画面信息,因此如果场景相机前后两帧位置变化较大,画面信息就会产生明显的差异,而给玩家卡顿的感觉
为了提升低性能设备的游戏体验,尤其是FPS
游戏,会给玩家提供动态模糊的选项,利用动态模糊的视觉原理尝试减少游戏的卡顿感,不过也有一些赛车游戏会通过动态模糊这种方式来提升游戏的真实沉浸感与速度感
Unity实现方式:
关于动态模糊的游戏内实现原理,我尝试去搜索了解一下,其主要是基于前后帧中运动矢量的一个,而运动矢量这个概念与视频编码相关的知识,也有大量的数学知识出现,确实超出我的理解。这里简单的从应用层面来介绍,在Unity
提供的后处理方案中,可以添加Motion Blur
作为后处理的动态模糊解决方案
其三个关键参数为:
Quality
:设置效果的质量。较低的预设可提供更好的性能,但视觉质量较低。Instensity
:将运动模糊滤镜的强度设置为 0 到 1 之间的值。值越高,模糊效果越强,但会导致性能降低,具体取决于Clamp
参数。Clamp
:设置由相机旋转产生的速度可以具有的最大长度。这限制了高速下的模糊,以避免过度的性能成本。该值是作为屏幕全分辨率的一部分进行测量的,值范围是 0 到 0.2。默认值为 0.05
三、 抗锯齿
打开一张图片,然后无线的放大,直到可以看到图片的每一个像素颜色,就会发现基本的像素单元是由一个个方格组成的,如图所示:
而这些像素块通过不同的颜色值最终组成一张丰富多彩的图片,但是由于在微观上层面方块上无法绘制处完美斜线,所以会在宏观层面出现一些突出的锯齿状的现实效果,如下图所示:
很显然,这种显示效果对于游戏画面而言是非常不好的,尤其在色彩对比度比较强的区域,为了尽可能的减轻该效果,就需要一定的手段去干预解决。对于玩家而言,最直接有效的方式就是增大游戏的分辨率,而在技术手段方面,可以通过抗锯齿来柔化边缘场景的外观,来减小突出的不适观感
1、抗锯齿介绍:
抗锯齿可改善多边形边缘的外观,使它们不会产生“锯齿现象”,而是在屏幕上获得平滑的显示效果。但是,它会导致显卡的性能成本升高并使用更多的视频内存(尽管没有 CPU
成本)。抗锯齿的程度决定了多边形边缘的平滑程度(以及消耗的视频内存量),目前已有的抗锯齿解决方案有很多,下面列举几个与Unity
解决方案相关抗锯齿方案,这里的内容介绍直接参考百度百科的描述:
超级采样抗锯齿(SSAA):
超级采样抗锯齿先把图像映射到缓存并把它放大,再用超级采样把放大后的图像像素进行采样,一般选取2个或4个邻近像素,把这些采样混合起来后,生成的最终像素,令每个像素拥有邻近像素的特征,通过这一步的处理,像素与像素之间的过渡色彩,就变得近似,图形的边缘色彩过渡趋于平滑。再把最终像素还原回原来大小的图像,并保存到帧缓存也就是显存中,替代原图像存储起来,最后输出到显示器,显示出一帧画面,整个过程的变化演示过程为:
整个过程的处理就等于,将图片成倍放大后逐像素色彩混合,得到一张模糊的色彩平滑的大图,然后把这幅模糊的大图,通过细腻化后再缩小成清晰的小图。如果每帧都进行抗锯齿处理,游戏或视频中的所有画面都带有抗锯齿效果。而将图像映射到缓存并把它放大时,放大的倍数被用于分别抗锯齿的效果,即我们通常所说的2x
、4x
、8x
就是指的图片的放大倍数。 超级采样抗锯齿中使用的采样法一般有两种:
- 顺序栅格超级采样,采样时选取2个邻近像素
- 旋转栅格超级采样,采样时选取4个邻近像素
2、Unity中设置抗锯齿
Unity
中针对不同的平台或不同性能的游戏设备,提供了多种不同技术方案的抗锯齿选项,大概可以分为下面两类:
- 硬件设备抗锯齿:多重采样抗锯齿(
MSAA
) - 后处理抗锯齿:快速近似抗锯齿 (
FXAA
)、子像素增强抗锯齿(SMAA
)、时间抗锯齿 (TAA
)
下面简单列举一下各个抗锯齿解决方案的简单解释,内容来源百度百科与Unity文档:
硬件设备抗锯齿:
多重采样抗锯齿(MSAA
):
多重采样抗锯齿是一种特殊的超级采样抗锯齿,该技术来自于OpenGL。具体是MSAA只对深度缓存(Z-Buffer
)和模板缓存(G-Buffer
)中的数据进行超级采样抗锯齿的处理。通过深度缓存可以获取到物体的边缘信息,这样就可以只对多边形的边缘进行抗锯齿处理。相比SSAA
对画面中所有数据进行处理,MSAA
对资源的消耗需求大大减弱,不过在画质上可能稍有不如SSAA
在Unity
引擎中,默认支持的抗锯齿方案就是MSAA
,可以在质量设置中找到该选项:
注意,在Unity
中将URP
作为渲染管线时,该选项被移动到URP对应的配置文件中的Quality
中,如果是在项目初始创建时,选择直接创建URP
模板,可以在Assets/Setting
中找到该配置文件
同时对于MSAA
而言,其不可在延迟渲染中使用,所以在Unity
的默认设置中,仅仅考虑在前向渲染中应用该选项
后处理抗锯齿:
Unity
中的后处理抗锯齿提供一下抗锯齿模式:
- 快速近似抗锯齿(
FXAA
);适用于不支持运动矢量的移动设备和平台的快速算法。 - 子像素增强抗锯齿(
SMAA
);适用于不支持运动矢量的移动设备和平台的高质量但速度较慢的算法。 - 时间抗锯齿(
TAA
);一种需要运动矢量的高级技术。桌面和控制台平台的理想选择。
如果是在URP
模板下,你可以在Camera
中看到抗锯齿的选项,其默认选项为FXAA
,即快速近似抗锯齿,如图所示:
如果是默认渲染管线的情况下,就需要通过Post-process Layer
来为每一个相机单独设置其抗锯齿模式,如图所示:
下面简单的粘贴过来Unity
文档对三者的一些基本的介绍:
-
快速近似抗锯齿(
FXAA
):FXAA
是基于MSAA
的一种高性能近似值,是一种单线程的像素着色器是最有效的抗锯齿技术,非常适用于不支持运动矢量的移动平台和其他平台 -
子像素增强抗锯齿(
SMAA
):相比于FXAA
而言,SMAA
的抗锯齿效果的质量更好,但是同时也更加消耗性能 -
时间抗锯齿 (
TAA
):TAA
是一种先进的抗锯齿技术,其中帧在历史缓冲区中随时间累积,用于更有效地平滑边缘。它在平滑运动边缘方面要好得多,但需要运动矢量并且比FXAA
更昂贵。它是桌面和控制台平台的理想选择
以上是关于Unity游戏画面参数解析与应用:垂直同步动态模糊抗锯齿的主要内容,如果未能解决你的问题,请参考以下文章
Unity 3D 游戏通用系统设置页面,自定义按键设置,背景虚化,图像设置,亮度对比度饱和度音量调节,分辨率窗口化,帧率垂直同步,抗锯齿,阴影质量,纹理质量设置