2016-08-05
克雷格·爱德华兹
Gad-腾讯游戏开发者平台
本文将指导您如何在虚幻引擎4创建使用billboard的树叶。billboarded树叶是一个一直对着摄像机,不断重复绘制的四边形树叶面片。我还将讨论为什么这是一个不错的方式(同时也会有一些潜在的问题存在)和性能影响。
虚幻引擎4中的树叶默认情况下,虚幻引擎4里树叶是通过其树叶编辑工具进行编辑的。这个工具允许放置实例化静态网格物体(静态网格用更专业的说法就是不带骨骼的模型)。每个这些叶子资源在地图上被绘制成千上万次,每一个都有属于自己的实例特化参数,如旋转,位置等。
对于相对少的(例如, 10,000以下)的这些资源,当这些资源比较简单(例如,小于100多边形数)通常可以在树叶上表现出阴影和不错的光照效果。只要你设置一个合理的剔除距离,让绘制图形的硬件就不会去尝试一次性将10000个实例全都绘制出来。对于相对数量比较多的树叶(如整个森林)这可能就会有些问题。
让我们通过我自己游戏中的实施方案来说明这个问题。在地图的北面是一大片森林,然后玩家也许走到森林的南部边缘。一切都超出了森林的南部边缘都是在可控制区域之外,但仍然需要渲染,并需要给一个巨大的,无法通行森林面积的视觉效果。假如我们使用的是统一的低多边形版本来呈现整个森林树木,这确实能够解决玩家使用低端硬件所导致性能问题不足的问题。
这个解决方案是创建一个广告牌(billboard)。虚幻引擎4提供一个叫BillboardMateria Componentl的现成组件, 直接可以拿来使用。这非常适合在关卡中一次性或少量放置的静态网格物体,如前面示例中所示那样。但遗憾的是,它们不能被用于自带树叶工具,树叶工具只接受放置静态网格物体,要想使用Billboard组件,它必须包含在一个Actor中使用,而Actor并不是树叶工具支持的类型。 所以我们必须使我们自己的billboard材质。你可以从EPIC的文档的一章节中获取基本的入门操作指南,但这篇指南中主要讨论风格化渲染部分(有太多关于风格化渲染的内容让你很难去找到它)。 我不会在这里重现Epic官方的内容,而我会提供我自己材质的截屏,基于它们,来并讨论在你的游戏中如何去创建以及使用它们。 首先通过导入一些简单的2D纹理来呈现你的billboradsprite。对于这一点,我用真实的树木模型的屏幕截图并让它的背景透明。这使得他们在任何合理的距离,看起来等同于实际的高模。 在这里有稍有不同的地方很重要,在我的游戏我选了同一棵树的四个不同视角,所以在显示时,他们看起来不一样。在创建billboards接下来的步骤就是创建一个材质,将确保你的静态网格顶点都面对镜头。因为这个材质我们将使用在一个由两个三角形构建的简单四边形的静态网格物件上(以后会更多)。
进入虚幻引擎的内容浏览器,右击并选择创建一个新的材质。你需要创建一个混合模式(blend mode)选择遮罩(Masked),阴影模型(Shadow Model) 选择无光(Unlit),选中(Two Sided)双面的材质 你可以将你的节点放入材质图形面板。这些节点连接跟Epic的文档中差不多,而在他们的文档中缺少的的部分在我的实现中(点击图片放大)
关于这个材质有一些重要的地方需要注意。如先前讨论过的材质需要调整其各个顶点去正对于镜头的位置。这需要通过连接节点来完成世界坐标的偏移。 “自定义”节点, 在billborad效果部分中,包含了用于计算四边形旋转信息的一些自定义HLSL代码。内容应如下所示,用“输入”设置为一个值并命名为“IN”和输出类型为“CMOT浮点2”(注意,这个是Epic的版本,变量名会略有不同):
节点附着到PivotPosition以保证四边形是绕其原点旋转,同时变换世界位置其坐标变换有效果。
请注意,此材质并不适合直接使用。这个纹理已经提升为一个材质参数,可以作为材质实例来使用。等你已经保存好材质,你需要内容浏览器中右键点击这个材质,并创建它的多个材质实例,保证每个材质实例贴图,都是你需要去用在billborad上的,这可以防止代码重复并让资源会变得稍微效率些。
现在,我们已经定义好材质,在虚幻引擎中,可以把它放到一个简单的四边形面片上用了,现在它能被用作静态网格使用于树叶工具。billborad所需要模型其实是一个由两个三角形构建而成的的简单四边形。您可以在Blender创造这样的一个资源,也可以用我放在这篇文章中的资源,它可以在下面的链接中下载并在任何项目中自由使用。 squareplane.zip 6.06KB 301下载 当您导入四边形面片,您可能需要调整下四边形面片的旋转和平移信息,让它处于正好正面对着镜头或者在地形上面。如果你不这样做,那么你的材质将遇到侧移,或倒置(或两者都有)的问题,同时材质转换坐标位置始终面朝一个错的的方向!例如,要导入我的四边形面片,你可以使用:
4导入统一比例缩放:调整至适配您的地图,这个四边形面片是相当大的。5 导入Z轴变换信息:调整至适配您的地形。我用的是190单位。
一旦导入四边形面片,将为其起一个易于理解的名字(我将其命名TreeBillboard_Quad_1),并为其分配您的billborad材质。 你现在可以把Mesh放到地图里去了,当你移动相机进行观察,你会发现这个四边形面片一直面朝你。要想更好的效果,你还现在可以拖动该静态网格到叶片工具( foliage tool,),并设置它:
当您添加网格到树叶工具中,你应该确保禁用Align to normal和Random Yaw选项,这两个选项会让网格物体产生旋转,让材质的位置信息受到影响。
要知道你总是应当让网格物体置于可玩区域之外,让玩家不能走到那,让玩家无法试图绕道这些网格物体的后面和它的侧面。如果他们这样做,这个把戏就会被识破,就显得比较难看了。
当你放置这些树他们将开始看起来像一个森林成千上万。你使用的初始纹理的质量直接关系到效果的好坏:
请注意,我在我的游戏使用较低版本的树木模型(我只在opengameart去找寻免费可用的资源),就如前面所说的那样,模型的质量和细节还有你使用的图片分辨率都直接决定了最终输出图像的效果,下图是将带遮罩,打光版本的树与无光版本的树放在一起进行比较的效果:
下面是在把树木放置到我们所期望的分辨率和尺寸得到的图像。下图是包含网格物体(近距离)和billboards版本的混合组成(远距离)的效果。即使用高品质的图像和网格很难去说效果会远远优于现有效果,来把两者区分开来:
由于我们每个树仅绘制两个三角形,此解决方案的性能是在现代硬件远远可以接受的。我能够把足够多的树木,以填充至我的地图,而在我的中档显卡(AMDR9 270X)并没有明显的掉帧效果。尽管我用这种方式创建树木,但同样的方法可以用于草,芦苇,或任何其他小型植物,当玩家接近时,可能不会注意到他们都是差不多的。
billboard同时调整合适的光线和显示阴影是很难得。在我的游戏中,我已经关闭了billboard网格的阴影。因为它们通常距离相机位置很远,玩家应该不会注意到这一点。但如果他们靠得太近,那么一切都是白费功夫了。
值得一说,这一解决方案在性能方面并不完美。在我们的材料使用“自定义”节点,我们屏蔽了虚幻引擎4的进行各种优化技术给我们自己的着色器。这对我来说并不重要,但情况因人而异。如果你不确定,则需要不断调整你的游戏。
作为一种替代这种方法,你可以考虑使用低多边形LOD(Levels ofDetail)链,它可以生成使用类似Simplygon或Meshlab。你也可以你也可以使用虚假叶子。您还可以结合所有三种技术,树木的高模(举个SpeedTree的例子)在LOD链最低等级的LOD使用这种方法来减少其复杂性,当树放在很远的地方阴影和细节是就变得很难,即使它只是一个简单的精灵也看不出。 结论我希望这篇文章在如何渲染大量树叶对你有所帮助,而不至于造成你的GPU性能瓶颈。这篇文章只是众多关于如何渲染树叶的文章之一。如果您有任何疑问,改善或其他反馈,一如既往欢迎你在下面发表评论。
作者简介(S)克雷格·爱德华兹是一个业余爱好者的游戏开发者,他的空闲时间开发游戏没有别的原因,因为他喜欢。
用户slayer 提到:这里我所遇到技术的问题,这些树木看起来像狗屎,这个如果放在1998年还能接受,但是在2015年的现在恐怕无法接受。你将会在遭遇一个大量树叶失去风格化渲染的问题 我建议:
如果当它在一个距离屏幕非常地远,在屏幕中显得非常小时,就没有理由渲染10000多边形树。有可用于每个静态网格自动生成各种的LOD的第三方工具。这会比使用额外的美术所花费得时间要更少。对于最低LOD,你可以简单地避免2个使用纹理的四边形(对于松树这是从侧面观看效果更好)。您也可以用采取比较先进的“精灵冒名顶替”UE4内置工具的”方式,它允许你创建出精灵静态网格物体,并保证他们拥有一个合适的光照。
特别是当他们都在实例化批次中。你不会因为被渲染三角形较少获得巨大的性能变化。但是,你使用不太复杂的着色器会得到一个性能提升。所以,看着色器的复杂性和指令数,在尝试进行任何优化之前,请需要确保运行UE4中的性能诊断工具。(使用Ctrl + Shift +逗号)
如果你细致地管理好场景的LOD,裁剪,着色器复杂度,实例化,并限制点光源。你就可以在UE4构建出不错的树叶效果啦。
近期热文
干货分享丨实现组件-实体-系统
干货来袭丨这篇文章帮你快速了解组件-实体-系统
腾讯游戏开发者平台长按,识别二维码,加关注
经验分享丨项目实践项目孵化丨渠道发行做有梦想的游戏人-GAME AND DREAM-