发布时间:2015-12-22 10:47 我来说说 我要投稿
在早前,老外Adrian曾为我们详细拆解了《GTA5》的一帧画面,让我们感受到R星这款沙盒大作竟是如此碉堡!而现在,这位大神为我们带来了解析的第二课,详细解释了LOD(细节水平)以及Reflections(反射效果)。
如果说R星制作游戏技术有一方面明显领先于业内其他公司,那么无疑就是LOD,在洛圣都各处无不彰显着R星出色的LOD实力,使得你在游戏过程中体验更加真实。
光源:
Aaron Garbut(R星北方工作室艺术总监)在PS3版发售之前说过:在游戏中无论多远的光源都是真实的,当你驱车到达光源所在地你可以发现这些光是由什么物体散发的。
他的这些话是否准确呢?让我们一起来看看下面这张夜景图。
闭灯状态
开灯状态
这的确碉堡了,在远景时,无数灯光出现在统一画面中,只是此时的光源都是用一个个32X32正方体模型渲染而成,由于这些点采用了Instanced Geometry(几何实体化)技术进行批量处理,因此会给显卡造成不小的压力(这也是为何就算游戏做足了优化,对于显存还是存在最低级别的需求)。
正常亮灯夜景
光源线框图
标明距离像素距离
而且这不仅仅需要渲染静态光源,《GTA5》中有着许多不断移动的车辆,好在由于距离问题,车辆建模无需一个个渲染,需要渲染出的内容只是车前的两盏灯(如果某些游戏制作时为了更加逼真的效果,连远景中的车辆都进行动态渲染的话,四路泰坦估计都难以承受),但随着距离缩短,车辆LOD会逐步上升,直到最后你能够看到完整的车辆建模。
多边形网格弱化:
在前一篇文章中,那么广阔的区域都是在同一帧中被渲染的,那么在较远距离的山脉是如何处理的呢?
一个Draw-Call概括整个远处的山脉
虽然在画面中看起来远处的山脉面积不到,但在实际游戏中这一块区域是非常广袤的,是一个跨越了几平方公里的区域,同时还包括了各类建筑融合在其中,伽利略天文台坐落在山顶上,希腊剧场,好莱坞水库,这些场景在实际游戏中是可以探索的,但如果你在远景中要同时渲染这些内容,将会产生大量的Draw-Call以及多边形,在这里R星就采用了漫反射网格处理来降低网格组件精度,这个区域很远,用低多边形的版本来渲染后只会产生1个draw-call和2500个多边形(2500个多边形低到难以想象)。这个转化并不能完全的自动化处理,需要Rockstar的3D美术师花费几天时间来手动的微调网格,也不会感到惊讶的。
伽利略天文台
低多边形处理的Vinewood山脉
此外,城市中小首尔区的几条街,绘制完后也仅仅产生一个Draw-Call,多边形网格弱化在处理游戏远景过程中非常有用,将会有效区分不同距离的LOD等级,对于大型沙盒游戏来说,如果不降低远景网格精度,在实时的渲染过程中会产生大量的几何体,导致同一画面Draw-Call数量过高,不仅仅玩家难以运行,开发成本也是难以预计的。
低多边形处理的小首尔
资源加载技术:
不同的LOD层次意味着开发者需要制作不同版本的环境世界,这是一项非常艰难且耗时的任务,但即使你做到了分层次的LOD,你距离终点只完成了一半,你可以用几个G的硬盘来储存不同LOD的贴图和模型,但如果你的RAM和GPU无法有效的读取画面内容那一切努力只是徒劳。
《GTA5》的采用了实时动态数据传输进行资源加载(有的游戏采用的则是区域加载,你在进入一个区域前,读取完所有内容,玩家就会进入所谓的Loading画面),每当你进入到地图的另一个区域都会进行模型和贴图数据的上传和下载,更可贵的是R星能够稳定这样的实时传输数个小时。
这得益于R星之前主机版本的压缩技术,能够将这些图形数据压缩到主机内存能够顺畅的读取和上传,也正式由于压缩技术的进步,《GTA5》的画面细节表现力较之《GTA4》有的大幅度的进步。
但实时动态数据传输技术目前并不完美(即使压缩的再好,释放还原还是需要一定时间),游戏中很明显的例子就是切换角色,或是你将相机镜头从地图一段迅速移动到另一段,这会造成系统瞬间过载而导致需要5秒钟左右的读取时间来进行资源释放,好在《GTA5》在进出房间这个过程处理的非常出色,让玩家甚至感觉不到加载时间。
同时,当你正常驾车时,移动速度足够慢,实时动态数据传输系统就有足够的带宽来保持数据上传和读取。但当你开飞机的情况就不一样了,玩家肯定有感觉在游戏中开飞机的速度非常缓慢,这是由于实时距离转变跨度过大,如果飞机速度设定过快的话,处理器无法保证正确的读取和上传,最终导致游戏奔溃,这也是R星采用此类传输办法的一个弊端。
反射效果:
在上一期的帧数解析中水面效果出现的并不多,所以今天直接来看一看这个大大的游泳池。
和之前一样,这个场景也是有一个个环境块图组成的,用来实现周围物体在本体上的反射效果,例如图中的游泳池扶手就是通过这个块图内容进行反射渲染。
块图拆解
在呈现水面之前
首先我们放出泳池水呈现出来之前的图像,由于水面呈现是截然不同的步骤,所以上面的块图中并没有反射出来。
反射贴图:
首先建立平面反射图,分辨率不需要太高,240X120即可,这个步骤类似于之前块图的构成,但这次缓冲区的数据将会包括人物和梯子。下图是直接用的水面视角反射,随后做对称采样就可以获得正确的反射了。
折射贴图:
游泳池画面的一部分被提取出来,利用水面折射光将影响到的范围来创建折射贴图,折射光是太阳光摄入水面后再从水中射出的效果。
基础图
折射效果图
同时要注意画面中的不透明水,水越深画面中颜色表现越蓝,折射效果越弱,随后加入焦散效果(间接照明光线(即光子)从光源发射出来后,先经过一次(或多次)表面反、折射作用,再投射到某个扩散表面上),这样处理后最终获得的折射贴图大小只有初始图缓冲内容的一半大小左右。
结合缓冲区内容:
将上面所产生各个缓冲区的内容结合,就能够得到一个水面多边形图像,通过对图像中的多边形法线进行抖动处理得到了水体的运动效果,但这只适用于小面积的水域,如果是大面积的水体如海洋就不能够单纯使用法线震动来获得运动效果,需要在渲染过程中改变每一帧的顶点位置从而得到海洋的波动。
镜面效果:
镜面采用的渲染方式和水面是同样的方式,只是更加简单,因为镜面背后是不会产生反射效果的,但是由于镜面没有凹凸不平的地方,是完全光滑的平面,因此不能用抖动处理来遮盖低分辨率的贴图,这里为了得到反射效果更好的镜面只能够适当提高分辨率。
由于镜面的反射渲染相当耗时耗力,因此同一场景内远处的镜面都将会采用黑色四边形块图处理,这样将会大大减少渲染时间,也减轻生成后对于显卡的压力。
聚光灯效果:
在第一章我们提到过,在一帧生成的初始阶段是不存在车辆建模的,仅仅是显示了基准的建筑和山丘,那么在这种情况下,如果顺利地显示车辆灯光通过地表而造成的反射效果呢?用下面这张夜景图来分析较为明显。
在之前的图片中(麦克那张)灯光地表反射效果并不明显,因为在那里所有G缓冲区的内容都直接融合了,同时白天的缘故也无法表现明显的聚光灯效果,在夜晚时,每个光源都需要绘制一个单独的网构架,这个构架是不直接在画面中显示的,只是为了在覆盖所有光源的同时进行区域划分,最后用像素着色器来根据网构架内像素的距离来计算物体和光源的距离、法线以及光泽度/高光等属性,来实现动态的光反射计算。
光射效果0%
光射效果50%
光射效果80%
光射效果100%
图像中的网构架图:
R星在这里采用的是延迟管线技术,这是为了减少像素着色器的工作量,相较于传统的前渲染管线来说,延迟管线技术仅仅渲染画面中被光源影响到的像素点,而老式的前渲染管线中,无论是否受光照影响的像素点都会被计算在其中。
R星针对《GTA5》进行的优化工作不得不让人佩服,这也是让许多较为老旧的PC能够运行游戏的重要原因,敬请期待开发课程的最后一课——后期效果处理。
《《GTA5》“细节水平”详解 无愧神作之名!》由河南新闻网-豫都网提供,转载请注明出处:http://game.yuduxx.com/dsyx/297463.html,谢谢合作!
豫都网版权与免责声明
1、未经豫都网(以下简称本网)许可,任何人不得非法使用本网自有版权作品。
2、本网转载其他媒体之稿件,以及由用户发表上传的作品,不代表本网赞同其观点和对其真实性负责。
3、如因作品版权和其它问题可联系本网,本网确认后将在24小时内移除相关争议内容。