环境渲染

  • 最外层的 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 啥的,不多说了。

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

  1. 技术分享:Ettercap图片分析

    技术分享:Ettercap图片分析 实验工具 1. VMware虚拟机 2. Kali 2021 系统虚拟机 3.Windows 7系统虚拟机 4.Ettercap工具 1.在VMware中打开Kal ...

  2. 【华为云技术分享】根因分析

    1.  什么是根因分析 在工作中我们经常会遇到根因分析的提法,有时也称作根原因分析或简称RCA(Root Cause Analysis),那什么是根因分析呢?目前还没有一个公认的定义,一般都是从操作层 ...

  3. 技术分享 | OceanBase 错误日志分析

    作者:操盛春 技术专家,任职于爱可生,专注研究 MySQL.Ocean Base 源码. 本文来源:原创投稿 *爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源. Ocean ...

  4. 读光OCR-文字识别技术解读与应用案例分析

    读光OCR-文字识别技术解读与应用案例分析 摘要:大数据上云特惠活动系列直播,阿里巴巴高级算法专家永攀对读光OCR-文字识别技术和行业应用进行讲述.OCR的本质是识别图片中的文字,即在复杂的图片背景下 ...

  5. 【技术分享篇】Linux内核——手把手带你实现一个Linux内核文件系统丨Linux内核源码分析

    手把手带你实现一个Linux内核文件系统 1. 内核文件系统架构分析 2. 行行珠玑,代码实现 [技术分享篇]Linux内核--手把手带你实现一个Linux内核文件系统丨Linux内核源码分析 更多L ...

  6. 理论计算机图形渲染技术是否已经到了没有什么可以研究的地步了?

    理论计算机图形渲染技术是否已经到了没有什么可以研究的地步了? Offline渲染的各种技术理论已经完备,实时渲染技术除了实时GI之外已经没有研究价值? 添加评论 分享 按投票排序按时间排序 12 个回 ...

  7. 技术分享 | 从自动微分到可微编程语言设计(三)

    摘要 自动微分(Automatic Differentiation,AD)是一种对计算机程序进行高效准确求导的技术,一直被广泛应用于计算流体力学.大气科学.工业设计仿真优化等领域.而近年来,机器学习技 ...

  8. 3D虚拟化技术透析及竞争分析

    标签: sVGA vSGA vDGA GPU vGPU citrix vmware 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任. http: ...

  9. Part1:3D虚拟化技术透析及竞争分析

    因为每篇blog字数限制,所以我们分四章节来介绍这个vGPU专题.这是第一篇. 一:3D虚拟化技术透析及竞争分析 sVGA.vSGA.vDGA.vGPU.GPUPass-through,天哪,太多的缩 ...

最新文章

  1. Linux (Ubuntu)使用vi和vim方向键变成了ABCD
  2. leetcode算法题--Remove K Digits
  3. 干货整理!深度学习相关的面试考点
  4. mysql 导入创建表空间_说说在 Oracle11g 中如何创建表空间、创建用户并授权以及导入与导出数据...
  5. 无人车创业正驶入分水岭
  6. 威盾VIACONTROL远程监控注册机及试用手记
  7. linux九九乘法表,linux shell 九九乘法表
  8. 一种基于A* 算法的动态多路径规划算法
  9. 【上电即上华为云】华为云openCPU智联模组_wifi_HF-LPX70_RISC-V_CoAP
  10. Blender - Proportional Edit Mode - 按比例编辑模式(3D版的液化、挤压工具)
  11. Java项目:基于jsp+ssm乐轩公司订餐系统(计算机毕业设计)
  12. 小学是否有计算机专业,小学计算机教学计划
  13. ECharts 柱状图上显示数据,并自定义图标
  14. css文件插入背景音乐,关注css背景音乐代码
  15. oracle中正则表达式规则,Oracle SQL 正则表达式
  16. java中的pojo是什么意思
  17. WebGIS开发绘制地图标注
  18. 金属学复习【2】--- 纯金属的结晶
  19. 漫步有感 | 让自己温和一点
  20. vue2简单封装highcharts

热门文章

  1. android 电视关闭动画,Activity 展开和关闭动画
  2. 四阶显式Adams法求方程组C语言,第五讲第4章线性多步法(续
  3. php 提取登录QQsid_php模拟登录qq邮箱(curl命令详解)
  4. Apriori 使用说明
  5. 并不对劲的bzoj4816:loj2000:p3704[SDOI2017]数字表格
  6. [BZOJ 4827][Hnoi2017]礼物
  7. SQLServer 阻塞的等待类型解析
  8. Servlet3.0新特性WebFilter(Annotation Filter)详解
  9. 关于cocostudio动态添加控件触摸响应无效的学习
  10. PHP 单一入口程序