最强神作!Crysis深度剖析与优化指南(9-17)
第9页:CryEngine 2技术剖析:光影系统 |
光影系统
FAR CRY采用的光影系统
CRYTEK当年在FAR CRY的室外场景中主要采用了shadow map(阴影贴图/映射) + projected shadow(投射阴影)的方式,其中投射阴影用于室外的太阳光源在物体上的投影,而当时他们面临的最大问题就是阴影边缘难看的锯齿问题,不过在那个时代此举实属不得以而为之。对于植被的投影,考虑到性能问题,他们只能采用预计算的阴影贴图,但另一方面又受到显存容量的限制,只能采用分辨率低下的模糊阴影贴图,效果自然大打折扣。不过在高端硬件上,CRYTEK在植被上使用了阴影映射,但在跟预计算的阴影相结合的时候容易出现问题。
FAR CRY中实时阴影贴图与预计算阴影贴图混合使用
对于点光源,FAR CRY采用了与当时DOOM 3相同的蜡版缓冲阴影(容积阴影),因为容积阴影是更加简单高效的解决方案。CPU蒙皮可以在GPU渲染容积阴影的时候协助为物体的阴影轮廓挑边,但是显然对于细节精细、轮廓复杂的物体CPU将面临重大压力,因此容积阴影的缺陷也是明显的:对CPU蒙皮性能的依赖性、对GPU的负载以及额外的内存带宽需求;而更致命的是:缺乏对半透明物体的支持,这对于需要大量棕榈树和花草灌木等半透明叶子投影的热带岛屿场景是绝对无法容忍的,容积阴影技术给CRYTEK判了“死刑”也就不足为奇了。
更加先进的光影系统
此后CRYTEK仍希望容积阴影能够被用于没有多少半透明物体的室内场景,但是生硬的阴影边缘以及多重光源下的性能损失问题最终让CRYTEK不得不寻找更加合适的光影方案。
CRYENGINE 2的光影系统
对于今天的硬件机能,采用单一简洁的投影系统似乎已经时机成熟。容积阴影由于我们上面提到的种种弊端而惨遭淘汰,CRYENGINE 2彻底抛弃了容积阴影的代码。shadow mapping(阴影映射)能够提供高质量的柔和阴影,并且可以根据实际需要自由调节性能跟画质,因此成为CRYENGINE 2光影系统的不二人选。不过,shadow mapping只能涵盖直接光照部分,对于电影画质所必不可少的间接光照部门则需“另请高明”,因此CRYENGINE 2最终为直接光照跟间接光照分别采用了两套专门的解决方案。
Crysis中完全动态的实时阴影效果一流
第10页:光影系统:直接光照 |
直接光照
CRYENGIE 2在处理直接光照部分采用了shadow mapping(即将光照中的物体深度保存在一张2D贴图之中),而容积阴影则被彻底抛弃。虽然CRYTEK早在FAR CRY时代就采用了shadow mapping,但在FAR CRY中只有极少数的物体能够单独投影,对于大部分物体,通常是采用将大量物体的阴影合成为一张阴影贴图的做法。从光源发出的方向同步投射一张简单的阴影贴图可以做到不错的效果,但是在玩家视点附近的阴影贴图分辨率很低,造成难看的块状阴影。FAR CRY还试用了trapezoidal shadow maps(PSM)跟 perspective shadow maps(TSM)两种shadow map。
CRYENGINE 2采用了跟3DMARK 06相同的cascaded shadow maps (CSM),这种shadow map技术通过在玩家视点区域内投射同一分辨率的多张阴影重叠来实现细腻的阴影效果。
为了高效处理静态光照,CRYENGIE 2采用了一种称为“动态遮蔽映射”(dynamic occlusion map)的技术,该技术可以很好地处理静态光照下的投影,但阴影的边缘存在粗糙的锯齿,而且被拉伸的贴图也带来了大量的失真。为了解决阴影贴图边缘的锯齿问题,CRYENGIE 2引进了“百分比渐近过滤”(percentage closer filtering,简称PCF),这样可以一定程度上减弱阴影边缘的锯齿状失真,但是该技术需要许多采样样本,因此性能不高,而且一些较老的ATI显卡无法支持,对于R520之后的ATI显卡则可以通过Fetch4功能来模拟。
从左至右,从上到下,分别为逐级提高百分比渐近采样的效果对比
为了取得更高的效率和画质,CRYTEK又为PCF做了改进,跟一味增加PCF的过滤采样不同,CRYTEK采用了“随机查询每象素”的技巧,这样可以在使用较少的采样样本的情况下获得接近高采样的画质,可以明显减少阴影边缘的颗粒状失真。而通过调节采用的高低,又可以让玩家根据需要自由调节性能跟画质。
对于地形阴影,CRYTEK曾尝试采用从开始角度到结束角度下不同镜头的预计算阴影贴图来模拟动态地形阴影,但最后以失败告终。接着CRYTEK又尝试以增强更新率的occlusion map,但也同样不凑效。CRYTEK的三次尝试是直接让他们普通的shadow map上阵,但结果出来的阴影效果过于统一而显得不够自然,并且边缘过于生硬,而这时候采用“随机查询每象素”的技巧并不凑效,会出现严重的颗粒感。最后CRYTEK尝试使用variance shadow map(方差阴影贴图)并最终取得了成功,其唯一的不足就是在多个投影物体相间重叠的时候会产生问题,但这种情况在地形处理上很少发生。
阴影遮罩贴图
为了避开SM2.0指令数不足的缺陷,CRYENGINE 2将阴影查询从shader中分离开来,此举还可以减少结果shader的合成数量以及将多重阴影结合起来。CRYENGIE 2将计算得出的8 bit阴影贴图查询结果保存于一张平面坐标空间贴图中,这就是所谓的“阴影遮罩”。一张4通道的32bit 贴图就可以提供足够的存储位数并且还可以被作为渲染目标,而且4个通道最多可以合成4个光照基数到一个象素。但是该技术对半透明几何体支持不佳,在处理半透明物体的时候CRYENGINE 2改用在shader中做shadow map查询的方式进行。
阴影遮罩示意图
第11页:光影系统:简洁光照(环境光照) |
间接光照 (环境光照)
随着容积阴影与阴影贴图等先进投影技术的引入,3D游戏中的光影效果在过去几年里有了翻天覆地的改进。尽管如此,几乎当前所有的游戏在光影处理上都存在一个重大缺陷——那就是缺乏对“间接光照”的表现。比如当年以出色的光影效果而闻名的DOOM 3,虽然其光影效果令玩家们印象深刻,但当时仍有很多人发现了该游戏在处理光照效果上存在一个重大缺陷:游戏中的场景处于光源之内的就“灯火通明”,而光源之外就是“漆黑一片”,明亮区域与黑暗区域之间缺乏过渡,完全没有所谓的“半影区域”,这样整个环境看起来就显得相当生硬突兀。实际上这就是由于DOOM 3缺乏对“间接光照”的计算所造成的,在现实环境中,光束的行程并非只局限于从光源出发然后到接收物体处结束,事实上由于自然界中的大部分物体对于光线都存在不同程度的反射率,所以光束在到达接收物体表面之后又有一部分被反射到周围的物体上,这时光线的接收体已经变成了“环境光源”,对其周围的物体跟场景能够产生光照效果。光线的跳转、转移使得“直接光照”以外的区域也能受到一定程度的光照,从而产生一种“半亮半影”的自然过渡区域,而这种效果正是“间接光照”所要表现的。
DOOM 3几乎没有考虑到间接光照的计算,上图灯的上方跟人物周围的场景漆黑一片
事实上不仅仅是DOOM3,后来发布的Riddick、FEAR、SCCT、Quake 4等光影效果出众的游戏同样缺乏对间接光照的支持。只有HL2采用radiosity Normal Maps技术在一定程度上实现了间接光照,但由于HL2中动态光源太少加上蹩脚的投影技术,最终出来的效果并不出众。而跳票王STALKER也秘密内置了对间接光照的支持,虽然效果比HL2要好许多,但由于性能代价太大以及算法还不够完善等问题而被开发商隐藏起来,玩家只能通过控制台来打开。
不出意外的话,Crysis将成为首个对间接光照支持最完整、效果最出色的游戏。对于间接光照的实现,Crytek原本打算采用目前最广受认可的全局光照算法——光子映射来预计算辐射度信息,并采用类似HL2的做法将光线的辐射信息保存在贴图中,crytek甚至为此而准备了一个叫做“3D传输采样器”的工具,可以很方便地运用光子映射算法来计算全局光照数据。不过由于数据存储量以及计算量太大,Crytek最终抛弃了这种方法。小熊在线www.beareyes.com.cn
实时环境关照贴图可以将预先计算的环境光照信息添加到室内环境的表面信息中,
包括当前环境的入射光位置跟颜色都可以被动态添加到用于照明室内场景的光照强度中,
此举可以显著提升实时逐象素光照跟阴影的逼真度。小熊在线www.beareyes.com.cn
Crytek改用另一种更加简单的做法——Real-Time Ambient Map(实时环境光照贴图,最近开始走红的实时间接光照实现算法,STALKER在室外场景就采用了该技术来实现环境光照,下文简称RAM),跟之前的做法相比,采用RAM每象素只需保存一个标量环境遮蔽值,该数值可以通过向所有方向发射光线来计算,而且最终得出的数值还可以反复使用。RAM在着色程序中根据带有遮蔽值的象素、相对于表面的光照位置以及光照颜色和表面法线等信息来计算物体表面对光线的接收程度。值得一提的是,这里计算得出的结果只是一个近似值,精确度不高,但是对于欺骗人眼还是没有问题的。
室外场景里使用了2.5D环境光照技术,该技术可以根据环境物体(比如植物、建筑物)对光源的遮挡情况,
正确计算出物体接收到的光照量
为了提高RAM的效率跟适用范围,Crytek的天才程序员又对其进行了改进,改进后的算法称为“Screen-Space Ambient Occlusion” (屏幕空间环境光遮蔽,下文简称SSAO)。SSAO通过采样象素周围的信息,并进行简单的深度值对比来计算物体身上环境光照无法到达的范围,从而可以表现出物体身上在环境光照下产生的轮廓阴影。由于可以利用我们前面介绍过的“逐象素场景深度计算”技术计算得出的深度值直接参与运算,所以SSAO的效率相比RAM有了显著的提高。小熊在线www.beareyes.com.cn
上面四张图片分别为打开(上)与关闭(下)SSAO的效果对比
第12页:容积雾、次表面散射3S与HDR |
CRYENGINE 2其他先进特性赏析
容积化、多层次以及远视距雾化技术
该技术可以生成笼罩地表的云、雾层,能够自然地模糊远景的可视对比度。此外还可以跟动态光影相结合,减少景物之间的生硬过渡,从而增强大场景的立体自然感。
次表面散射
次表面散射(Sub-Surface Scattering),简称3S,主要用于模拟不完全透明材质内部表现出来的一种真实光影特效。我们知道,当灯光照射到玻璃或清澈的液体表面时,灯光会穿透这些介质,3S效果可用来模拟灯光进入介质内部后发生的散射。最典型的就是一根点亮的蜡烛,仔细观察你会发现在烛光的照耀下,蜡烛靠近火焰的那端显出的半透明效果。CRYSIS中3S被广泛运用于植物叶子、冰面等材质上,而实际上,3S的最大用处之一在于表现光源照射下的人物皮肤,换句话说,要想表现真实的皮肤材质,3S效果必不可少。目前的许多游戏在人物皮肤的渲染上就因为缺乏3S效果而显得塑料化、橡胶化,这也许正是CRYSIS中的人物看起来如此逼真的秘诀所在!
视觉适应和高动态范围光照
视觉适应是用来模拟人类眼睛碰见突然光线变化的适应情况(如从黑暗室内明亮的室外)。而高动态范围光照可以让场景有更大范围的明暗对比度从而使得画面更真实。
第13页:法线贴图、视差遮蔽映射与3DC |
法线贴图、视差映射和3DC
法线贴图技术通过计算高细节度模型的法线信息并将其保存在一张高压缩比(3DC/DC5)的法线贴图之中,然后将这张法线贴图贴用于低细节模型上代替原型的多边形曲面的光照计算,从而等到一个低多边形、高细节的3D模型。CE2还支持更高级视差遮蔽映射(Parallax Occlusion Mapping),该技术曾被ATI用于展示R520 强大PS3.0动态分支性能的TOY SHOP DEMO中,目前出了CRYSIS外,还没有其他游戏支持。Parallax Occlusion Mapping是目前效果最好的Bump Mapping技术,能够给予多边形物体表面的贴图更强的深度感,从而令需要高度凹凸立体的浮雕、砖墙等材质更加真实。
法线贴图的大规模运用虽然让画面一扫过去3D游戏平淡简洁的画面,让整个游戏场景变得凹凸有致、立体感十足,但由于法线贴图存储的信息量比一般的贴图要来得更大,因此对本地显存造成的压力可想而知。显卡的板载显存容量虽然在过去几年里不断翻倍,但仍然满足不了Crysis这样法线贴图数量如此庞大的游戏,为了解决这一问题,Crytek在CRYENGINE 2中全面支持3DC技术。
Parallax Occlusion Mapping的惊人凹凸细节效果
法线贴图其实并不是真正的贴图,所以也不会直接贴到物体的表面,它所起的作用就是记录每个点上的法线的方向。法线的3个三维向量X、Y、Z分别对应三原色红绿蓝的颜色,被值保存在一张贴图中,这样的贴图就是所谓的法线贴图。虽然法线贴图不是真正意义上的贴图,但是传统的贴图压缩技术同样对其行之有效。业界使用做广泛、最传统的DXTC纹理压缩技术具有6:1 的高压缩比,有效提高丁硬件资源的利用率,但却不可避免遭遇图像失真的问题。造成图象失真的根本原因还是纹理压缩技术。因为作为一幅贴图来讲,其中绝大部分信息记录的都是每个点的颜色,如果要对纹理进行压缩的话,势必损失掉一些颜色的信息,这样的损失对于普通的贴图来讲影响是非常小的,因为玩家绝对不会去在意具体的一个点的颜色是否和原来的纹理保持了一致。但是,对于法线贴图就不是这样了,因为法线贴图中每个点的颜色反映的是该点法线的角度,也就是该点的凹凸的信息,如果这些信息丢失了,带来的结果就会糟糕的多——阴影失真是小,甚至可能造成贴图错误,所以传统的DXTC并不适合用来压缩法线贴图。
法线贴图制作流程图
为了解决这一问题,ATI在2004年发布R420显示芯片的时候引入了专门针对法线贴图的3DC技术。跟DXTC不同,3DC将法线贴图分成4×4像素小块压缩,这上面的16个点中分别以红、绿、蓝3个通道的颜色值记录了该点法线的方向,而这个方向恰恰就是该点的凹凸的情况的一个最直观的表达的形式。接下来,3Dc技术将这16个点的颜色值中X项和Y项独立提取出来,分成两个4×4的矩阵,然后再针对每个矩阵进行压缩。通过这种做法,3DC可以以消耗少许shader资源为代价,将每个象素压缩为一个字节,并同时保证足够好的画质。而通常未经过3DC压缩的法线贴图每象素需要占用4个字节的存储空间。在CRYENGINE 2中,纹理的压缩并非向往常那样在loading的时候进行,而是被放在资源编译工具中进行,此举可以减少整个游戏的体积并显著缩短loading时间。而对于不支持3DC的老硬件,Crytek则在loading的过程中将3DC格式的贴图转换为DXTC5格式。
3DC效果对比
第14页:DX10特效一览 |
Crysis曾被玩家们戏称为“DX10救世主”,如此响亮的外号体现出玩家们对Crysis DX10效果的期待程度。下面我们就一起来看一下CryEngine 2将支持哪些DX10特效。
高质量的3D海洋渲染技术
CE2在渲染海面时会根据风力跟洋流的信息即时作出动态调整,因此可以生成非常自然逼真的海面。而“柔和剪裁技术”会在海陆相接的地方根据陆地的高度和海水深度生成自然的海岸线和海床。此外,“焦散模拟技术”还会在海底环境投射效果逼真的动态阴影跟水底光纹。
为了表现出海面波涛汹涌的效果,CE2采用了屏幕空间坐标系镶嵌技术(Screen-Space Tessellation),该技术可以很好地表现出波涛起伏的效果,但这种效果并非基于真实的物理运算,而仅仅是一个程序化的过程,因此效率非常高。小熊在线www.beareyes.com.cn
光束、光轴
CRYENGINE 2支持容积光照技术(立体光照),运用此技术用于渲染光线在通过高度遮蔽的环境时(比如茂密的森林)所形成的光束、光轴,还可以用来渲染光透过海面在海底形成的“神圣光芒”效果。
第15页:DX10特效一览(续) |
运动模糊和景深
运动模糊是用来模拟慢速快门拍摄快速移动的物体或者是快速移动的镜头,以往的运动模糊效果只能做到全屏幕模糊,而运用DX10特性可以对单个物体进行模糊处理。通常的做法是利用几何shader跟踪物体模型边线的运动轨迹,后用渐变的透明度来绘制,以达到运动模糊的那种物体拖着残影的效果。而景深是用于清晰视野焦点而模糊焦点前后的事物。
运动模糊
景深
动态细节的soft LOD地形管理技术
在DX10纹理阵列(texture arrays)、绘制断言(predicated draw)、数据流输出(stream out)、低API overhead以及Instancing等特性的帮助下,CryEngine引入了soft LOD技术,可以大幅减低CPU和内存负担,在让近处的物体和地形有不错的细节程度同时,依然可以有长达八千米的视野距离。
第16页:CryEngie其他技术特性赏析 物理系统 |
Polybump 2
Polybump 2可以单独使用也可以同3DS Max之类工具一起使用。这个工具可以快速提取如法线贴图、置换贴图、非闭区域方向和其他一些属性来创建包含高质量的表面描述的扩展信息。这些扩展信息可以用来绘制类似高模品质的低模,但这个速度将会快得多。这些数据储存在文件里,它可以不必再次计算就用多种不同的方法导出。即使是1000万个多边形这样的高多边形数也可以快速完成。
内置多线程处理物理引擎
该技术可以让场景里的任何物体,比如树木、植被等模型对诸如风力、爆炸冲击、引力、物体之间的碰撞/摩擦等外力作出互动反应,而且无需专用物理加速硬件的支持。
高级绳索物理性模拟系统
绳索物理性模拟技术令柔软的植被、树叶能够对风、雨和角色运动等外力作出自然物理反应。此外,其它诸如吊桥跟外力的互动以及触须之类柔软可弯曲的生物组织的物理性模拟均为高级绳索物理模拟系统的杰作。
互交的可毁坏的环境
动态的改变任何环境物件和形状,可以摧毁建筑、树木和其他物体。
坦克可以撞毁房屋
第17页:CryEngie其他技术特性赏析 角色动画系统 |
角色动画系统
新的角色动画系统可以真实的表现人类或者载具动画。完全内置的角色编辑器可以让制作者在CryENGINE Sandbox2里预览动画效果。此外,超级强大的动画图表允许动画设计师对角色动画的状态设置以及状态转换进行可视化操作。
集成的面部表情编辑器
强大的全新面部表情编辑工具使用音频波形分析技术自动的同步获取声音并将语音的关键点转化为自然而可信的面部表情和唇型。成熟而方便的多重基于摇杆的用户界面允许使用多种方法直观而快速的被定义和被组合。表情和动画一但被创建,就可以在多个不同的人物模型上运用。在系统的配合下,视频跟踪工具可以用普通的摄象机来捕捉演员的动作,这些运动会在编辑器里直接被转化成想要的面部模型,表情和运动能够同步组合成唇型,可以被动画制作人进一部的处理。
个性化角色制作系统
角色制作流水线使用一个丰富的角色特征附件粘贴系统,可以给人物角色粘贴上蒙皮材质、动画信息等数据。此外,还可以将物理信息粘贴到骨架跟人物多边形脸孔上,甚至还允许设计师任意更换角色的身体,比如更换头部、手臂或者上下身。支持硬件加速的人物模型变形系统允许设计师对人物模型网格的变量进行修改。该系统不仅支持手动变形操作而且还可以选用程序化自动生成的样本,以减少内存的占用量。此外还有一个基于着色器的变形系统,可以对泥泞、衣物以及用于皮肤伪装的着色器效果进行变形操作。
参数化骨骼动画系统
通过对用户定义的动画样本进行混合,设计师可以对角色的动画进行互动控制,令该角色能够自然合理地根据实际游戏环境改变动画运动。该系统允许角色可以以不同的速度走动;可以在对通道、路径的方向转变作出合理反应;可以作出自然的上、下山运动;可以通过动态混合各种碰撞反应动画来改变角色的移动方式。
程序化运动变形
CE2采用CCD-IK,分析IK、样本IK等程序化算法以及物理模拟来增强预设定动画。这些程序法处理方法都是让计算机根据这些算法规定的步骤来计算人物的运动方式。CE2采用了一种运动变形技术来保留原本基础运动的方式,使得原本生硬的计算机生成跟真人动作捕捉混合动画看起来更加自然逼真。
高质量动画压缩
CE2采用了关键帧压缩技术,可以根据特定动画所需的保真度动态调节压缩等级。该技术可以在提供高保真度的同时节约至少90%的内存占用量。