1先容
我是Karsten Malmquist,是瑞典Malmö的Ernst&Borg事情室的环境艺术家。我毕业于Malmö的游戏开拓学校The game Assembly,我曾在PortaPlay和Star Vault中《Mortal Online2》担当演习生。
2程序草丛项目
我已经在这个项目上忙活了好几个周末。最初只是为了一种景不雅观效果的考试测验,后来变成了更大的东西了。在这一点上,这更像是一个大项目的第一个“里程碑”,我设法主意式天生一个完全的生物群落。对我来说,这险些就像在空气中绘画一样,但是这个是3D的!
从Megascans 到SpeedTree事情流程
常日我的事情流程先是从浏览Megascans库开始,由于,我想要知道哪些资产是可以利用的。在浏览时,我会划分出哪些资产是可以开箱即用,哪些资产是可以通过再修正,然后变成我项目中的资产。在这种情形下,Megascans库中有很多可以利用的草模型,但是,我看到它们的模型面数比我想想中的还要密集,以是,我决定制作自己的草丛。
我清楚要自己制作草丛后,我开始网络Megascans中不同的草丛图集,匹配SpeedTree制作得当的草丛。我之以是利用SpeedTree,是由于它供应了一种非毁坏性的程序化事情流程,你可以在个中改变险些任何想法,而无需从头重做。我利用Megascans的扫描图集是由于,你可以考试测验许多不同的俊秀图集作为素材,而不必花费大量韶光制作高质量高模型。
在考试测验不同的草丛贴图纹理时,我得出的结论是,单个草丛之间的间距越大,终极效果看起来会越好。当我草丛之间的间隔很紧密的时候,全体纹理随着mipmap开始稠浊在一起,这样就毁坏了,草是由一根根细丝组成的错觉。
为了在SpeedTree中创建草丛,我常日是从创建模型片开始,并将模型顶点放置在贴图剪影顶部,并确保不同级别的LOD能够分配到得当的三角形。我现在不太担心终极的三角形数量,由于,我知道一旦我将草丛导入到Unreal Engine,结合整体效果,再次优化模型。
设置完模型LOD后,我可以开始制作草丛。为此,我首先利用 Zone节点来定义草天生的位置,然后连接一个包含我之前创建的模型片的Leaf Mesh节点。SpeedTree常日的事情逻辑是子节点跟随着父节点天生,以是,这种情形下,叶子的模型片是在Zone节点创建的区域内天生的。
为了从整体上调度草丛,我修正了Zone节点,是为了确定模型片天生的位置,然后修正了Leaf Mesh节点以改变模型片的天生数量和方向。
选择Zone节点后,我又转到“Generation”选项卡,并调度“sweep”设置,以使草丛以圆形天生,以及调度“Number”设置,在更多区域能够随机天生。
选择Leaf Mesh节点,我还调度了 “Generation” 选项卡下的草的数量,然后,向下转到 “Local Orientation” 选项卡,变动了单个卡片的局部朝向。我个人建议考试测验不同的设置,看看它们的哪个效果会更得当。
在编辑草丛的时候,我还会考虑以下几点:
1.全体草丛的大小范围
2.这个草丛有多少模型面数
草丛的大小范围之间是相互影响的,是须要在引擎中天生一些实例地形来验证的。为了提高性能,你大概希望草丛范围大一些,以降落整体的资源开销,但是,你肯定也不肯望它们太大,以至于草丛在一些不平坦的地形,涌现这种类似的情形(悬浮)。
模型片的数量会非常影响性能。由于,大量的模型面数会导致大量Alpha通道的透支,这是非常昂贵的开销。对付这个项目,我创造为了更好的效果,你可以额外的加一些模型面数,把完备透明的部分沿着透明通道裁切掉空缺的部分。如果你在SpeedTree中制作自己的植被,我同时建议您考试测验不同的模型面数,以找到最好效果方案。
下面是我的草丛现在在SpeedTree里面的样子:
当我们在SpeedTree中制作好草丛后,它们就须要导入到虚幻引擎中了。在这一点上,我希望在全体场景中都可以看到草,而不是只有一个区域有。当引擎中有草之后,我也会连续在SpeedTree中做些调度,以便让它们在引擎中看起来更好看。然而,在我回到SpeedTree之前,我想在Unreal Engine中设置一个适当的Shader,这样我在改进草丛时,就不会被草地上那些奇怪的阴影分散把稳力。
3设置草地的Shader
常日将植被从SpeedTree导入Unreal Engine不会立时看起来很好看,由于,你须要一个好的Shader来让自己的植被看起来更好看。当然,在SpeedTree中也有一个选项,可以将现有的Material导出到Unreal中,但我创造,我须要一个比这个功能更全面的办理方案。以是,我没有利用导入默认的Shader,而是自己制作了这些功能:
1. 淡化效果,是基于草丛与相机的间隔。
为了做到这一点,我利用了Per Instance Fade Amount这个节点,这个Shader节点可以设定视口与草之间实际渐弱量。为了利用这个节点,我必须用到一张草地贴图,贴在地面上,我用Landscape Material来做。打开Landscape Grass Type并将“Start Cull Distance”设置为低于“End Cull Distance”的值,将使Per Instance Fade Amount开始输出,在草的Material中,实际每个草的数量,在它们间隔Start Cull Distance更远的时候就会渐弱。有了这些信息,我现在就可以调度草的整体不透明度,让它在远处是淡出的。
2. 增加法线贴图的强度。
这将改进草光照在模型片上的效果,可以给人一种,每个草的光影是指向不同的方向的错觉,而不是看起来像一整排扁平的草。我利用了一个Flatten Normal节点来实现这个效果。这个结果是根据你利用的法线贴图而变革。空想情形下,你希望是草光影的指向是不同方向的,每个草都有不同的波折、扭曲和旋转,就像它们在自然界中做的那样。
3. 次表面散射。
这个可以使草看起来更加真实的最主要的部分之一。我创造,利用albedo作为次表面颜色,对草来说效果很好,我还用顶点颜色弱弱的加暗草丛根部的区域,以便使草丛能够更好地与地表纹理得到稠浊。
4. 颜色变革也很主要。
以摆脱草的颜色过于均匀,过于人为化。我在我的Shader中利用了小规模和大规模两种变革,小规模变革由一个名为Speed Tree Color Variation的节点组成,它为每个草供应随机颜色。大规模的颜色变革,是要在世界空间 XY中平铺一个纹理蒙版,我用它来实现两种颜色之间的变革。
5. 高度变革
是我最喜好的Shader功能之一,由于它可以让草看起来非常蓬松。我通过沿着法线的顶点偏移,来实现这个效果。由于我不想偏移草根,以是,我将顶点颜色刷在靠近地面的顶点上,好实现根部没有偏移效果。为了得到变革,我在世界空间中平铺一个蒙版,来指定那些草丛要偏移。
这里是所有Shader的视觉汇总:
4设置Landscape Material
Landscape Material是这个项目中,将所有东西链接在一起的关键部分,它使我能够从根本上,以高层次的办法,来天生程序植被。Material本身也非常大略,它只有两层,一层叫“Grass”,另一层叫“Grass High”,我可以在Landscape这个环节将它画出来。用这些Landscape通道输出节点,再链接到不同的草节点。Grass层将产生一个较短的草,而Grass High层将产生一个更高的草。此外,我在全体Landscape的天下空间 XY 中利用蒙版平铺在 Grass 图层上天生杂草和花朵簇。末了,为了减少过度绘制,我通过大略地从各自的蒙版中减去高草蒙版来确保杂草、花朵和矮草不会在高草图层上天生。
5优化
我创造在优化任何类型的植被(包括草)时,优化的透支开销是最主要的一个问题。由于我想要一个俊秀的特写渲染,以是,我决定增加模型片,使草丛更密集。例如,如果我的目标想要达到 60 FPS,我就不会这样做。对我来说在这个项目上,我的 PC利用GTX 1060,以 40-45 FPS的速率运行1080p。以是,为了提高性能,我会减少草丛中模型片的密度(幸运的是,这是一个非常大略的办理方法,由于我在SpeedTree中利用了程序事情流),并在虚幻引擎中也能优化相对距更远的草。
6结论
回忆起来,这个项目是一次非常有趣的经历,我从中学到了很多东西。我认为最大的寻衅是弄清楚如何在SpeedTree中制作看起来不错的草丛,并结合在虚幻引擎中去完善这个结果。在我看来,弄清楚要利用什么样的贴图纹理,以及设置一个好的着色器,是两个关键的里程碑。
优化也是一个很大的寻衅,虽然我考试测验了不同的方法,并得出了一些结论,很明显如何制作优化精良的植被,还是有很多东西须要学习的,我希望在连续这个项目的过程中大家也能学到一些东西。
感谢你的阅读,我希望你以为这很有趣。如果你有任何问题,请随时将它们发送给我!