Grand Theft Auto V 图形研究(3)
原文链接 http://www.adriancourreges.com/blog/2015/11/02/gta-v-graphics-study-part-3/
Post Processing Effects 后处理特效
一旦场景被渲染完成,便是执行后处理特效来增强画面效果,修复缺陷,改变整体气氛等等...
我们在第一部分也了解到一些使用到后处理特效,像bloom, anti-aliasing 和 tone-mapping. 但GTA V里还使用了一些其他的特效。
Lens Flares & Light Streaks 镜头光斑和光源条纹
光源射入真实世界的镜头时,散射和内部的反射有时会产生“失真(artifacts )”。
这里所说的“lens flares”,是沿着屏幕中心的明亮光源所定义的轴向分布的明亮光点的集合。
也有“light streaks”这种从光源处放射的效果。这种失真效果在电影中很常见,把这种效果加入到游戏中可以给人一种“电影”的感觉。
这里有两种方法来渲染这种失真效果
image-based:抽出最亮的区域,对这个区域做复制和变形,适用于任意数量的光源。
sprite-based:手动的添加textured-sprites并管理位置,每个光源都需要分别处理,但美术师对效果的形状,颜色,强度有更多的控制权。
实际上GTA V 同时使用了这两种技术:image-based的方法用来在画面的左下角增加微秒的蓝色光晕效果,是 bright-pass buffer的对称。但场景中最明显的效果还是使用sprite-based的方法,它只适用于太阳。light streaks 是在太阳周围12个旋转的四边形来加入的,而lens flares是沿着“太阳到屏幕中心”的轴绘制的70个sprite。相机方向越接近太阳,这些效果之间距离也越接近。
引擎使用了几种sprite来模拟不同的镜头效果:
GTA V 关注一切的细节, lens flares 也不例外: 它的大小和相机的光圈成比例。如果你突然朝向太阳,lens flares起初很大,然后随着光圈缩小来降低曝光,lens flares也会变小。下面的动画演示了这个现象。
另外一个不错的细节是:如果你切换到第一人称视角,你几乎看不到任何的lens-flares,因为这时我们是通过人眼来观看,而不是通过相机。
Anamorphic Lenses 变形镜头
特别是夜晚的黑色区域,游戏模拟了变形镜头的失真效果:水平或垂直的长条纹,通常是蓝色。变形镜头生成的 Light streaks是最近流行的,也在好莱坞最近的科幻电影中使用了。
游戏中的效果是通过sprites作出,就像前面看的太阳光的效果,只在类似直接朝向相机的车前灯的非常明亮的光源上使用。
Depth of Field 景深
下面这个场景看起来比电影稍微“失真”一些,所有事物都显示的非常的清晰和干爽,你可能会期待像电影里那样背景的风景失去焦点(out-of-focus)并变的模糊。
Depth of Field effect (DoF) ,就是通过把图像中非聚焦的部分进行模糊,来解决这个问题的。
它是如何应用的?首先通过 depth buffer生成Circle of Confusion(模糊圈) map。通过这张贴图告诉我们每个pixle的“失焦”程度,换句话说就是每个pixel的模糊程度。一个pixel的CoC值,取决于它与相机的距离(也就是像素深度)和相机的镜头参数。
需要注意的是GTA V保存的CoC是有符号值,即是在-1到1的范围内。符号肯方便告诉我们这个pixel是在聚焦区域的前面还是后面。如果一个很远和失焦的pixel,它的CoC值是1,如果pixel非常接近相机且失焦,它的值是-1。任何值接近0的pixel几乎不做模糊。
为什么需要有符号数值?
这是由于创建一个高品质的DoF是很复杂的,当你“模糊”场景时,需要考虑很多情况。
例如,你不想让背景的失焦pixel影响到它前面聚焦部分的pixel。如果要考虑前景的失焦pixel,那么情况就相反了: 你需要让它可以渗透它后面的聚焦区域pixel。所以当要模糊pixel时,并不是简单的“模糊多少”的问题,你也需要知道,周围的pixel是在前面还是后面,是聚焦还是失焦区域,因此,有符号的值可以区分不同的情况。
在下面的CoC map里,用green通道表示CoC > 0的部分,而red通道表示 CoC < 0 以方便观看。
所以,通过CoC Map我们可以得知莱斯特(游戏中的角色)的黑色部分是焦点,而前面的富兰克林(游戏主角)和后面的背景则是失焦的部分。
然后,引擎只抽取"前面的失焦区域":所有CoC < 0的texel,然后把这个CoC map通过一个水平pass和一个垂直pass用compute shader来做模糊。
这么做的原因是?富兰克林的pixel值比较高,大约是0.7,而他右后方的长椅在焦点范围,CoC的值为0。当执行模糊时,富兰克林看起来很模糊,而长椅仍然非常的清晰,而接近富兰克林右臂的区域看起来会很奇怪:从强烈模糊的手臂Pixel到突然清晰的长椅的pixel会有突变。这种很明显的生硬轮廓是不应该产生的,轮廓应该平滑,富兰克林的pixel要渗入到周围的pixel里。
这也就是模糊CoC map的目的:修正CoC map的不连续性,使"前面失焦的区域"可以渗透到后面。
然后我们需要计算景深了。在较低的分辨率上通过 pixel shader来计算传统方法blur,分为水平和垂直两个pass来优化计算。GTA V 也是沿用了这种两个pass的方法,但是在原始分辨率上进行的,为了避免影响性能,用 compute shader来替代pixel shader。这是因为 compute shader更加适合计算 large-kernel的模糊效果。计算pixel最后的"模糊"值时,pixel的颜色会或多或少受到邻接pixel的影响(取决于pixel的CoC),而一些可能会导致错误渗入的邻接pixel则会被排除掉。
使用 compute shader 计算水平和垂直两个pass的模糊
这个效果会给予画面完整的层次感,就像电影中,导演会聚焦在一个角色以引起注意。
Conclusion 总结
我们还有许多后处理特效可以讨论,不过这个GTA V的系列文章的长度已经超出计划了。
例如heat haze,god rays (通过屏幕空间使用亮度溢出,或者在场景里手动的增加mesh),motion blur (似乎是一种混合的方法,通过一个特殊的pass在相机的旋转方向上做定向模糊,并使用stencil buffer作为mask来剔除玩家角色的pixel)。
你的角色死亡时的"Wasted"屏幕是纯粹的后处理,把渲染的场景模糊后,转为灰度图,加入vignetting(图像四周的暗角)和胶片的颗粒感后再把"wasted"的文字绘制在上面。
希望这些可以揭露一些Rockstar创造出被认为是在视频游戏历史上有里程碑意义游戏的秘密。
广阔的场景,沉浸感和对细节的关注,以及Rockstar设法在老世代的家用机上运行,使得GTA V成为了一款非常伟大的游戏。
链接
The tech that built an empire: how Rockstar created the world of GTA 5 featuring an interview of Aaron Garbut.
GTA V NVIDIA Performance Guide with details about the different graphics settings.
Renderdoc which made picking into GTA V internals a breeze.