原文链接 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. Integer取值范围和NumberFormatException的解决

    项目有个查询当地新闻的接口,从GEO文件中取得code,后台查询. 下午测试的时候查询日本:3920000000,结果报java.lang.NumberFormatException,数字格式化异常, ...

  2. ***linux下用cron定时执行任务的方法

    名称 : crontab  使用权限 : 所有使用者 使用方式 : crontab file [-u user]-用指定的文件替代目前的crontab. crontab-[-u user]-用标准输入 ...

  3. C# 如何判断系统是否是静音

    推荐的方法,使用CoreAudioApi.dll,仅在win7上测试过: private MMDevice defaultDevice = null; //判断当前系统扬声器状态 private bo ...

  4. oracle 卸载步骤(图解)

    1.卸载第一步:点击开始菜单: 步骤阅读 2 2.点击Universal Installer来实现下面 步骤阅读 3 3.点击卸载产品后出现的内容: 步骤阅读 4 4.点击打开Oracle主目录下的O ...

  5. HDU 1166 敌兵布阵 线段树

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  6. XML基础总结2

    在上篇的博客中,我们系统的介绍了一下xml与html之间的异同以及一部分xml的特性或者说是优点,接下来,我们就xml文档的一些语法规则具体向大家阐述一下: 1.xml文档形成了一种"树结构 ...

  7. JVM的栈内存

    每当启动一个新线程时,Java虚拟机都会为它分配一个Java栈.Java栈以帧为单位保存线程的运行状态.虚拟机只会直接对Java栈执行两种操作:以帧为单位的压栈和出栈. 某个线程正在执行的方法被称为该 ...

  8. bug记录

    1>-[DYMessageNewsTableView _contentOffsetForScrollingToRowAtIndexPath:atScrollPosition:]: row (37 ...

  9. 打造离线使用的Mobile Web App

    最近公司举办技术大赛,我和同事一起制作了一个叫做10K Hours的Mobile Web App,可以帮助你通过一万小时的努力,成为某个领域的专家.正好前段时间翻译了一本书<HTML5 Mobi ...

  10. 【wikioi】1250 Fibonacci数列(矩阵乘法)

    http://wikioi.com/problem/1250/ 我就不说这题有多水了. 0 1 1 1 矩阵快速幂 #include <cstdio> #include <cstri ...