图形渲染技术分享:《GTA V 》图形分析摘要

环境渲染
 

  • 最外层的 cubemap 是每一帧实时生成的,目的是简化后续真实反射的渲染。
  • 这个 cubemap 是一张低精度的 128*128 纹理,每个面 30 左右 drawcall,都是地表天空等较大像素贡献的多边形
  • 全部是静态物体,所以车辆的外壳反射不了其他的车和角色
  • 这个 cubemap 随后被转成了双抛面图 (Dual-Paraboloid Map),投影过程类似球面映射,这样的话相关 PS 开销就从 6 个面降到了 2 个面 (一上一下,各 128*128),由于摄像机一般在车顶斜后方45度,反射的绝大部分时间都只用访问朝上的那个面,如果用 cubemap 就是 3~4 个面。整体来看,图像质量上四个侧面受影响最大,顶面和底面保留最多,由于摄像机看到的车顶通常反射顶面,所以效果损失很小。


主渲染流程

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车辆/植被/天空
 


裁剪、 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 啥的,不多说了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/41697.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GaussDB火焰图分析

目录 问题描述问题现象告警业务影响原因分析处理方法 问题描述 CPU利用率是衡量系统负载和健康度的重要指标之一,系统在运行过程中时常发生CPU利用率高的情况。在分析性能问题时,可通过火焰图查看CPU耗时,了解瓶颈在哪里。 问题现象 部分s…

3.15 数据库吐槽大会

‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 大家好,我是一名狂热的数据库程序员,趁着 3.15 的良辰吉日,鼓起勇气站上了数据库吐槽大会舞台,以下故事纯属虚构,如有雷同,请对号入座。 名不副实的数据…

一个月涨粉翻倍,摄影博主慌了:照片都是假的,肖像根本不是人

白交 发自 凹非寺量子位 | 公众号 QbitAI 一个月内涨粉翻倍,摄影博主却慌了,忍不住坦白: 我的照片都是AI生成的。 去年十月份开始,这个名叫Jos Avery的大哥(后面简称乔大哥)开始在社交网络上发照片&#xf…

百度文心一言正式亮相

OpenAI 刚发布了 GPT-4,百度预热已久的人工智能生成式对话产品也终于亮相了。昨天下午,文心一言 (ERNIE Bot)—— 百度全新一代知识增强大语言模型、文心大模型家族的新成员,正式在百度总部 “挥手点江山” 会议室里发布。 发布会一开场&…

LangChain大型语言模型(LLM)应用开发(三):Chains

LangChain是一个基于大语言模型(如ChatGPT)用于构建端到端语言模型应用的 Python 框架。它提供了一套工具、组件和接口,可简化创建由大型语言模型 (LLM) 和聊天模型提供支持的应用程序的过程。LangChain 可以轻松管理与语言模型的交互&#x…

chatgpt赋能python:用Python绘制散点图并标注各点名称

用Python绘制散点图并标注各点名称 在数据分析或机器学习中,散点图是一种常见的可视化方法。Python中的matplotlib库可以用来绘制各种类型的图表,包括散点图。然而,在散点图中标注每个点的名称是非常有用的,这可以帮助理解和解释…

类模板函数模板从属类型

准备看个项目找实习&#xff0c;边看边学&#xff0c;一看到处都是template 和typename&#xff0c;好几年前学的C都忘记光了&#xff0c;在这里先做个笔记复习一下。 template <class T> T abs(T x) {if(x < 0) return -x;return x; } int main() {int x 1;cout <…

jsonpath 语法介绍

文章目录 前言 一、对jsonpath的理解 二、补充 三、哪里可以用的到呢&#xff1f; 总结 前言 在使用Python做接口测试中需要获取json中的字段值&#xff0c;因此需要使用jsonpath里面的提取规则&#xff0c;所以特意学习了jsonpath中的语法。 一、对jsonpath的理解 在线运…

如何结合均线分析伦敦金行情走势线图

伦敦金并不是普通的黄金投资产品&#xff0c;它不但拥有黄金基本的投资属性&#xff0c;还拥有高杠杆双向交易的特性&#xff0c;如果投资者只懂得怎么投资黄金&#xff0c;但没有娴熟的交易技巧和稳健的交易心态的话&#xff0c;恐怕还是难以在这个市场取得成功。 伦敦金价每天…

5.8晚间黄金行情走势分析及短线交易策略

近期有哪些消息面影响黄金走势&#xff1f;本周黄金多空该如何研判&#xff1f; ​黄金消息面解析&#xff1a;周一亚洲时段&#xff0c;现货黄金小幅反弹&#xff0c;目前交投于2024.3美元/盎司附近&#xff0c;一方面是金价上周五守住了 2000 整数关口&#xff0c;逢低买盘涌…

高胜率现货黄金走势图形

做现货黄金&#xff0c;如果投资者能成功发现市场的底部&#xff0c;收益无疑会十分可观。金价走势图中经常会见出现各种底部&#xff0c;楔形底、双底、圆弧底、头肩底….虽然是三角形的底部相对更为罕见&#xff0c;但一旦出现&#xff0c;后期的涨幅通常将会超出我们的想象&…

前十名现货黄金价格行情分析软件

很多刚接触现货黄金投资的新人&#xff0c;也许都不太了解现货黄金价格行情分析软件&#xff0c;每个不同时段中的现货黄金价格行情分析图&#xff0c;反映的是该时段的多空角力情况&#xff0c;从而了解金价大致趋向&#xff0c;由此指引投资者作出合理的交易计划&#xff0c;…

5.21下周黄金走势分析及开盘独家交易策略

近期有哪些消息面影响黄金走势&#xff1f;下周黄金多空该如何研判&#xff1f; ​黄金消息面解析&#xff1a;周五(5月19日)美市尾盘&#xff0c;现货黄金收报1977.54美元/盎司&#xff0c;大幅上升19.99美元或1.02%&#xff0c;日内最高触及1984.22美元/盎司&#xff0c;最低…

运用常用指标进行白银走势预测

银市中有许许多多的技术指标&#xff0c;这些指标都是帮助我们预测走势、完成交易的。所以&#xff0c;在白银走势预测的过程中就涉及了白银走势预测的问题。那么在白银走势预测中&#xff0c;我们常用那些指标呢&#xff1f;那些技术指标最能对我们的预测和交易结果最有帮助呢…

5.11黄金最新行情走势分析及多空交易策略

近期有哪些消息面影响黄金走势&#xff1f;本周黄金多空该如何研判&#xff1f; ​黄金消息面解析&#xff1a;北京时间周三(5月10日)20:30&#xff0c;美国劳工部公布4月通胀报告&#xff0c;整体与核心CPI年率都走低&#xff0c;支持美联储6月份保持利率不变。数据显示&…

陶泓达:4.11黄金原油白银最新走势分析及操作策略!

黄金行情走势分析&#xff1a;   周一(4月10日)&#xff0c;国际金价一度跌约1%&#xff0c;重回2000美元干口下方。此前公布的美国3月非农就业数据显示劳动力市场吃紧&#xff0c;并提高了美联储5月再次加息的预期。金属公司MKS PAMP在一份报告中表示&#xff1a;“金价自20…

5.20下周黄金行情走势分析及开盘独家交易策略

近期有哪些消息面影响黄金走势&#xff1f;下周黄金多空该如何研判&#xff1f; ​黄金消息面解析&#xff1a;周五(5月19日)&#xff0c;现货黄金价格下跌又反弹&#xff0c;现货黄金持续走高美联储主席鲍威尔&#xff1a;那些积极的供应冲击不太可能重复出现&#xff0c;美联…

6.4下周黄金最新行情走势分析及开盘交易策略

近期有哪些消息面影响黄金走势&#xff1f;下周黄金多空该如何研判&#xff1f; ​黄金消息面解析&#xff1a;周五(6月2日)&#xff0c;美市尾盘&#xff0c;现货黄金收报1947.82美元/盎司&#xff0c;大幅下跌29.70美元或1.50%&#xff0c;日内最高触及1983.43美元/盎司&…

国际现货黄金走势图如何分析?

我们做任何的事情&#xff0c;都要有独立分析的过程。毕竟投资国际现货黄金是我们投资者自己的资金&#xff0c;最好能够自己做出判断进而去选择&#xff0c;而不是依靠外力。那么小编下面来谈谈国际现货黄金走势图如何分析的问题。 分析国际现货黄金走势图的方法无非是三个流派…

5.29今日黄金最新行情走势分析及多空交易策略

近期有哪些消息面影响黄金走势&#xff1f;今日黄金多空该如何研判&#xff1f; ​黄金消息面解析&#xff1a;上周五(5月26日)美市尾盘&#xff0c;现货黄金收报1946.01美元/盎司&#xff0c;上升4.76美元或0.25%&#xff0c;日内最高触及1957.31美元/盎司&#xff0c;最低触…