【译】 【Agni-s Philosophy】使用的图形技术解说(前篇)

发表于2016-03-07
评论1 6.9k浏览

  2012年11月23日和24日举办的SQUARE ENIX的开放会议上,最后会议进行的是新世代游戏引擎【Luminous Studio】的实时技术演示作品【Agni's Philosophy】相关的【实时图形技术解说】部分。

  这个会议,对使用了领先的次世代游戏图形的【Agni's Philosophy】中实时技术做了解说。因为当时次世代游戏机的规格还不明确,这里介绍的技术可能不会全部实用化,但应该可以了解到【次世代游戏图形的目标水准】。因为项目涉及范围很多,分为前中后三篇来介绍。

第二篇:Agni's Philosophy】使用的图形技术解说(中篇)

第三篇:Agni's Philosophy】使用的最新图形技术(后篇)

Agni's Philosophy的基本信息

  负责这个会议的演讲者是SQUARE ENIX技术推进部的Remi Driancourt和Napaporn Metaaphanon氏。他们都是从国外来日本的工程师,实际技术推进部的外国研究人员也有很多。

 


  Remi Driancourt氏(SE技术推进部高级研发工程师)。他以前并不是图形专家,而是机器人和AI的专家,有很强的技术能力,而现在,负责实时图形技术的研究开发工作。

 

Napaporn Metaaphanon氏(SE技术推进部研发工程师)

 

  首先可以作为前提信息了解到的是,Agni's Philosophy,是用把Visual Works部门制作的预渲染版的几何体数据(多边形模型),直接拿来在用在实时渲染中。

  但一部分角色的多边形数量进行了消减,例如主人公Agni,Visual Works部门在建模阶段用了205万多边形(包含毛发一类),实时化时越40万多边形(包含毛发)做了轻量化。

  另外,毛发方面,基本上是Visual Works部用【Maya】进行角色建模时,通过给予NURBS曲线(Non-Uniform Rational B-Splin)的控制点参数,再引入到Luminous Studio的实时渲染引擎中来实时绘制。 

  场景也是,很多场景是1帧1000万多边形进行渲染的,和现世代游戏相比大体上是10倍左右的几何体量。

 

街道场景的远景镜头用

 





  每个场景的顶点数和(因为关闭了相邻顶点多边形之间的共有,所以可以用顶点数来估算多边形数),Texture数据大小的信息。在把【这些应该在次世代机上为目标】作为预测信息的同时,也是要求游戏硬件厂商【向这个程度努力】

 

关于演示的实时化管线解说的是岩﨑 浩氏(SQUARE ENIX技术推进部首席工程师)

 

  在对程序的处理做解说的岩﨑 浩氏(SQUARE ENIX技术推进部首席工程师)的会议上,Agni's Philosophy的运行环境,由CPU是【Core i7-3770K/3.5GHz】,GPU是【GeForce GTX 680】,内存32GB来构成。

  另外,岩﨑氏叙述这样构成硬件的理由是"并不是运行环境必须要这样,而是准备现在最高品质的硬件来允许"。CPU和内存资源,都没有全部用尽的状况。

运行时环境的规格

 

Agni's Philosophy的光照特点

  Agni's Philosophy中,是基于FP16(16bit浮点数)进行光照的HDR(High Dynamic Range)来进行渲染,光照计算并不是在gamma校正后的对数空间,而是在线性空间进行的。而适应显示器显示的Gamma校正,是在HDR渲染后,进行在8bit整数上做Low Dynamic Range化处理的ToneMapping时进行的。

 


Agni's Philosophy渲染管线的简略模式图

 

  关于最近游戏中被非常重视的间接光照,也就是全局照明(Global Illumination:后面简称GI),Agni's Philosophy里因为游戏不是固定相机路线的影像作品,重视最后影像效果,选择预计算来实现的。

 

 

  预计算的GI,用2D和3D版两种方法来实现。所谓的2D版,就是LightMap,不过,本作使用的不是普通的LightMap

  一般的Lightmap,在Texel里保存的值是扩散反射光照结果,而本作的情况,每个Texel里是全方向入射光信息以球谐波(Spherical Harmonics:后面简称SH)形式来保存。球谐波函数简单而言,就是把放射状扩散的全方向的信息分布用基地函数的和来表示,3DCG中把空间周围的状态用不可逆的压缩技法来使用。

 

球谐波函数(SH)LightMap

 

  在本作里,把给予球谐波函数系数值保存在LightMap Texture里,在实际使用LightMap Texture时,从Texture中读取系数到球谐波函数。复原这个Texel的全部方向的光(低精度),来进行光照计算

  光照计算时,不光要计算扩散反射,还有镜面反射。通过这个技术,有LightMap就可以对应视线移动得到GI效果的较淡的高光。另外,在KONAMI的【合金装备4 爱国者之枪 】中,也在顶点单位里实现了相似的技术。

  这种SH LightMap,也是直接贴在3D模型上来使用的。 

  对应的3D版本,并不是直接贴在3D模型上,而是把场景用适当的空间分割,把空间的各个地点【全方位光的信息】用球谐波函数来表现的方式。总之,是在场景里充满的复杂GI效果(环境光),转化为在各个地点假设的全方向光源(但SH化会让表现变的粗糙)的方法。

  分割的空间是以有长宽高三维信息的盒子来填充的形式来管理,每个盒子逐个对应1个Texel。把这个数据用3DTexture来构成。虽然说是“Texture”,实际上是以x,y,z的三维数组数值表的形式。

    

SH Irradiance Volume

 

  运动的3D模型(例如角色模型)在光照时,读出对应自己所在盒子周边的Texture,复原为球谐波函数来插值,再用来做光照计算。总之,3D模型在场景中随意运动,可以得到空间内静态的GI效果。

  这种手法,在Light Probe的GI中经常被使用,与橋本善久氏(CTO,兼技术推进部执行董事)在SEGA时发开的【索尼克世界冒险】(PS3 / Xbox 360 / Wii),以及Valve的【Half Life2】中使用的方法近似。

 

使用SH效果渲染结果的例子

 

模拟环境光的自我遮蔽Ambient Occlusion

  Agni's Philosophy的实时阴影生成,采用的是组合了基于Percentage Closer Filtering(简称PCF)的软阴影处理的Depth Shadow方法。

  背景等固定物体对象的阴影是预先烘培到LightMap,渲染时被适用。背景等固定物体对象进行实时生成阴影(Shadow Map)的处理,再从固定物体对象向动态角色投影,在使用这个阴影的结构。

  背景(固定物体对象)向胴体角色的阴影投射,在近年来3D游戏图形中经常被使用,之前提到的【索尼克世界冒险】和CAPCOM的【生化危机5】等,也进行了同样的实现。

 

Agni's Philosophy的光照和阴影的策略

 

  通过这个方法的实时阴影阴影,主要是物体对象轮廓等级的,鼻孔和眼窝等微小部分使用,因为Shadow Map大小的限制,要做出高精度的阴影很难。还有,使用GI效果(环境光)做自我遮蔽的浅淡软阴影也是一样的。

  这样,近年来使用称为【Ambient Occlusion】的方法来生成阴影的地方变多了。

  Agni's Philosophy中的Ambient Occlusion,是对应场景的光照状况和美术师的感觉,分别使用不同的方法。

 

Ambient Occlusion是一种模拟的GI效果。是基于Pixel自身【环境光被如何遮蔽】的信息来加入阴影的方法。

 

Agni's Philosophy使用了3种Ambient Occlusion技术

 

  一种方法是,从3D模型的表面个各点向所有方向投射射线,求的遮蔽率,再把这个Texture化来使用,一种是用LightMap,在每个Texel里保存遮蔽率。使用Luminous Studio的内制工具来生成遮蔽率Texture。

  这种技术,对于曲面变形的物体对象并不适合,不过还是可以表现出细节的自我遮蔽阴影。因此,角色面部的鼻孔和眼窝,可以表现出静态高精度的自我遮蔽表现

   

烘培到Texture的Ambient Occlusion

 

  第二种,是今年来3D游戏图形常用的方法,在屏幕坐标系生成自己遮蔽阴影的【Screen Space Ambient Occlusion】(SSAO)。因为是对渲染结果用后处理来加入的自遮蔽表现,可以对应动态的移动物体和变形物体,原理上无法达到太高的精度,所以,Driancourt氏在本作中只把SSAO做辅助使用。

 

Screen Space Ambient Occlusion的效果

 

  第三种,是解析的基于物体的自遮蔽生成(Object Based Analytical Ambient Occlusion)。这种技术没有做详细说明,是把构成物体对象的每个多边形作为遮蔽要素,应该是分析多边形之间的遮蔽来求出遮蔽率的方法。 

  这个的相似方法在NVIDIA的GeForce 6000系列提供的技术演示【Timbury】中使用,详细可以参考这里。

  http://http.developer.nvidia.com/GPUGems2/gpugems2_chapter14.html

  Driancourt氏认为这个技术的负荷太高,很多场景都没有使用。

 

Object Based Analytical Ambient Occlusion=OFF

 

Object Based Analytical Ambient Occlusion=ON

 

面部的特殊Ambient Occlusion处理

 

  实际的光照时,使用这些遮蔽率值来附加阴影(遮蔽率高阴影就暗),鼻孔中和头发的遮蔽等,并不是全黑色,而是带着一些红色来进行调整。

 

只附加黑色阴影的Ambient Occlusion

 

增加了颜色的Ambient Occlusion 1

 

增加了颜色的Ambient Occlusion 2

 




面部的Ambient Occlusion打开/关闭

Agni's Philosophy的人物皮肤表现的秘密(1) 屏幕坐标系的表面散射技术

  关于3D游戏图形,长时间【想做而无法实现】的一个就是真正的人类皮肤的表现。

  Agni's Philosophy中要表示【次世代中想到达这种程度】的意志,采用了高品质的人类皮肤的表现手法。

  人类皮肤,是重叠了多层半透明皮肤的透明度低的半透明材质,实验确认的,入射光中,大约6%被表皮的脂质反射,约94%渗透到皮下散射,再从表皮里射出(人种和年龄的差别每个人也不同)。这种皮下散射(Subskin Scattering)现象,在CG的世界一般作为次级表面散射(Subsurface Scattering)来处理。

  认真的计算这些非常的难 ,一个基准的方法是在电影【Martix(黑客帝国)】的反面角色Agent Smith大量产生的场景中使用。之后,NVIDIA公开了面向GeForce 8800 Ultra的的技术演示中实时实现的【Human Head Demo】。

 

    

 

  这个方法,是把对角色面部(皮肤)的光照结果,在Texture坐标系展开,进行模糊后在Texture Mapping的大胆的方法。还有,这种【模糊处理】,是把在皮肤表面直角射入白色光,计算从皮肤再次出射的颜色分布( Reflectance Diffusion Profile)。RDP在感觉上来解释,就是越接近入射点约接近白色,越远约变的红黑色的不均匀颜色分布的特性。

 



  NVIDIA的Human Head Demo中使用了【把人类皮肤的光照结果在Texture坐标系用模糊来模拟次级表面散射的结果】的方法细节。 

  这种方法,用高端GPU表现一个角色的皮肤表现,处理符合也相当紧张

  所以,在Agni's Philosophy中采用的是这种技术省略化的方法,也就是Activision Blizzard的Jorge Jimenez氏设计的方法。

  Jimenez氏的方法,在概念上与前述的扩散反射的光照解决用RDP模糊的并没有改变,而模糊不再是Texture坐标系,而是屏幕坐标系(Screen Space)这点上有所差别。这种特征的方法,Jimenez氏给予了【Screen-Space Subsurface Scattering】(SSSS)的名称。

  SSSS,是在人类角色渲染的每一帧,选择皮肤部分根据RDP进行模糊,实现近似的次级表面散射。这个模糊是在屏幕坐标系用后处理来实施。

  现在的Screen-Space Subsurface Scattering,改良后改称为Separable Subsurface Scattering,因为Screen-Space Subsurface Scattering知名度高,本文中就这样使用了。

 

  SSSS的算法概念图,用屏幕空间后处理来实行模拟的次级表面散射处理主要的模糊处理部分,画面内多少人,都可以在一定负荷下实现近似的次级表面散射效果。 

  这种后处理的方法,1帧内1个角色还是100个角色,都是同一处理时间内完成。但是视点距离人体的远近,模糊的幅度也变得有差异。具体来说就是需要近处角色的模糊大,远处角色模糊小。

  对于这个,通过【参考深度缓冲来判断模糊对象的远近以决定模糊半径】的方式来对应。就向后处理中常用的进行焦点表现的景深效果,也是对应焦点位置的深度值来决定模糊半径(强度),这两种是一样的想法。

 

Agni's Philosophy的模拟次级表面散射处理的管线

 

  Jimenez氏论文中的SSSS,用不同的模糊半径进行多次模糊再合成的方法,Driancourt氏提到,在Agni's Philosophy中实现,是只进行了1次模糊处理的。

  还有,关于模糊处理自身,并没有使用高斯模糊,而Poisson Disk Sampling的方法,对应模糊对象的远近,进行模糊半径的调整。

 

Agni's Philosophy中,模拟次级表面散射使用的模糊处理是Poisson Disk Sampling的方法

 

通过Poisson Disk Sampling方法的使用,对应皮肤在画面整体的占有面积,实现了可调整的功能。

 

关闭次级表面散射

 

打开次级表面散射

 

关闭次级表面散射

 

打开次级表面散射

 

  这种屏幕坐标系的模拟次级表面散射技术,不光是人的皮肤,怪物的表皮表现,以及本作故事中的关键道具,水晶的光照上也使用了

 

次级表面散射关闭

 

次级表面散射打开

 

次级表面散射关闭

 

次级表面散射打开

 

次级表面散射关闭

 

次级表面散射打开

 

Agni's Philosophy的人物皮肤表现的秘密(2) 【湿润的皮肤】和【干燥的皮肤】

  人类皮肤很麻烦的是之前描述的表面下散射的要素,但是还有约6%的镜面反射要素也不能无视。

  Agni's Philosophy的镜面反射光照,是在实时3D图形基础的算数方式,不是Blinn  Shading或Phong Shading,而是基于Csaba Kelemen和Laszlo Szirmay-Kalos氏在2011年发表的【A Microfacet Based Coupled Specular-Matte BRDF Model with Importance Sampling】论文中的【KS BRDF方法】。

  KS是Kelemen和Szirmay-Kalos的第一个字母。BRDF是【Bidirectional Reflectance Distribution Function】的缩写,翻译过来就是【双方向反射率分布函数】。

  一句话来数BRDF的话就是,【把光学现象考虑的光反射做一般化的公式】。BRDF实现的方法是因为用一个方程式来表现困难,使用测量器材测量对象材质做成数据表,在渲染时参考数据表做阴影计算就很好理解了。

 

镜面反射(Specular)的计算使用的是KS BRDF方法

 

  KS BRDF,对应表现表面有细节凹凸材质表现采用了Beckmann Distribution。实现为了减低计算负荷,这个Beckmann Distribution是预先计算并保存在Texture数据中,关于KS BRDF的更详细的信息可以参考论文。

    

Phong Shading的镜面反射效果,高光唐突亮度也不明显

 

KS BRDF的镜面反射效果,高光变得流畅,最高亮度也会清晰。

 

  还有,镜面反射(Specular)结果的使用方法有两个版本,具体的,准备了通常的【干燥皮肤】表现使用的,和汗和泪等【湿润皮肤】表现使用用。

  【干燥的皮肤】,是对通过KD BRDF光照的镜面反射,把类似GI效果的表现镜面反射和表现反射用的Cubemap Texture的影响混合。

  另外【湿润的皮肤】是,控制反射表现用的Cumbemap Texture的影响,湿度越高,周围清静的反射也变得更容易,这样理解。

    

对两种皮肤使用镜面反射效果

 

只有【干燥皮肤】的表现

 

有【湿润皮肤表现】

 

没有CubeMap Texture的表现

 

有CubeMap Texture的表现

 

Agni's Philosophy的人物皮肤表现的秘密(3)透过光表现

  耳廓和鼻头,手指等凸起部分,根据光的强度,次级表面散射外,光的透过也会发生。不光是把手掌朝向太阳,逆光状态下前述部位可以看到过红色迟钝的光现象的 人也很多。

  这种现象,用前面解说的屏幕坐标系的模拟次级表面散射并不能再现。原因的话,屏幕坐标系的模拟次级表面散射,只是对应表面入射光的着色技术,并没有考虑逆光的问题, 

  因此,Agni's Philosophy是使用了计算出对象物的近似厚度,在根据厚度信息比率增加红色的方式来加入光照效果的方法。

  这个厚度信息,把光源到物体背面的距离(深度值),与视点到对象物表面的距离(深度值),分别渲染到Texture,在用对应的Texel值的差的绝对值计算出近似物的厚度。然后,这个厚度越小,过透光强度的影像越大,越厚影响越小(不怎么透过光),把这个值的指标在1维Texture来采样,应用到光照中。

    

Agni's Philosophy中,耳朵等厚度小的部位,使用厚度信息来表现透过光。

 

  另外,这个技术与在面向GeForce 7000系列的技术演示【Luna】中登场的巨大手的怪物【Oracle】的过透光表现中使用的技术是一样的。

  http://www.nvidia.com/page/geforce7_demos.html 

  Driancourt氏表示,“对应角色模型事先准备厚度Texture的方法也讨论过,但判断出这种方法对动态场景的对应度低”

  例如,这次采用的方法,耳朵后面有遮蔽物时,就要考虑这个影子来做透过光表现(看到遮蔽物的影子)。另外,保存厚度Texture的方法,因为透过光表现的计算只有耳朵的厚度信息,无法对应遮蔽物的影响。

 

没有透过光影响

 

有透光过表现

 

  顺便一说,利用这种厚度信息Texture的方法,在Electoronic Arts的【Battle Field 3】中也有使用。厚度信息的Texture必须要预先计算,因为运行时的负荷轻,在游戏图形上是很实用的方法。

  Agni's Philosophy是影像作品,因为要追求细小的表现,采用了Luna里使用的方法。

    






战地3中,用厚度信息Texture来做次级表面散射的技术

 

前面所述的皮肤表现结构的确认影像

Agni's Philosophyでの皮膚表現のデモ.mp4


感到有精神的【视线印象】的实现方式

  人在看其他人时,常常会注视对方的眼睛,那么【眼睛的真实度】就和【人类表现的真实度】直接挂钩了。

  进行面部表现时,即使人的皮肤变真实了,面部表情也丰富了,大萌无法感觉到最终决定CG角色表现效果的【眼力】(视线的印象)。并没有给予CG角色表现上【气魄】和【精神】的眼球表现。 

  因为Agni's Philosophy是作为电影级的影像作品,和一般游戏比有更多的角色面部特写。所以在Agni's Philosophy中,也增加了眼球的表现力。

  虽然也使用了一部分模拟的方法,Agni's Philosophy中,是基于解剖系来做眼睛渲染的  

Agni's Philosophy实现的眼球Shader的Demo影像 (眼球の光学表現.mp4)


 

人类的眼睛构造 


  人类的眼球形状并不是完全的球体,在眼角膜部分是突起的形状,表面被眼泪所湿润。还有【黑眼珠】中的环绕的虹膜是在内侧,这个【黑眼珠】的中心部分是瞳孔内的黑暗的部分,而这个黑暗部分实际是在眼球内部的。

  为了再现这种复杂构造的眼睛,Agni's Philosophy中设计了再现这种特别反射的【眼球shader】,这个眼球Shader的设计有几个要留意的点。 

  第一个是,凸起的角膜部分的表现。通过使用一般法线贴图,用BumpMapping(NormalMaping)来实现

  第二个是,从角膜内次看到凹陷的虹膜表现。这个凹陷的虹膜阴影也用NormalMap来实现,角膜的BumpMapping生成的模拟凸阴影的表现,也可以用在模拟凹阴影的表现嘛。虹膜部分,也是沿用角膜的Mapping数据,反转来使用。

 

凹陷内部看到的虹膜的阴影,也是利用法线贴图的凹Mapping来处理实现的

 

反射的表现,用Cubemap做出外部信息,在处理Normal Map来适用环境Mapping,反射可以看到角膜部分的凸状。

 

  第三个是高光,入射到眼球的光,在眼球表面通过镜面反射生成高光(一次高光),另外,没有镜面发射的光在角膜上折射射入,通过前面在水晶体部分反射,这个反射光反向达到眼球表面,再一次生成高光(二次高光)。

  这个表现,是进行和前面所说的凸状的法线Mapping和凹状的法线Mapping,两种镜面反射的光照计算来想实现的。

 

角膜上的高光和虹膜上的高光,进行凸状的法线Mapping和凹状的法线Mapping的镜面反射光照。

 

最终图像

 

  第四个是折射,从视点飞出的射线,因为在突出的角膜上折射,看到的是扭曲的虹膜和瞳孔

  这个,是在渲染眼球的像素时,通过偏移来对虹膜和瞳孔的Texture采样来实现的,结果就是看到了虹膜和瞳孔的偏离效果。

 

关于眼球折射表现的概念图

 

关闭折射表现

 

关闭折射表现

 

打开折射表现和所有要素(最终画面)

 

面部整体的最终画面。

 

  第五个,是眼球的眼白部分使用模拟的次级表面散射。因为眼球的白色部门和皮肤一样的,透明度是较低的半透明材质构成,在Agni's Philosophy中,对眼球使用了前面接触的屏幕坐标系的次级表面散射处理。

 

对眼球使用次级表面散射处理。

 

  虽然相对面部的总面积,眼球的比例只是很小一部分,但实际完成的人类角色在特写的时候,靠近用这个眼球shader制作的精神饱满而有魄力的眼睛时,还是会感到这个效果的。 

确认前面说明的皮肤表现,眼球shader的演示影像。

Agni's Philosophyの眼球表現などのデモ.mp4


 

  前篇就到此为止,中篇会对【头发】,【胡须】,【衣服】,后篇会对【反走样】【折射】【Metaball粒子】【Instance是实现的萤火虫渲染】等要素做解说。

 


原作者:西川善司

原链接:http://www.4gamer.net/games/032/G003263/20121201006/


如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引