「MGS4」中影子是如何生成的?
现世代的游戏MGS4中,与历代的MGS系列相比较,使用了高度动态的阴影生成方法。我们采用了作为阴影生成技法的DEPTHSHADOW的技法(SHADOW MAP技法)的改良型。
DEPTH SHADOW技法是从光源位置把场景的深度信息渲染到贴图上,生成SHADOW MAP,,在渲染最终场景时参照这张SHADOW MAP在像素单位上判断是否被其他物体遮挡(是否形成阴影)来实现阴影效果的。
这个技法作为一种想法的话非常容易理解,但阴影的品质因为非常依赖于SHADOW MAP的分辨率,近年来发现各个开发实例中一般都会使用各种各样的改良型技法。
MGS4中,在生成SHADOW MAP时,使用的方法是把SHADOW MATRIX进行偏移的 独特的技法。
和MGS4中使用的方法不同的是,作为这种类型的改良型技法,还有“Perspective Shadow Maps”(简称PSM)等方法。关于PSM,可以参考本连载的”3DMark05”篇。
高部说到SHADOW MAP的分辨率为1024X2048。在这个分辨率下,即使像PSM那样变形类型的SHADOWMAP,视点和光源的位置关系在超过一定的角度的情况下,有阴影的质量会急剧下降的特性。因此在MGS4中,在接近这个极限位置关系时,加入了会切换成平行投影的普通SHADOW MAP的技法的功能。
MGS4中没有与LOST PLANET一样使用生成多张CASCADESHADOW MAP的扩展方法。因此先天性地可能产生阴影锯齿,MGS4中加入的是采用4临近采样点过滤(PCF)来简单地进行阴影边缘模糊处理的方法
但即使这样,也无法完全避免在超过50M范围阴影的产生锯齿的可能性,因此美工会在场景地图设计时,精心设计复杂的地图结构来避免这些问题的产生。另外,为了降低GPU的负荷,会选择性描画产生阴影的对象,室内场景中也会使用贴图(LIGHTMAP)来实现静态的阴影效果。
投射到场景中的动态生成的阴影使用的是DEPTH SHADOW 方法的改良型
室内的烘培LIGHTMAP的阴影
■ 由简单的程序化方法组合而成的MGS4的特效SHADER
MGS4中,使用了各种SHADER EFFECT。在这里我们介绍一些其中具有代表性的效果。作者认为,MGS4中的SHADER EFFECT是在实时性和维持较高机能的平衡取舍下,以及兼顾动态表现的一个全局的解决方案。
首先,关于血,浸湿,烧焦(以下总称污迹)的表现效果。
游戏中,角色中弹后衣服会被流出血染红,进入水中角色的衣服会被浸湿而变黑,MGS4中都是系统化地来控制这些的EFFECT表现的SHADER。关于血的效果是从PS2的MGS2开始,各种污迹效果是从PS2的MGS3开始有实现,这些污迹的表现在MGS2,MGS3中,都是通过改变顶点色来实现的。在MGS4中也是通过顶点色来实现这些效果的,这个实现方案没有改变过。
污迹贴图的浮现方法会根据污迹程度,在SHADER中让污迹浮现出来,之前也测试过覆盖一层污迹的半透明模型(SHELL POLYGON),但最终没有被采用。
没有在贴图中实现的原因是,各种SHADER中已经使用了大量优先度较高的贴图,在此基础上再增加贴图量的话,在PERFORMANCE方面可能会有问题。没有使用半透明污迹模型的原因是,附加的模型会增加描画负荷,半透明描画采用的是和乘法混合配合不理想的BLEND BUFFER(如前面所述的BLEND BUFFER技法中,由于式样的原因,只支持加算混合和ALPHA混合,污迹的话对于DECAL 贴图要使用乘算混合才能显得比较自然。)
血的污渍慢慢变浓的效果是污渍SHADER的一个功能。虽然是顶点单位的控制,但MGS的角色模型多边形数量多,有足够的分辨率来表现污渍。
也可以说,因为使用污渍的角色模型的顶点数在5000到10000上下,顶点的密度还是相当细的。因此,即使是顶点单位下的EFFECT,看上去在表现精度上完全没有问题。
污渍程度的更新是在5000到10000的多边形模型上进行的,所以处理负荷也随之相当高,关于这点,MGS4使用了SPE,在PS3的情况下,由于有SPE,才能解决这个问题。
实际的实现方法是,在3D模型的顶点色的RGB3个分量上分别写入血,浸湿,烧焦的程度(即污渍的程度)。污渍的程度发生变化时,此时在SPE中因为能更新数据,所以就可以动态地改变污渍的程度。关于浸湿的程度,表现上会随着时间变干,这就是根据经过的时间来降低浸湿程度,更新顶点色来实现的。
从浸湿到慢慢变干的过程。浸湿也是污渍SHADER的一种功能。
在实际描画过程中,插值过的顶点色值被传入PIXELSHADER,这个污渍固有的颜色和在光影处理的结果之后的颜色进行混合。具体是如果是血,血的程度越浓越红,浸湿程度越浓越黑,主人公SNAKE穿着的特殊树脂材料的皮肤着装的话,在浸湿的时候为了表现XX的质感,加入了加强高光强度的调整。
干燥时的皮肤装
浸湿时的皮肤装。高光更强烈。SNAKE专用的特殊“污渍”SHADER的一种功能
西装干燥时的SNAKE
西装浸湿时的SNAKE
另外,虽然使用很多顶点色来实现,而不采用贴图的方法,但光影处理的计算负荷也不小,这里作为最优化处理,在完全没有污渍的状态下,会切换成不使用污渍功能的SHADER。
烧焦前
烧焦后,烧焦表现也是污渍SHADER的功能
在这个污渍SHADER的EFFECT基础上扩展,就能实现“积雪“的效果。游戏中,在冰原场景中在暴风雪中活动的角色,衣服会有积雪的表现效果,实现污渍的SHADER在这里其实就是积雪效果。这个效果,其实也是用非常简单的程序性的构想来实现的。
首先MGS4的雪是在朝向暴风雪风向的模型表面上积累的。这个多边形在朝向风雪方向经过一定时间之后积雪量就会增加,不朝向风雪的身体各处在移动的过程中,随着时间雪会慢慢溶解。还有,加入了身体做弯曲等动作时,被积雪覆盖的身体部位,也会附着积雪的功能。
针对这个3D模型,再做一层壳模型(SHELL MODEL),在该模型贴上结冰贴图,并使用积雪SHADER。形象地解释比较容易理解就是类似单层SHELL的FUR SHADER的效果。
还有,之前的污渍效果的SHADER没有使用的覆盖模型的方案,在积雪SHADER的实现中却采用的原因是,附着的冰的效果是半透明描画,使用的不是乘算混合而是加算混合。这点和BLENDBUFFER的限制不冲突,所以这就是采用该方法的主要理由。
积雪在朝向风雪风向的面积累
雪多=白,雪少=黑的浓淡方法来表示积雪量的结冰贴图
完全结冰时的样子
实际的积雪SHADER的参数控制,是既简单又全局的一种实现。首先,覆盖模型的各顶点的顶点ALPHA上先写入积雪量参数,在渲染时先线性插值,然后传入PIXELSHADER。
先准备好雪多就是白色,雪少就是黑色的感觉来表示积雪量的浓淡的结冰贴图,然后把传入PIXELSHADER的顶点ALPHA值和从这个结冰贴图中取出的TEXEL的值进行比较。因为取得的顶点ALPHA值存储的是积雪量,当取出的结冰TEXEL的值和这个ALPHA值匹配时,实际就会进行描画,不匹配的情况下就不描画。
还有,结冰贴图对应法线贴图,在实际的光影处理的时候,也可以有BUMPMAP的像素光照阴影处理。因此,就可以表现具有细微颗粒感的雪付着的效果。
结冰贴图是预先生成的固定的纹理。这个结冰的扩展方法是根据顶点单位的积雪量来变化,因为由于风向,暴风雪的强度不同会产生不同的变化,从整体来看就感觉不到重复的纹理。
度贴图是预先生成的固定的参数 针对角色的行动有动态积雪的表现这一点上,这个积雪SHADER是通过程序化来表现的,可以说是非常的特别。如果说到程序化积雪SHADER,只有之前CRYTEK的“CRYSIS”有这个效果,在本连载的”CRY ENGINE2”篇中有介绍,那个效果描画符合相当高,由于MGS4的手法达到的效果的高度,可以说是负荷又低,又合理的手法了。