首发于 游戏人间
GTA V 图形分析摘要

GTA V 图形分析摘要

此文信息主要摘自 Adrian Courrèges 同学的 GTA V - Graphics Study 系列 ( 1, 2, 3),俺昨晚从笔记拷出来时,给 Adrian 同学发了一封邮件,请他允许我 reblog 一下。在得到 Adrian Courrèges 同学的同意后,俺就放上来了。

本文信息提炼后,去掉了绝大部分科普,如有不适,请配合原文的更多细节。

环境渲染


主渲染流程

  • GTA V 的主渲染流程输出到 5 个 RT 并汇入最终的每个像素,透明物体后期另行处理。五个 RT 分别是 Diffuse/Normal/Specular/Irradiance/(Depth/Stencil),绘制这些主体像素大约花了 1900 drawcall。

    • Diffuse RT 内保存了每个像素所属物体的本身的平坦材质色,一个特例 (看车的引擎盖可以发现) 是部分物体保存了方向光的结果,A 通道下面单独谈
    • Normal RT 里保存了每个像素的法线信息,alpha 通道存了一些植被相关的遮罩信息
    • Specular RT 内 RGB 通道分别保存了高光,光泽度和菲涅尔强度信息
    • Irradiance RT 内在 R 和 G 通道保存了主次光源对每个像素的贡献,B 通道存了自发光信息 (车灯,路灯,霓虹灯什么的) A 通道存了一些角色皮肤和植被的标记
    • Depth/Stencil 共用一个 RT,分开说
      • 深度图保存了每个实际绘制的像素到摄像机的距离,每个像素的实际 Z 值是以对数形式保存的,因为 float 约接近 0 越精确,使用对数 (或倒数) 能有效提高超远距离物体的精度 (降低 Z-Fighting)
      • Stencil 用来标记每个像素上各种不同物件产生的不同信息,便于后期做针对性处理,具体在不同的位段做过标记的像素有:玩家控制角色/玩家控制车辆/NPC/NPC车辆/植被/天空
  • 整个渲染以“Front-to-Back”方式进行,这样可以最大化 early-z 的效果。这样的结果是越往后,单个 drawcall 上被拒掉的像素就越多,越省 PS 时间

  • 主渲染流程完成 (也就是这些G-Buffer合并之后) 后如下图 (无天空,水体及透明物体,但含所有的光照和阴影)


裁剪、 LOD 和 Alpha Stippling

  • (裁剪和LOD) GTA V 内判断一个物体是否渲染,是否以较高的精度渲染,是以单个物件为单位,在一个 compute shader 里完成的

  • 解释一下前面的 Diffuse 的 A 通道做了啥事


这个看起来像棋盘格一样的东西叫 alpha stippling,是用来规律性地有选择地拒掉像素的技术。目的是更平滑的 LOD 切换。传统 LOD 的不同级别之间切换的时候,会有 popping,而 stipple 之后普通物体看起来就会“发虚” (尤其是边缘),这样切换时 popping 会弱化很多

阴影 (CSM) 和其他杂项 (RM/SSAO/SSS)


  • CSM 输出到 4 个 1024*1024 单位,但显存内是一张连续的 1024 * 4096 贴图 (注:这个不错,以前的实践是根据摄像机距离使用不同尺寸的 shadow map,GTA V 的统一尺寸更合理,性能也更好)。
  • 四张贴图由四个不同参数的摄像机由近及远分别生成,越近的地方提供越多的细节;这样的问题是需要画四遍,好在 fov 很小裁剪效率更高,最终算下来 CSM 费了 1000 个 drawcall,这里的 drawcall 很廉价 (因为输入/运算/输出量都很小)
  • shadow map 也经过了与上面类似的抖动处理,这样边缘经过模糊后会更平滑
  • 关于模糊有个小优化:先弄个 1/8 尺寸的贴图做一个轻量级的 blur,以明确哪些地方无阴影/部分阴影/全阴影,然后做全深度的 blur 时就能忽略那些无阴影和全阴影的像素了,可以省掉大量的像素操作
  • (Planar Reflection Map) 这玩意费了 600 drawcall 反着画在一个 240*120 的纹理上,用于大面积水面的反射
  • (SSAO) 半精度,做了一下深度相关的模糊
  • (SSS) 嘴唇处的 3S 效果是很显著的,对比上面两张大图。由于 Stencil Buffer 里一个位段专门存了玩家控制角色的像素贡献,而 Specular Map 内的 a 通道存了皮肤的像素贡献,通过这些信息可以做到在最少的像素上做 3S (对脸部专门处理性价比高一些,因为这是个看脸的世界-_-)

水面,雾效,大气 (体积阴影)

  • 用了两张图:Diffuse Map 里存了水的本色,Opacity Map 在 R 和 G 通道里分别存了水的透明度和那一像素的水深信息 (用于透明度贡献率的计算) 存水深还有个好处是,顺便把 z 值过了确定是否可见 (也就是说 G 通道决定了是否对最终效果有贡献)
  • 最后实际绘制用了先前提到的反射图,折射图和 Bump Map
  • ( light-shaft map) 用于把阳光无法直射的区域的亮度压下去,半精度,顺便 blur 了一下让效果更自然
  • 雾效的最重要的作用是掩盖远处低模的细节,数据来源以之前输出的深度图为主
  • 天空 (半球,一个 drawcall) 和云 (环状 mesh,见三国志9) 没有用生成的 (反正硬盘不值钱哇哈哈哈)

透明物体和修修补补

  • 墨镜,挡风玻璃,大灯的灯罩
  • 扬起的尘埃尽可能 instancing 了
  • 这一帧所有透明物体共 11 个 drawcall
  • 利用前面存下来的像素把前面提到的参与 Alpha Stippling 的像素融合一下

后处理, AA 和 Lens Distortion

  • Tone Mapping 使用了 Filmic Tonemapping Operators (神海2)
  • HDR 用了四分之一精度,亮度用一个独立 compute shader 存到一个单像素纹理上
  • 算曝光,然后把较强光滤一把,这时候一般只剩几个离得近的车灯了
  • 然后是先往小再往大的迭代,回到半精度,最后 bloom/gamma 一下

曝光控制很重要,帧与帧之间的 coherence 控制一下,注意, GTA V 的“从暗转亮”比“从亮转暗”要快 (符合真实人眼感受)

  • AA 不说了
  • Lens Distortion 一个简单的 PS 稍微形变一下,让最终成像更有镜头感

界面

左下角的 UI 小地图是预生成的小块 tile,道路和建筑全部是矢量化的,无级缩放不损精度而且省空间



统计 (drawcall: 4155, textures: 1113, render targets: 88)

这儿不说啥了吧,看上面三个数字,嗯。

话题 a : LOD

R星的 LOD 确实令人发指,即使在 PS3 那 256M 内存上也是几百公里随便跑,进了游戏就没有 loading 这回事。高低精度的各种不同版本,满足不同情况下顺畅运行的需要。(当然这是游戏数据量大的原因之一)屏幕上目所能及的星星点点灯光大部分都是可找到出处的真实发光的光源。



每个方块都用了同一张 32*32 贴图(屏幕右下角),一共上万个面吧,分批量按静态/动态的更新频率 batch 一下。运动着的车灯是动态更新的,晚上远距离下只画车灯就够了,跑近了再切整模。

山体都有对应的低精度模型来做基础的 diffuse 贡献,这些低模可能是先自动生成再手动调整的。这些低模还可以用来生成一些次要的像素 (反射什么的)

这些以 GB 为量级的数据不断随着玩家的移动加载/释放,大部分在内存里是压缩状态。

当视角从一个角色切到另一个(相距数公里)时,摄像机有一个拉远再拉近的效果,用动画来避免了瞬间的IO过载。正常开车的移动速度跟这个相比就慢多了,streaming 完全没有问题。而飞行速度就快多了,相应地,由于视线很远,大多细节可以去掉,或用低精度模型代替。

话题 b : 特效


游泳池和海面不同,游泳池只是动一下法线,海水动法线不够,顶点也是实时更新的。反射贴图的精度很低,因为各种特效一盖就看不出来了。



镜子是简化的没啥特效的水,反射质量也就是像素精度是可调的,距离超出范围就会变成黑板。


这个 Anamorphic Lenses 只有迎面过来的强光才会有,跟普通 Lens 一样生成的动态 sprite。

话题 c : 景深


用了 Circle of Confusion 做景深,存了 signed (-1, 1) 符号直接用来表示与焦点的关系。这个 CoC Map 用来与深度配合,获取前景/背景的信息,相邻像素的模糊关系及是否位于焦点上等信息。结果是前景的模糊融入焦点范围 (这一块用一张专门的图分离出来做模糊),背景模糊与焦点分离。

其他的 Heat Haze, God Ray 啥的,不多说了。

最后,感谢 Adrian Courrèges 同学的精彩系列文章。

[完]
Gu Lu
[2015-12-30]

4617作文网动物诊所起名周易免费抽签免费周易起名软件好公司起名物业公司起名大全周公解梦1518免费查询大全姓魏起哪些名字机车起名字给孩子起名字怎么起?超梦西游2破解版联名起诉书范文米易县周边酒店周易八字起名网免费取名起名字用什么诗起名称典康熙字典红楼梦解惑12月9日八字算命生辰八字测算寿命小吃馆起名今年的运势周易测算免费平姓怎么起名子生辰八字算命先生的周姓起名大全鼠年宝宝起那些名字好算命先生会不会害你起名带木字的名字大全女孩起名带源字的的意思个人命运测算算命说婚姻不顺周易宝宝起名称健康环保公司起名淀粉肠小王子日销售额涨超10倍罗斯否认插足凯特王妃婚姻让美丽中国“从细节出发”清明节放假3天调休1天男子给前妻转账 现任妻子起诉要回网友建议重庆地铁不准乘客携带菜筐月嫂回应掌掴婴儿是在赶虫子重庆警方辟谣“男子杀人焚尸”国产伟哥去年销售近13亿新的一天从800个哈欠开始男孩疑遭霸凌 家长讨说法被踢出群高中生被打伤下体休学 邯郸通报男子持台球杆殴打2名女店员被抓19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警两大学生合买彩票中奖一人不认账德国打算提及普京时仅用姓名山西省委原副书记商黎光被逮捕武汉大学樱花即将进入盛花期今日春分张家界的山上“长”满了韩国人?特朗普谈“凯特王妃P图照”王树国3次鞠躬告别西交大师生白宫:哈马斯三号人物被杀代拍被何赛飞拿着魔杖追着打315晚会后胖东来又人满为患了房客欠租失踪 房东直发愁倪萍分享减重40斤方法“重生之我在北大当嫡校长”槽头肉企业被曝光前生意红火手机成瘾是影响睡眠质量重要因素考生莫言也上北大硕士复试名单了妈妈回应孩子在校撞护栏坠楼网友洛杉矶偶遇贾玲呼北高速交通事故已致14人死亡西双版纳热带植物园回应蜉蝣大爆发男孩8年未见母亲被告知被遗忘张立群任西安交通大学校长恒大被罚41.75亿到底怎么缴沈阳一轿车冲入人行道致3死2伤奥运男篮美国塞尔维亚同组周杰伦一审败诉网易国标起草人:淀粉肠是低配版火腿肠外国人感慨凌晨的中国很安全男子被流浪猫绊倒 投喂者赔24万杨倩无缘巴黎奥运男子被猫抓伤后确诊“猫抓病”春分“立蛋”成功率更高?记者:伊万改变了国足氛围奥巴马现身唐宁街 黑色着装引猜测

4617作文网 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化