原文链接 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.
 
 
 
 

Grand Theft Auto V 图形研究(3)的更多相关文章

  1. Grand Theft Auto V 图形研究(2)

    原文链接 http://www.adriancourreges.com/blog/2015/11/02/gta-v-graphics-study-part-2/   Level of Detail 如 ...

  2. Grand Theft Auto V (侠盗列车手5)图形研究

    原文地址:http://www.adriancourreges.com/blog/2015/11/02/gta-v-graphics-study/   原文的简介: GTA(侠盗猎车)系列自从1997 ...

  3. 怎样关闭WIN7系统的自动更新

    百度经验 > 游戏/数码 > 电脑 > 电脑软件 怎样关闭WIN7系统的自动更新 听语音 | 浏览:108460 | 更新:2012-07-24 18:03 | 标签:win7 1 ...

  4. (转)Multi-Object-Tracking-Paper-List

    Multi-Object-Tracking-Paper-List 2018-08-07 22:18:05 This blog is copied from: https://github.com/Sp ...

  5. Lessons Learned from Developing a Data Product

    Lessons Learned from Developing a Data Product For an assignment I was asked to develop a visual ‘da ...

  6. AI佳作解读系列(三)——深度学习中的合成数据研究

    Below are some investigation resources for synthetic datasets: 1. Synthetic datasets vs. real images ...

  7. 剖析虚幻渲染体系(14)- 延展篇:现代渲染引擎演变史Part 1(萌芽期)

    目录 14.1 本篇概述 14.1.1 游戏引擎简介 14.1.2 游戏引擎模块 14.1.3 游戏引擎列表 14.1.3.1 Unreal Engine 14.1.3.2 Unity 14.1.3. ...

  8. Deferred Shading 延迟着色(翻译)

    原文地址:https://en.wikipedia.org/wiki/Deferred_shading 在3D计算机图形学领域,deferred shading 是一种屏幕空间着色技术.它被称为Def ...

  9. 深度学习与自动驾驶领域的数据集(KITTI,Oxford,Cityscape,Comma.ai,BDDV,TORCS,Udacity,GTA,CARLA,Carcraft)

    http://blog.csdn.net/solomon1558/article/details/70173223 Torontocity HCI middlebury caltech 行人检测数据集 ...

随机推荐

  1. 浅谈Java的输入输出流(转)

    Java语言的输入输出功能是十分强大而灵活的,美中不足的是看上去输入输出的代码并不是很简洁,因为你往往需要包装许多不同的对象.在Java类库中,IO部分的内容是很庞大的,因为它涉及的领域很广泛:标准输 ...

  2. 解决TIME_WAIT过多造成的问题

    sh-4.1# netstat -an |awk '/tcp/ {++S[$NF]}END {for (a in S) print a , S[a]}' TIME_WAIT CLOSE_WAIT ES ...

  3. kmv xml 文件配置vnc 端口冲突 会无法启动

    <graphics type=' autoport='no' listen='0.0.0.0'> 如果有多个虛机用相同vnc port的话,只能有一个可以启动,所以vnc port号是唯一 ...

  4. Mysql or Mongodb LBS快速实现方案

    http://www.wubiao.info/470 前两篇文章: 查找附近的xxx 球面距离以及Geohash方案探讨 (http://www.wubiao.info/372) 微信.陌陌 架构方案 ...

  5. Java hour 52 Weather

    采用jetty 后,默认的welcome-file-list 配置失效了,直接跳转到了struts2 的control 中去了. <welcome-file-list> <welco ...

  6. 13、在 uwp应用中,给图片添加高斯模糊滤镜效果(一)

    如果在应用中,如果想要给app 添加模糊滤镜,可能第一想到的是第三方类库,比如 Win2d.lumia Imaging SDK .WriteableBitmapEx,不可否认,这些类库功能强大,效果也 ...

  7. android 定时器的实现

    在Android上常用的定时器有两种,一种是Java.util.Timer,一种就是系统的AlarmService了. 实验1:使用Java.util.Timer. 在onStart()创创建Time ...

  8. 【JUnit 报错】java.lang.IncompatibleClassChangeError

    使用Junit 测试spring时候报错: java.lang.IncompatibleClassChangeError: class org.springframework.core.LocalVa ...

  9. ajax请求成功后打开新窗口地址

    转自:http://www.cnblogs.com/linjiqin/p/3148205.html jQuery.ajax({       "type":"post&qu ...

  10. Loadrunner中web_custom_request使用场景

    其中有一段从服务器段动态返回的字符串需要重新提交给服务器(见红色标注) 录制自动生成的脚本是: web_submit_data("generateYfLstAction.do",  ...