在游戏中通过法线映射模拟体积渲染效果
2020-02-01刘贇
刘贇
(北京极光互动网络技术有限公司 北京市 100028)
在游戏项目中,茂盛的植物一直是一个渲染难点,因为游戏项目需要尽量减少多边形数量,而郁郁葱葱的植物很难用较少的多边形表现出来。以往的方案大多是直接用交叉多边形片加贴图来表现光照效果,但是当光线发生动态变化时,或者当观察视角旋转时,这种方法就会露出破绽。
另一种方法是用多边形片包裹成实体形状,这种方法的问题是难以表现不规则的形状,通常用来创建修剪过的规则植物。
茂盛植物的视觉效果有一些特点,很难直接用多边形和贴图来表现。首先是形状十分复杂,而游戏需要尽量精简多边形数量;其次植物的叶子是半透明的,密集的树叶在光照下看上去很像实体,尤其是背光时能看到整个树冠会有发亮的边缘。这些特殊的视觉效果,用传统的模型加贴图的方法很难较好的表现。
通常3D 多边形的点(Vertex)都有法线属性(Normal),用来记录点的方向,是渲染时实现光照的依据。Vertex Normal 原本是来源于Surface Normal,但我们可以通过反向改变Vertex Normal 来影响Surface Normal 的渲染,进而实现用较少的多边形数量达到复杂的体积渲染效果。
经过实践,将复杂模型(高模)的Vertex Normal 数据,通过一定的算法完全可以映射到低模的顶点上,进而使光照渲染时更接近高模的体积效果,再配合恰当的贴图,可以用少量顶点和多边形渲染出更接近真实复杂植物的光照效果。
这种方法可以用低模实现不规则高模体积光照效果,因此主要适用于游戏项目中对植物的模拟,但同时也适合影视CG 中出现大量植物的场合,可以有效提高渲染效果与渲染效率。
1 传统渲染植物的方法
在以往的游戏项目中,树丛之类比较浓厚茂密的植物通常有两种模型结构,一种是多边形面片中心交叉结构;另一种是多边形面片表面包裹结构。
将这两种模型导入游戏引擎中,可以看到渲染结果如图1所示。
这两种模型结构各有优缺点,也各自有适用范围,在实际游戏项目中经常是根据需求来混用的。
第一种模型结构通常用于自然生长、外形不规则的茂盛植物,如树冠、灌木丛等;第二种则多用于人工修剪过的植物,如方形的植物墙等等。但是无论哪种方式,都有一种机械和不自然的感觉,因为在光照渲染下,模型的面片结构都比较明显。这种不自然的感觉,在光线角度变化、或者观察角度变化时会尤其明显。
图1
图2
突兀的“面片”感,可以通过改变模型法线来改善,但一般要么是直接设置为简单的放射状(球状)法线,使光照效果过于简化,要么则需要手动设置顶点法线,操作比较繁琐。本文将提出一种更简单的自动法线映射方法,既可以实现流程自动化,只需要创建好低模,后续步骤就可以自动完成,又可以使效果更符合低模结构,体现实体植物的层次感。
2 现实中的植物光照效果分析
如果仔细观察真实世界里的光照下的茂盛植物,可以发现有几个比较明显的特点:
首先,在光照下,茂盛的树叶有明显的体积感,尽管体积的形状不规则,但是可以明确的划分出亮面与暗面。其次,由于大部分植物的叶片本身呈半透明状,因此在光照下,整体会呈现比较明显的通透感。如果要在游戏中表现出以上茂盛树叶的光照效果,往往需要更多的多边形数量,而对游戏来说,性能十分重要,原则是使用尽量少的资源表现尽量好的效果,特别是在手机游戏项目中,对多边形数量的要求更加苛刻,这就对游戏美术人员提出了更高的要求。
3 法线映射原理分析
3D 模型的顶点法线(Vertex Normal)是由三个数值组成的一个向量(Vector),是渲染模型时计算光照的基本依据。通常情况下,Vertex Normal 的数值是由Face Normal 的归一化平均值(normalized average)计算而来,这样就可以在渲染的时候正确计算多边形平面的光照。但是,也可以通过其它方法改变Vertex Normal 的值,进而影响多边形表面的光照渲染。
法线映射的基本原理可以分为三部分:第一,创建在游戏中使用的片状交叉多边形(低模);第二,创建用于映射法线的实体多边形(高模);第三,寻找每一个对应低模vertex 的高模vertex 并进行映射。下面分别对每个步骤的原理进行解释。
首先是创建在游戏中使用的片状交叉多边形,俗称“低模”,即是在游戏中实际使用的3D 模型。由于最终需要重新设置顶点法线信息,因此模型的多边形和表面法线(Surface Normal)信息并不是很重要,重要的是顶点数量和位置。这里以游戏中常见的低模植物交叉面方式为例。由于默认的顶点法线信息直接由表面法线计算而来,因此看上去就是多边形本身的光照效果,也就是很多方形片的效果。
4 使用SideFX Houdini实现法线映射
Houdini 是一款由加拿大Side Effects Software Inc.( 简称SESI)公司开发的三维计算机图形软件,广泛用于游戏和影视等3D 视觉效果领域。本节将使用Houdini 为例实现法线映射的过程,但使用其他大部分支持编程扩展的3D 建模软件(例如Blender、Autodesk 3DS Max 或Autodesk Maya 等)也都是可行的,只要使用特定软件所支持的脚本语言即可。
首先创建低模模型。在Houdini 中,先创建一个最基本的四边形(Grid),然后进行简单的复制即可完成。创建低模的步骤在不同的建模软件中有不同的流程,但最后得到的结果应该是基本相同的,这里不详细赘述Houdini 的建模过程。该模型共由168 个四边面组成,顶点数为672。
这里需要进行说明的是,Houdini 中有Point 和Vertex 两种元素,这两种元素目前没有标准对应的中文,经常会被混称为“顶点”,但这两个元素还死活略有不同。由于不同的软件对模型顶点的处理方式也不尽相同,这里不进行详细赘述。在本例中,将使用Point作为映射元素,而不是使用Vertex。
下一步是创建用来映射原始顶点法线信息的高模。在Houdini中可以利用Polygon 和VDB 状态互相转换而实现从低模直接创建形状对应的高模。
VDB 是Volumes with Dynamic Topology 的缩写,是Houdini 中的一种通用体积数据类型,这种类型可以和polygon 实现相互转换。
在Unity 引擎中渲染:
为模型增加UV 之后,就可以导入游戏引擎,加上材质,观察最终效果了。本例以Unity 为例,来对比使用法线映射之前和之后的效果。
在Unity 中创建一个材质,该材质需要使用的shader 至少要支持Alpha 透明和双面显示。本例中还在Shader 中增加了Fresnel 效果,用来模拟树丛的反光和半透明边缘,可以使渲染效果看起来更通透。
将该材质球分别赋予法线映射前和法线映射后的两个树丛模型,渲染效果对比如图2所示。
可以看出,法线映射后的效果非常明显,树丛有了体积感,亮面与暗面的渲染都呈现了实体效果,Fresnel 也可以比较正确的模拟环境反光的颜色。
5 结论
本文介绍了一种在游戏中渲染不规则复杂物体的方法,只要面数极少的低模就可以比较好的渲染出有层次和体积感的复杂效果,适合用于茂盛的植物、灌木等物体的渲染,也可以用于类似复杂结构的其它物体,如成捆的铁丝、树枝或毛线等。如果对体积光照渲染效果要求更高,可以在本文基础上手动调整法线,或者手动创建用于映射顶点法线的模型。在实际项目中,还可以根据需要增加vertex color、normal map 等技术,在不需要增加额外资源开销或只需要很少资源的前提下,进一步提高实际表现效果。这些技术都是游戏美术人员所熟知的,更多依赖审美和经验,所以没有在本文中提及。此方法也可以用于影视离线渲染中大量植被渲染,可以有效提高渲染效果,并节省开发时间和渲染时间。