zoukankan      html  css  js  c++  java
  • [转载翻译][重新整理]西川善司的”METAL GEAR SOLID 4”图形讲座(4)

    http://www.huanimei.com/logs/94179566.html

    MGS4」中脸部SHADER的秘密 
    并非基于物理,而是就是用开发人员自主开发的SHADER来再现真实的肌肤质感。

    “MGS4”中出现了很多很有魅力的角色。主要是以有CG质感的干净漂亮的角色为形象中心,但在面部表现上MGS4有一种独特的质感。这个表现并不是单一的技术,而是结合了多种独特的SHADER来实现效果的。首先,就是最基础的被称为“RIM LIGHTING”的技术。

    順光時は「ソフトライト処理」と命名された陰影が柔らかく出るシェーディングを行なう。首下の陰影の違いに注目

    RIM LIGHT是指在角色逆光的情况下,面部的侧面部分(轮廓部分)会有光溢出的高光现象。光会渗透入物体的内部,再从内部射出,就会有人皮肤的那种透明度很低的半透明材质的皮肤现象,为了正确表现该物理效果,我们必须模拟3S效果(次表面散射效果)。但是,次表面散射的物理效果不适合在游戏中使用,在3D游戏图形学中,我们会考虑使用多种模拟手法来达到该效果。即本连载中“VIRTUAL FIGHTER5”篇中也提到的,SEGA介绍了他们使用的独特的模拟手法。MGS4中的RIM LIGHTING的处理,其特点就是在逆光和顺光时会切换处理方法。

    顺光时使用的是称之为SOFT LIGHT处理的阴影柔滑的SHADER。具体来说,会针对非常暗的阴影面,对基本的DECAL TEXTURE的颜色的影响进行加强来处理表现效果。对于皮肤而言,渗透入皮肤下的光会在皮肤内部散射(皮下散射),进行简单的照亮,使皮肤的阴影变得模糊,明亮。

    逆光时,会在脸部的轮廓部分付加产生高光的表现效果。这也是在物理的阴影计算结果上加强基础DECAL TEXTURE的颜色影响的处理来表现高光。这也能再现皮下散射光的模拟效果。还有,该RIM LIGHTING在MGS4中除了可以使用在人皮肤上,也适合使用在布等半透明材质上。

    即,该RIM LIGHTING的处理中,逆光和顺光的判断,不是根据和该场景的代表光源的朝向,而是根据之前所说的半球照明的LIGHT的基准轴来进行的。这就是通过美工对半球照明的环境光进行详细的设定而得到的RIMLIGHT,才能使角色们看上去富有戏剧性效果的主要的原因吧。

    逆光時は、その輪郭部分にハイライトがこちらにしみ出してくるような表現を付加。ハイライトの出方に注目

    胡须,皱纹等细节的表现是采用法线贴图等常规的手法来表现。但是,在具体处理上,会根据面部表情动画改变法线贴图的皱纹的出现方法,在进入阴影中后,法线贴图的细节表现会消失等出现阴影的方法会做出调整,可以说工夫做到非常细致

    关于使角色有存在感的眼球的表现,加入了细致的调整,黑珠子部分的水晶体的突出会采用法线贴图来表现。此外,在打光时为了没有那种死了的人眼球的感觉,通常会加入特别的SHADER功能,使对着照相机在瞳孔处描画高光

    头发还是使用PS2时代就开始使用的传统的手法,通过植入头发束的表现类型来实现。至于头发的光照,则使用了特殊的SHADER,使用各向异性的阴影和高光来表现,效果很奇特。

    MGS4中的皮肤,面部表现都并不是完全基于物理基础的真实性,而是很好地应用了现有的技术,来制作出有说服力的画面表现效果。这是MGS4的一个特点,而且非常令人感兴趣。

    通常在瞳孔上朝向CAMERA的方向会有高光的眼球SHADER

    各向异性的阴影和有高光效果的头发SHADER

    皮肤SHADER在球上更容易看到效果的动画

     


     MGS4」中的水面表现 
    在特殊的CAMERA坐标系下实现动态的法线贴图的效果。

    近代的3D游戏图形中水面表现效果也是一大看点。MGS4中,没有一个主要表现水面效果的场景,但在游戏中有这样的关卡,玩家会走过水深较浅的小溪,在这些地方会应用到动态的水面表现效果。

    MGS4最初尝试的实现方法是对水面模型在顶点基础上进行波动模拟,但在MGS4中没有制作大面积水波的必要性,所以没有采用波动模拟,而是采用了基于光影处理为基准的模拟手法。

    朝向水面射击,水柱溅出,波纹扩大

    在水面上走,经过波纹会扩大

    基本的实现方针是,做出动态的表现细微凹凸的BUMPMAP,对凹凸进行阴影处理, 也就是BUMP 动画技法。实现手法是先必须生成动态的法线贴图,而在此以前就必须先生成作为生成素材的动态的高度图HEIGHT MAP(表示凹凸强弱的贴图)。

    关于如何生成高度图,是对于用于渲染水面的贴图,在产生波纹的地方把预先生成好波纹的高度图重复描画多次。这样,就能实现角色在水面上行动而交互地产生波纹的表现效果了。

    在开发阶段中,预先生成好的作为效果表现的最小单位的单个波纹高度图有XX波形状的,有同心圆形状的,等多个不同变化的版本,保证水面上的波纹不会呈现规则性的形状。还有扩大的波纹的变现,是通过一边扩大单个波纹的高度图,一边进行描画来实现。为了表现随着波纹的扩大波纹强度会衰减的效果,稍微加入了让高度量随着单位波纹的扩大逐渐衰减的处理。

    单个表现单位的波纹高度图的例子

    波纹的高度图在CAMERA坐标下描画

    而且特别的是,用于这个水面渲染的贴图是以玩家视角为基础(CAMERA坐标系),用透视投影的形式来生成的。如果使用这种手法的话,其优点在于在画面之外的水面就不会进行渲染,水面表现的负荷就能降到最低限,而且更是保证了波纹生成的负荷。但是,根据看到水面的视线角度,波纹描画时会产生变形,品质受到了一定的影响。但是,本来波纹自身就是看起来不是很清楚的效果,基本不用担心变形的问题。

    用于水面渲染的贴图大小是256X256,比较精简的效果,所以我们会把贴图扩大来用于水面的描画。因为我们使用BILINEAR FILTER,在扩大贴图的时候,高度信息就能很圆滑地进行模糊插值,所以即使是低分辨率的贴图,效果看上去也不会很难看。MGS4中使用的高度图精度是普通的8888整数型32BIT BUFFER,关于这一点,高部说到,高度图如果能活用16BIT FLOAT型BUFFER的话,因该比较容易保持较好的精度。

    在完成了高度图之后就是需将其变换成法线贴图,在PIXELSHADER中实现使用了菲涅尔反射的环境BUMP 贴图了。还有,因为映射入水面的场景是使用预先生成的固定的环境贴图,所以在水面上是不会描画动态的镜像场景的。水面的镜像描画表现在MGS3中也是预先进行的,但在MGS4中系统不会生成动态的环境贴图,原因就是现在的式样考虑到要降低描画的负荷。

    上面的CAMERA坐标系下描画出的波纹高度图转换成法线贴图

    最终的渲染结果

    由于采用的方式是在CAMERA坐标系下生成 的,并且只是重复描画预先生成的波纹,冲击到岸边的水波的折返效果,水波和水波之间的干涉(水波的减弱和增加)等现象就无法实现,在游戏玩家身边的水面交互,仅仅是个小效果,完全不用担心那些问题。针对动作游戏来实现水面效果的这些判断就是比较妥当的。


     再现六角形形状的景深模拟

    从PS2时代开始,作为影片化的一种表现,采用了将焦距内和焦距外的场景分开描画来表现出印象化的景深效果的方法,但进入可编程SHADER的图形次世代后,每个开发公司都在尝试着实现像用真实的CAMERA来进行摄影的那样模拟实现景深的效果。

    在MGS4中的方法是非常简单的,假设有一个虚拟的CAMERA模型,对于CAMERA捕捉到的场景,先设置焦距和快门开口大小,然后根据焦距前后的距离计算出模糊效果的大小。

    聚焦到铁柱附近的情况

    焦距拉远的情况

    焦距拉近的情况 

    光圈变小,在大范围下聚焦,模糊的范围就变小

    光圈变大,大范围模糊,模糊的范围变大。

    基本上最典型的实现方法是,离焦距越远模糊的半径就越大。在MGS4中使用的是六角形的光圈形状,这个光圈形状离焦点越偏,光圈形状模糊得越厉害。

    深度计算的模拟。MGS4中使用的分散半径的计算公式

    MGS4中设定光圈的形状为六角形,并使用19个采样数的式样。因此消耗很大

    我们采用19个采样点作为Kernel Filter来模糊CAMERA的光圈的六角形 。采用19个采样点的式样虽然有些费,但当模糊半径变大时即使是19个采样点,还是会出现破碎的感觉,所以为了在使用19个采样点时效果显得自然,要加入控制模糊半径的大小的逻辑功能。

    对于使用HDR ENCODING的场景的模拟景深处理,对于每个像素都进行19个点的DECODE处理我们认为消耗过重,所以不进行DECODE,无视物理数据上的正确性来进行19点采样的模拟景深效果。因此,高亮度的六角形形状的模糊效果就无法实现。这里也是考虑到要重视游戏的实时性做出的取舍。 
    高部说到,随着其他方面描画负荷的增加,采用19个采样点的深度表现会造成很麻烦的情况,所以我们使用的是缩小BUFFER,并减少到使用7个采样点的简易版。另外在一部分场景中,设计者希望有种表现效果,是不需要基于模拟的深度表现的,也就是去除焦点,所有的地方相同处理的那种表现。因此我们也实现了只有模糊的那种超简单版景深效果。我们根据描画负荷以及画面表现方面的需要,会切换使用某种版本。

    在开发中能看到HDR模糊的截图

    最终版看不到HDR模糊的截图 

  • 相关阅读:
    Docker常用命令操作记录
    第一个netty程序--时间服务
    zookeeper+dubbo配置
    通过IRBuilder新建LLVM IR
    TVM结构介绍
    /lib64/libc.so.6 错误导致的系统崩溃
    php 间歇性报 Segmentation fault
    Dell服务器安装OMSA管理工具
    【Selenium学习笔记】网页截图实践
    局域网内网机器上网实操
  • 原文地址:https://www.cnblogs.com/oiramario/p/2061594.html
Copyright © 2011-2022 走看看