3D 环境艺术家Karsten Malmquist 向您展示如何创建实时程序草地,解释如何使用Megascans 扫描库和SpeedTree 来创建草地,并解释如何设置草地着色器。
1
介绍
我叫卡斯滕·马尔姆奎斯特(Karsten Malmquist),是瑞典马尔默恩斯特·博格工作室的一名环境艺术家。我毕业于马尔默游戏开发学校The game Assembly,并在PortaPlay 和Star Vault 《Mortal Online2》 实习。
2
程序玻璃项目
周末我已经在这个项目上工作了好几天了。最初的景观效应实验后来变得更大。就目前而言,这更像是一个更大项目的第一个“里程碑”,将逐步生成完整的生物群落。对我来说,这就像在户外绘画,但是是3D 的。
Megascan 到SpeedTree 工作流程
通常,我的工作流程首先浏览Megascans 库以查看可用的资产。当您浏览时,对哪些资产可以立即使用以及哪些可以修改并转换为项目资产进行分类。在本例中,Megascans 库中有许多可用的草模型,但我决定创建自己的草模型,因为我发现它比预期更密集。
在决定要制作自己的草后,我在Megascans上收集了各种草图集,并开始将它们与SpeedTree匹配以制作合适的草。我使用SpeedTree 是因为它提供了非破坏性的编程工作流程,使我能够改变几乎任何想法,而无需重新开始。我使用Megascans 的扫描图集,因为它可以让我尝试不同的精美图集,而无需花费大量时间创建高品质、高质量的模型。
在尝试不同的草地贴图纹理时,我得出的结论是,各个草地贴图之间的间距越宽,最终效果就越好。当草丛之间的距离变得非常近时,整个纹理开始与mipmap 混合,从而破坏了草是由细丝组成的错觉。
在SpeedTree 中创建草通常涉及创建模型零件、将模型顶点放置在纹理轮廓的顶部,并确保将各个级别的LOD 分配给适当的三角形。我现在不太担心三角形的最终数量。因为一旦我将草导入到虚幻引擎中,我知道在获得整体效果后要重新优化模型。
设置好模型LOD 后,您就可以开始创建草地了。为此,我首先使用区域节点来定义草的生成位置,然后连接包含我之前创建的模型部件的叶网格节点。 SpeedTree 的正常操作逻辑是在父节点之后生成子节点,因此在这种情况下,叶模型部分在由Zone 节点创建的区域内生成。
为了调整整体草,我更改了“区域”节点以确定生成模型块的位置,然后更改“叶网格”节点以更改模型块的数量和方向。
选择区域节点后,转到“生成”选项卡并调整“扫描”设置,使草以圆形图案生成,并调整“数量”设置,使其在更多区域中随机生成。
选择“叶子网格”节点后,我还在“生成”选项卡中调整了草的数量,并转到“本地方向”选项卡来更改各个卡的本地方向。就我个人而言,我建议尝试不同的设置,看看哪一种效果更好。
编辑草时,还应考虑以下事项:
1. 整个草坪尺寸范围
2. 这片草地有多少个模型面?
草的大小范围是相互作用的,应该通过在引擎中生成一些实例地形来验证。为了提高性能,您可能希望增大草丛范围以减少总体资源开销,但在某些环境中,草丛只能变得很大,以至于在类似情况下出现(浮动)。地形不平坦。
模型的数量对性能有显着影响。这是因为大量的模型面会导致大量的alpha 通道过度绘制,这是非常昂贵的。对于这个项目,我发现为了获得更好的结果,我可以向模型添加一些额外的面,并从完全透明的部分沿透明通道剪切空白部分。如果您在SpeedTree 中创建自己的植被,我们建议您尝试不同的模型面以找到最有效的一个。
我的SpeedTree 草坪看起来像这样。
在SpeedTree 中创建草后,您需要将其导入到虚幻引擎中。此时,我们希望草在整个场景中都可见,而不仅仅是在一个区域。一旦草进入引擎,我将继续在SpeedTree 中进行一些调整,使其在引擎内部看起来更好。然而,在我们返回SpeedTree 之前,我们需要在虚幻引擎中设置适当的着色器,这样我们在精炼时就不会因为草丛中的奇怪阴影而分心。
3
设置草着色器
将植被从SpeedTree 导入虚幻引擎通常看起来不太好。因为你需要一个好的着色器才能使植被看起来更好。当然,SpeedTree 可以选择将现有材质导出到虚幻,但我们意识到我们需要一个更全面的解决方案。因此,我没有使用导入的默认着色器,而是自己编写了这些函数。
1. 淡入淡出效果取决于草地和相机之间的距离。
为此,我使用了“每个实例淡入淡出量”节点,它是一个着色器节点,用于设置视口和草地之间的实际淡入淡出量。要使用此节点,您需要使用草纹理将其粘在地面上。我们将为此使用景观材质。如果您打开“景观草类型”并将“开始剔除距离”设置为低于“结束剔除距离”的值,则“每个实例淡入量”将开始输出草材质中每种草的实际数量。距开始剔除的距离随着距离的增加,距离会减小。使用此信息,您现在可以调整草的整体不透明度,以便远处的草淡出。
2.增加法线贴图的强度。
这改善了模型零件上的草照明效果,使其看起来好像每根草的光影都指向不同的方向,而不是看起来像一排平坦的草。为了实现这种效果,我使用了Flatten Normal 节点。此结果取决于所使用的法线贴图。理想情况下,草的光和影应该指向不同的方向,使每棵草的弯曲、扭曲和转动都不同,就像在大自然中一样。
3.次表面散射。
这是使草地看起来更真实的最重要的部分之一。我发现使用反照率作为地下颜色对于草地效果很好。我还使用顶点颜色使草根起源的区域稍微变暗,以便草与地面纹理更好地融合。
4、颜色的变化也很重要。
摆脱过于均匀和过于人造的草坪颜色。着色器使用小的和大的变化。较小的变化由一个名为“速度树颜色变化”的节点组成,该节点为每棵草提供随机颜色。对于大规模的颜色变化,纹理遮罩平铺在世界空间XY 中并用于实现两种颜色之间的变化。
5. 海拔变化
这是我最喜欢的着色器功能之一,因为它使草看起来非常蓬松。这种效果是通过沿法线偏移顶点来实现的。我们不想偏移草根,所以在靠近地面的顶点上刷顶点颜色,这样根部就不会产生偏移效果。为了获得一些变化,我在世界空间中平铺了蒙版,以指定要偏移的草块。
以下是所有着色器的视觉概述:
四
设置景观材质
景观材料是这个项目的关键部分,它将一切联系在一起,本质上使我们能够以高水平的方式生成程序植被。材质本身也很简单,一个名为“Grass”,另一个名为“Grass High”,可以通过景观链接来绘制。使用这些景观通道输出节点将它们链接到另一个草节点。 Grass 层生成短草,Grass High 层生成高草。此外,我们在整个景观的世界空间XY 中使用遮罩平铺,以在草层中生成杂草和花朵簇。最后,为了减少透支,我简单地从每个遮罩中减去高草遮罩,以防止杂草、花朵和短草在高草层中生成。
五
优化
我们发现,在优化任何类型的植被(包括草)时,优化透支开销是最重要的问题。我想要一个漂亮的特写渲染,所以我决定向模型添加更多块以使草更密集。例如,如果我的目标是达到60 FPS,我就不会这样做。对于此项目,PC 使用GTX 1060 以40-45 FPS 运行1080p。因此,为了提高性能,我们降低了草地模型部分的密度(幸运的是,这是一个非常简单的修复,因为我们在SpeedTree 中使用了程序工作流程),并使其远离虚幻引擎。
6
结论是
回想起来,这个项目是一次非常有趣的经历,我从中学到了很多东西。我认为最大的挑战是找到一种方法让草地在SpeedTree 中看起来很好,同时在虚幻引擎中完善结果。在我看来,决定使用哪种贴图纹理和设置正确的着色器是两个重要的里程碑。
优化也是一个很大的挑战。尽管我们尝试了不同的方法并得出了一些结论,但很明显,关于如何创建适当优化的植被,仍有很多东西需要学习。我希望通过继续这个项目,我们能够实现这一目标。你甚至可能会学到一些东西。
感谢您的阅读。我希望你觉得它很有趣。如果您有任何疑问,请随时发送给我们。
本文和图片来自网络,不代表火豚游戏立场,如若侵权请联系我们删除:https://www.huotun.com/game/582064.html