科普 | 高帧率、好画质的「光追」是如何实现的?
2023-10-12 16:37:34 Author: sspai.com(查看原文) 阅读量:6 收藏

不知道上个月上线的《赛博朋克 2077:往日之影》DLC 大家剧情推到哪儿了?

关联阅读:It's Okay To Cry——评《往日之影》及《赛博朋克 2077》

除了与赛博朋克、公司殖民主义、边缘行者等名词高度绑定,现在当我们提起《赛博朋克 2077》这款游戏,出现在很多人还脑海里的自然也有 CDPR 借助光线追踪、DLSS 等技术在其 RED 引擎中所打造的未来城市「夜之城」。

2.01 版本开启超速模式和光线重建后的效果,DLSS 设置为「均衡」

从一卡难求到如今支持最新技术的游戏作品井喷,「光追」也从早年少数游戏和玩家才能享受的前沿体验变成了 3A 大作不可或缺的「点睛之笔」。那光追、DLSS、帧生成等技术是如何提升游戏体验的?它的出现改变了什么,又解决了哪些问题?

注:本文为《升级「真香」的 RTX 30 系显卡后,你能得到什么?》一文的更新内容,原文部分信息已过时。

传统游戏的光照如何实现

我们所能看见的、五彩斑斓的世界,本质上是因为光在传播中遇到了组成这个世界的、不同材质的物体。光线在这些物体上反射、折射、漫反射、散射……经过不同的光学现象加工之后,特定的光线最终到达人眼,经视网膜感光细胞的处理,我们才得以看到不同颜色的物体。这种原理会带来一些很有意思的变化,比如不同材质的物体从相同角度来看观感不同,相同材质从不同角度看过去的感觉也不一样;在光线很暗的时候,我们自然也很难看清东西。

真实环境的光线远比游戏复杂 | 图片自 @unsplash

但同样的「观感」放在游戏世界,所采取的呈现方式则截然不同。在光线追踪技术出现之前,传统的游戏设计在重现光照效果时往往只能从「最终效果」出发,为玩家呈现不同光照环境下,游戏世界所呈现出来的最终效果。

具体的实现原理很好理解:

首先,现代 3D 模型实际上都是通过三角形构成的1,三角形的面数决定了模型的精细程度,模型精度越高,三角形数目也就越多,性能开销也就越大。

由三角形构成的模型,越复杂的模型也越精细

这些三角形要显示在我们的电脑屏幕上,还需要经过「光栅化」,即先将三角形用近似连点描边的方式转化成屏幕上的像素2,然后对三角形内部的像素进行上色,同时判断三角形哪些部分被前面其他三角形遮挡了,被遮挡的部分也无需上色,减少不必要的性能开销。

光栅化工作原理

游戏里的光照效果实现,也是在「光栅化」这个过程里完成的——只需要对三角形内部的像素进行额外的上色步骤即可:模型的三角形都有对应的固有颜色(皮肤有固有的肤色、头发有固有的发色),所以将模型转化到二维像素以后,可以通过每个三角形的颜色为每个屏幕上的像素分配一个初始颜色值。接下来要根据场景里的其他光源来进一步的像素处理来改变像素的颜色,最后还需要根据纹理(皮革有皮革的纹理,布料有不同的材质)对像素做最后的处理,进而生成应用于像素的最终颜色。

所以基于光栅化的游戏光线处理,更像是一种对光照结果的「描绘」而非对光照过程的还原。你看到的画面可以被理解为在自行发光,而不是和生活中一样通过折射、反射等手段传递光线。这也就是我们在上面所说的以渲染「最终效果」为主要手段

光栅化的优点在于可以足够快,程序员可以预先写好光线的程序来处理小面积的光线,还可以制作光照贴图,在需要的时候和环境再进行渲染呈现(静态光照效果)来减少处理压力;但是缺点也很明显:不够真实,比方说游戏中的物体投影大部分时候都是一整块颜色相同的区域(阴影贴图),但是我们仔细观察生活会发现由于光的复杂性实际上的投影由近到远是越来越浅的。

投影和更接近真实的投影 图片来自 unreal 引擎官网

更多关于光栅化不够真实的更多例子可以看这里

光线追踪提供的逆向解法

相比之下,实时光线追踪可以营造更加真实的光照效果,它通过逆向「追踪」与假想照相机镜头(也就是玩家的「眼睛」或者观察点位置)相交的光作为工作原理,来实现对光线的实时追踪。

之所以反其道而行之,除了光沿直线传播、入射角等于反射角等基本光学原理外,更重要的原因是逆向追踪比真实地模拟光线相互作用的效率要高很多——大部分的光经过多次反射会逐渐消失,最后也不会进入眼睛。减少不必要的模拟会让最后的计算压力小很多。

通过逆向追踪实现的实时光线追踪

实时光线追踪技术最终的产物,大家或多或少早在游戏内容外也都接触过了:电影院里的好莱坞大片在特效制作过程中经常会用到光线追踪技术来生成以假乱真的特效场景,这背后往往需要以亿为单位的庞大运算量,每一帧的画面都需要高性能计算机花费数小时的运算——而这还是在提前设计好了场景和环境光线的前提下,游戏的随机性更大,实时光线追踪的实现难度自然也更高。

所以该如何把光线追踪引入到游戏中呢?

2018 年,英伟达发布了第一张支持光线追踪技术 RTX 20 系列显卡,RTX 20 系列中搭载了几组专门的 RT Core 来加速逆向追踪光线的过程,比起 GTX 10 系列,RT Core 在实时光线追踪这件事情上拥有更好的性能,在游戏中开启实时光线追踪后平均帧数也更高。

而 RTX 显卡发展到今天,游戏中的光线追踪也经历了多种实现方式的变迁。其中玩家感受最直观的几种按实现难度来排序分别是:

  • 阴影
  • 高级反射
  • 全局光照
  • 全景光线追踪

阴影

仅阴影

阴影的代表游戏就是《古墓丽影》,这也是实时光线追踪最简单的实现方式。只需要确定动态光源的数量和位置就可以给游戏带去动态阴影的效果,在任何的表面和环境下都能获得逼真自然的阴影效果。

上:未开启光追;下:开启光追,人物有了更真实的投影

高级反射

高级反射

高级反射的代表游戏是《战地 5》,光线需要实时追踪场景里的所有物体才能正确精准地表现出反射效果,所以很多时候会造成很大的计算压力,因此这里往往还会引入传统的反射处理方法:屏幕空间法,只要画面中你能看到的物件不出现、被遮挡或是不可见,就不会产生反射。这也是为什么有些游戏中镜子看不见背后的人的原因。

上:开启光追;下:未开启光追,小汽车更融入环境里了

在高级反射中后续还引入了,光线可以在所有表面形成反射进一步增强真实感的光线追踪不透明反射,可以在透明表面实现不同亮度反射的光线追踪透明反射,独立光源照亮周围细节或是天空的照明照亮表面的光线追踪漫反射照明等一系列细节更新。

上:未开启光线追踪透明反射;下:开启光线追踪透明反射,窗前的反射效果更加真实

全局光照

全局光照

最复杂的实时光线追踪方式则是实现全局光照,《地铁:离去》和《控制》都利用了实时光线追踪去实现全局光照。无论是光源、反射还是投影都是实时光线追踪计算得到的,这可以进一步提高光照的准确度,更好地烘托游戏场景和氛围。

上:未开启光追,下:开启光追;房间内的光照更为准确,给人的感受更为真实

全局光照后续还改善了环境光遮蔽会生成的阴影,确保每个角落和裂缝都有正确的阴影投射,从而进一步改善图像质量和沉浸感。不过实现全局光照的压力真的是太大了:在没有 RT Core 的 GTX 系列的显卡上打开《地铁:离去》的实时光线追踪,1080Ti 的表现直接从「高刷模式」掉到了「电影级画质」,帧率从 149 掉到了 38。

全景光线追踪

不难发现,之前提到的阴影、高级反射又或是全局光照,三者在实现上都是针对特定区域或场景内的光源追踪方式。这些实现方式只追踪一部分光源,需要处理的数据相对较少,对应的计算需求自然更低。在过去显卡光追性能较弱的时候,也可以很好地平衡画面效果和显卡价格。

而在《赛博朋克:2077》这类五光十色的游戏世界中,大量使用这类部分光线追踪方式虽然可以塑造一个充满氛围感的赛博朋克世界,但仔细观察仍然能发现光影交错中视觉上不够真实的地方,比如较远距离的建筑投影闪烁、镜面和水面的投影模糊等等。显然,覆盖范围有限的光源追踪无法完全捕获场景中所有的光线轨迹,从远距离的角度观察也一定会遗漏一些微妙的光照变化和阴影效果。

所以随着显卡性能的提升,英伟达在今年也引入了一套新的全景光线追踪实现3

全景光线追踪可对几乎不限数量的自发光光源的光线特性进行建模,构造出物理意义上更加精准的阴影、反射和全局照明。所以无论场景中光源的数量、方向、或强度如何变化,全景光线追踪均能准确捕捉并在各物体上造成正确的阴影及照明效果,最终提供极其精美的画面质量。

不管是远景还是近景都能带来更真实的光追效果

另外,得益于全景光线追踪,来自天空和大气间接光照效果也可以很好得融入到整个游戏画面中。而且相比于分模块实现,整体的光追反倒可以降低开发适配成本,整合多个光源追踪方式提高性能。所以只要游戏支持,比如 2077 中的「光线追踪:超速模式」,对玩家来说游戏画面的效果一定会更好。

至此,摆在游戏光线追踪面前的就只剩下了最后一个问题:性能。正如前面提到的电影工业里的实时光线追踪十分考验计算能力一样,即便有 RT Core 这样的计算核心进行加速,在原生分辨率下开启实时光线追踪也会带来非常严重的帧率下滑;受限于成本,英伟达也不可能无限制地堆砌 RT Core 数量(不然就真的没几个人买得起了)。

有没有什么办法在不降低分辨率的情况下仍能获得稳定的帧率呢?

让高分、高帧率成为可能

既然高分辨率不能达到稳定的帧率,那不如先降低分辨率渲染,再用算法提升到较高的分辨率,这样不就高分辨率和稳定帧率兼得了嘛。

这其实也是目前大部分游戏机的处理 4K 画面输出的办法。但是用什么算法提升分辨率呢?很多人会想到的第一个方法可能是插值。借助插值,我们可以很轻松地将 1080P 画面提升至 4K 分辨率,但简单插值效果并不好,对游戏这种特殊的渲染内容而言,还会带来额外的锯齿。

图片来自知乎 @一疼 ETN

英伟达最终选择的方案是深度学习,用算法去计算画面,即我们接下来要展开的 DLSS 技术。DLSS 全称 Deep Learning Super Sampling(深度学习超采样),它主要通过 RTX 20 系列引入的 Tensor Core 硬件来加速深度学习,来对实时渲染的图片进行非常高质量的超分辨率。

DLSS 2

在 RTX 30 系列发布前上线的 DLSS 2.0 对比第一代 DLSS 进一步带来了如下改进:

4 倍的实时超采样

2 倍的处理速度

通用模型

媲美甚至超越原生分辨率的画面

其中,4 倍的实时超采样足以让我们在一个极低的渲染分辨率下获得一个高分辨率超采样结果,比如游戏只需要渲染一个 540P 的画面,即可生成一个 1080P 的最终画面,大幅度减少显卡压力。加上一点新算法的「调味」,我们最后获得甚至可以超越原生 1080P 的画面。

图片来自知乎 @文刀秋二

处理速度方面的提升,主要体现在一段时间内可以处理的帧数会更多了,搭配 4 倍的实时超采样,最后的结果就是渲染性能的暴涨以及游戏帧率的直线上升。以《控制》为例,4K 分辨率下光追效果全开(全局光照),直接把 2060 的 8 FPS 提升到了 36 FPS,让 PPT 有了可玩性,堪称魔法。

图片来自知乎 @文刀秋二

而使用通用模型可以快速在多个完全不同的场景、引擎和风格的游戏中部署 DLSS,让所有的游戏利用同一个神经网络实现高质量的超采样。

本来在游戏图形领域,性能和画质绝对是成反比的,要想要更好的画质就一定要牺牲性能。而通过 DLSS 2.0 这种鱼和熊掌兼得的技术,原生分辨率渲染输出很快就变成了过去式。超采样的画面不仅不差,反而可能会更好

左:未开启 DLSS 的原生 1080P,右:开启 DLSS 的 1080P

DLSS 3:不仅要高分辨率也要高帧率

虽然大多数的电影还是 24 帧,但在游戏这一场景下,更高的帧率和更稳定的帧速率自然更好。尤其是对一些快节奏的游戏来说,高帧率也能给我们更多的时间来反应并作出更准确的操作。

因此在全景光线追踪对显卡性能提出新要求的同一时间,主攻高帧率的 DLSS 3 多帧生成技术也应运而生。

帧采样、帧融合与光流法

传统意义上的多帧生成技术分为以下 3 种:

  • 帧融合(Frame Blending):最为基础的插帧技术,其工作原理是通过对比两个连续帧之间像素的差异,生成一帧「过渡」图像,这也是很多智能手机、电视上 MEMC 补帧功能的实现方式。这种技术比较简单,适用于简单的场景,但对于复杂的运动和细节可能处理不太好,可能会出现「模糊」的新帧。
  • 帧采样(Frame Sampling):一种算法更为复杂的插帧技术,它首先通过一个方式4挑选出一部分帧,再从这些帧生成新的、需要被插入的帧,来提高帧率。这种方法可以处理复杂的运动变化,但依赖于原始画面的质量和内容。
  • 光流法(Optical Flow):目前算法最为复杂的插帧技术,通过估计每个像素点在图像序列中的运动,可以生成更精确的新帧。这种技术可以处理更复杂的运动变化,它基于对光的流动进行计算,可以更准确地插值新帧的位置。但这种方法计算复杂,对硬件要求较高,且有的时候也不能达到预期的效果。

然而这 3 种技术在游戏中的应用效果都不一定好,帧融合容易头晕、帧采样可能丢失重要帧,而光流法最后生成的画面不可控。

既然在生成帧结束后再插帧效果都不好,那么为什么不在生成每一帧的时候就针对性地插帧呢?DLSS 3 的帧生成技术采用的正是这种方法:在渲染游戏画面时就生成额外的帧来补齐画面。从实现原理上来说,在对画面完成 DLSS 2 的超分辨率环节以后,DLSS 3 就要开始生成额外的帧了。想要生成额外的帧需要当前游戏帧、前一游戏帧、Ada 光流加速器生成的光流场,以及游戏引擎数据(例如运动矢量和深度)——这里我打算先举一个不算特别恰当的例子辅助大家进行理解。我们可以把 DLSS 3 的所做的事情想象成我们在走路,我们会不断地根据已经走过和看到的路,大概估计下一步脚下的地面会是什么情况。

通过分析前两帧画面,DLSS 3 知道画面中的像素的运动方式

DLSS 3 也是如此,它会分析当前游戏帧、前一游戏帧,就像我们走路时分析之前已经脚下的路和已经走过的路一样,进而理解像素从第一帧图像到第二帧图像中间发生了什么。

不过如果只看脚下的路,那么走路不是会掉坑里就是会走歪;反映在帧生成的环节里,DLSS 只使用之前的画面来生成帧可能会导致视觉效果异常。我们的大脑会通过已经走过的路面、当前的步伐和方向、我们看到的路的情况,来决定我们接下来一步会走到哪里——要不要避开前面的坑、是不是需要停下或者改变方向。比如前面有个坑,我们就知道要避开它;前面有个台阶,我们就知道要抬高脚步。这个过程,就是我们在根据已经观察到的信息,预测下一步要发生什么,以便做出正确的反应。

DLSS 3 知道阴影部分不能借助之前的画面,需要重新渲染

这里游戏引擎数据所扮演的角色就像是我们的大脑:除了提前告诉 DLSS 3 一些必要的数据,DLSS 3 也会自行决定如何用上之前的帧、游戏引擎数据、光流法算法,来有的放矢地预测到每个像素在下一帧中的位置,用尽可能少的资源算出更多的画面。

实际实践中,很有可能 2 帧只需要渲染第一帧的部分画面即可。大幅度解放了 GPU 的渲染能力。

这种级别的图像和引擎数据分析,自然也少不了显卡计算能力的加持,英伟达表示第四代 Tensor Core 推理相比于上一代最高可以提升 4 倍,加上新的光流运算单元,这也使得 DLSS 3 目前只有 RTX 支持这项功能。

整个 DLSS 3 的实现流程

不过有利自然也有弊,虽然帧生成技术可以快速产生更多的帧,但这个过程仍然需要额外的时间。所以,帧生成技术可能会导致用户输入延迟增加。简单地讲,当你在游戏中执行一个动作,这个动作的结果(例如角色的移动、环境的变化等)需要在画面中表现出来,正常情况下显卡会立即计算并生成这个结果然后展示在你的屏幕上,这个过程通常是非常快速的;但在使用当使用帧生成技术时,假设用户在第 3 帧的时候按下了一个按钮,根据第 1、2 帧以及游戏引擎数据,在用户的操作输入抵达 GPU 时,可能画面已经预先渲染到了第 4 甚至 5 帧了,真的开始渲染至少要到第 6 帧,最后就多了 3 帧延迟。这对于我们来说最直观的感觉就是不跟手,而对于竞技游戏来说额外的延迟会更加致命。

Reflex 技术的工作流程

英伟达在这个问题上的解决思路则很简单:尽可能降低系统延迟,也就是使用 RTX Reflex 技术。这项功能于 2020 年正式发布,但放在 DLSS 3 的环节中,RTX Reflex 可以有效降低 DLSS 3 帧生成技术带来的延迟。

未启用和启用 RTX Reflex 渲染上的区别

RTX Reflex 的实现原理一方面是减少队列深度,以为后续输入做准备;另一方面则是就是检测到输入时,及时将命令发送到 GPU。我们依然可以用走路来举例:如果我们走在繁忙的街道上,如果提前计划好下面几步的走法(不开启 RTX Reflex 时),那么遇到情况时,比如一个人突然从旁边的小巷走出来,那你即使反应过来了也很有可能撞上那个人,因为你的脚步(GPU 渲染好的画面)已经落后于你的大脑已经做出的决定(我们的输入)。

所以正常情况下,我们的每一走出一步都会有大脑参与,并且任何突发事件都能使我们的行动即刻响应大脑的决策,无需等待之前行动的完成。

未启用和启用 RTX Reflex 的延迟对比

RTX Reflex 开启时也是如此,它会尽可能得将用户操作优先传递给 GPU,来让 GPU 生成新的画面。这样既降低了延迟,又能享受帧生成带来的更多画面。

DLSS 3.5:为光线追踪引入深度学习

在 DLSS 3.5 得到应用之前,光线追踪的效果生成一般是放在材质和几何体载入完毕后进行的,此时的游戏世界就像一块没有上色的画布,光线追踪根据游戏内不同类型的模型、材质,计算并模拟反射光、散射光和全局光照在画布中不同位置的呈现效果。

未进行光效追踪效果渲染的游戏世界看起来是这个样子 | 图:英伟达

但问题在于,戏内场景千变万化、不同材质对光线的传递效果也各不相同。即便是上面提到的全景光线追踪——因为其实现方式的特殊性(由结果逆推光源和路径)——也无法保证正确判断并渲染画面中的每一个细节。

因此无论是游戏还是上面提到的特效电影,都会在光线追踪效果渲染之前引入一个人为设计的、用于效果优化的降噪器

这些降噪器以往通常采用时域累积、空间插值两种方法,比如时域累积会选择多个连续帧中质量较高的像素点进行合成,此法能有效减噪并提高像素填充效果;空间插值则是在单一帧内,通过插值相邻像素点的灰度值,产生平滑的图像效果。

人工设计的降噪器存在诸多问题,比如因为多帧信息合成导致的倒影画质降低 | 图:英伟达

但无论哪种降噪方案都有其弊端,时域积累会合成不正确的画面、空间插值则会影响全局光照和反射效果……人工设计的降噪器在设计和实际应用中也有诸多难以应对实际状况的地方。

要解决这些局部细节上的「不对劲」,担任调色板和笔刷角色的降噪器就必须更加高效且更加聪明,足以在瞬息万变的游戏环境中决定画面中每个细节应该如何修改和调整。于是便有了 DLSS 3.5 光线重建(Ray Reconstruction/RR)的引入。

前面提到 DLSS 的全称是 Deep Learning Super Sampling(深度学习的超采样),9 月上线的《赛博朋克 2077》 2.0 版本更新中所搭载的 DLSS 3.5,则将这项超采样能力扩展到了提高分辨率、帧率之外——让深度学习参与光线追踪最终呈现效果的生成环节。

光线重建的核心理念在于,将光线追踪光照处理流程中的人工设计组件,改为效率更高、由深度学习驱动的 AI 模型。在大量训练素材的积累下,光线重建就像经验丰富的画家,不仅有更优质的工具,对游戏内的环境和世界也有更独特、更专业的看法和理解;他知道如何融合不同的颜色、纹理和运动,他熟知如何尽可能保留细腻的光照效果,并能善用各种手法来呈现各种光照效果。

同等设置下光线重建开启前(上)与开启后(下)的画质对比,注意路面积水中的倒影清晰度、以及远处桥梁顶部的阴影细节

最终,在《赛博朋克 2077》的世界中,原本就已经足够惊艳的夜之城在视觉上也更能经得起眼尖玩家的鉴赏了。在我们的实际测试中,远处建筑的阴影几乎没有以往频繁出现的闪烁、跳动问题,地面倒影中的霓虹灯广告牌细节清晰可见……无论是近景还是远眺,都几乎不会发现那些原本会打破游戏世界沉浸感的小问题了。

就连车灯在路面和马路牙子上的不同照射效果都更加真实了 | 图:英伟达

最后值得一提的是,RTX 40 系列用户可以将光线重建与帧生成相结合,而 RTX 20 和 30 系列用户则可以将光线重建与 DLSS 或 DLAA 一同开启,也算是充分照顾到了显卡型号没那么新的玩家。如果你阔别夜之城已久,我们也在此提醒显卡型号较老的玩家们——就算全景光线追踪打开后影响游玩帧数,CDPR 也贴心的在设置里准备了只针对拍照模式开启的全景光追选项,喜欢截图的朋友不要错过。

参考链接:

> 关注 少数派公众号,解锁全新阅读体验 📰

> 实用、好用的 正版软件,少数派为你呈现 🚀

© 本文著作权归作者所有,并授权少数派独家使用,未经少数派许可,不得转载使用。


文章来源: https://sspai.com/post/83522
如有侵权请联系:admin#unsafe.sh