植被:创作技巧
多边形植物#
基于多边形网格的植物模型应用于近距离和中距离的场景,以实现最逼真的真实植被表现。在实时项目中使用优化的3D树木模型至关重要。
本节将向您介绍在UNIGINE和第三方数字内容创作软件中创建植被的一些技巧。
建模#
在准备具有茂密树叶的树木3D模型时,避免为所有树枝和树叶创建拓扑结构;相反,使用纹理模拟细节在性能上更为高效。优化用于实时渲染的模型的主要规则是“多边形越少越好”。在渲染充满多种植物和草地的茂密森林时,遵循这一规则尤为重要。
因此,强烈建议为植物准备多个细节层次(LOD),以便在不同距离下使用。
树木建模的整体工作流程如下:
-
模型化几个带有树叶的小树枝,并将模型烘焙到纹理图集中——获得的纹理将作为您的树叶纹理。以下是此类纹理的示例:
-
创建表示树叶块的低多边形网格,映射UV以进行适当的纹理处理。块不必是平面的,您可以尝试网格的形状和弯曲。同时,准备至少3个LOD,确保优化LOD的网格:
树叶 LOD -
创建树干和大树枝,并为其准备细节层次。准备并分配必要的纹理和材质。
树干 LOD建议将法线从树干转移到相邻的树枝顶点,以使连接处看起来更自然:
调整后的树枝法线使连接处看起来更自然 -
将树叶块的LOD散布在相应树干LOD的树枝上,形成树冠:
在所有LOD上使用相同数量的块可能会导致多边形数量增加。然而,这种方法有许多优点:
- 高多样性的树枝可以创建更逼真的植物。
- 更好的、几乎无缝的LOD过渡。所有元素都可以随时调整以消除任何不一致。
- 更宽松的艺术流程使艺术家能够从相同的块中收集不同大小和年龄的树木。
- 即使在最低的LOD上,后期效果(SSAO, SSGI 等)也能准确处理。
- 建议创建一个单独的低细节树叶LOD以简化阴影投射。您可以复制最低的LOD并进一步优化,并在UNIGINE中配置阴影投射。
-
为了更好地与地形混合,准备一个单独的树干底部部分,并分配新的材质。为了方便,您可以将其合并到最高LOD的网格中:
-
调整模型的方向,使其在UNIGINE中正确导入,重置所有变换。
注意网格的枢轴点的正确位置(显然,所有LOD必须具有相同的位置)。通常,枢轴点位于植物的最底部,以便于世界设计。但是,如果需要茎干动画,可以更改枢轴点的位置。
-
最终,模型包含以下内容:
为了方便,建议在LOD的名称中添加后缀,以便在导入时使用。
- 考虑进一步调整顶点法线、顶点颜色和UV以进行树叶动画。
- 将模型导出为推荐的FBX格式。
配置植物的外观#
按照FBX导入指南将创建的模型导入UNIGINE,并将植物添加到场景中。
要使所有单独的对象成为单个Mesh Static的表面,请在导入设置中启用Merge Static Meshes。
设置 LOD#
通过启用Combine By Postfixes选项并在导入设置中调整值来设置LOD的可见距离。
阴影LOD#
当使用动态阴影投射时,所有多边形都会为每个启用了阴影的光源再次渲染。World光源最多可以有4个阴影级联,因此渲染到阴影贴图中的多边形数量可能非常巨大,导致性能大幅下降。您可以使用渲染分析器来估算此数量。
因此,最佳实践是使用低多边形网格进行树叶阴影。执行以下步骤:
-
禁用所有树叶LOD的阴影投射,除了阴影LOD。您可以通过以下方式之一执行此操作:
- 禁用 Cast Proj and Omni Shadows 和 Cast World Shadows 标志。
- 切换Shadow Mask(阴影掩码)的所有位。
- 通过其Viewport Mask(视口掩码)的所有位,隐藏阴影LOD以使其对任何摄像机不可见。
有关配置阴影LOD的演示,请参阅位掩码视频教程。
材质调整#
如果在导入选项中启用了 Import Materials 标志,则所有必要的材质都已生成并分配给树的表面。让我们考虑一些值得注意的材质参数:
- 使叶子材质为 Alpha-Test,以根据 Albedo 纹理的 Alpha 通道剪切纹理像素。
-
如果高光不正确,建议将 Specular 值设置为 0。
反射渲染调试预览(左)和结果图像(右)中的光照不正确 -
考虑启用材质的Two Sided选项以使树叶更密集。请注意,如果场景中有太多多边形,这可能会显著影响性能。
将Backside Normal(背面法线)模式切换为To Front Side(向前)选项,因为这通常为树叶提供更逼真的结果。
-
如果纹理显示树叶由平面块组成,一个很好的解决方案是使用Angle Fade(角度淡出)功能,该功能在极端角度下剪切面向摄像机的多边形。
注意此功能可能对修改过法线的网格无法正常工作。 -
调整树叶材质的半透明度以获得更好的外观。增加Translucent(半透明)值以允许光线穿过对象。
您还可以在States(状态)选项卡中启用Translucent Map(半透明贴图),以指定定义对象不透明部分(如树枝)的单通道纹理。
注意如果使用了法线贴图并定义了此类表面细节,则无需在半透明纹理上绘制叶子的纤维和小细节。反照率纹理半透明纹理 -
启用底部树干的材质的Terrain Lerp(地形插值)标志,以将您的树与场景中的地形混合。
顶点法线调整#
由于树叶由平面块组成,导致着色不准确。为了抵消这一点并隐藏网格的平面性,调整顶点法线并影响树叶的着色。
以下是可能的解决方案:
-
启用 Normals Rotated To Camera(法线旋转到摄像机)选项,使所有表面法线朝向摄像机,忽略几何法线。此功能作为快速解决方案,尽管它使所有多边形以相同的方式着色。
-
在建模软件中手动编辑顶点法线。从边界笼传输顶点法线,使树叶看起来像光滑而密集的树冠。
注意建议使用圆顶状的边界笼,边向地面拉长,以避免较低多边形上的着色错误。从边界笼转移法线结果,树叶几何的平面性不那么明显(右侧):
MIP 贴图#
UNIGINE 渲染器支持的MipMapping技术意味着为较小和较远的多边形采样较低的纹理。在这种情况下,树叶的微小特征会随着距离的增加而逐渐消失。在某些情况下,远离摄像机的树枝和树叶看起来比近距离视图更厚。
可以通过以下方法解决此问题:
动画#
启用 Vegetation 状态以激活一组动画相关的参数。
植被动画由茎干和树叶动画组成。要启用两者,请将Animation(动画)设置为Default(默认)或Field(场)选项。
在这种情况下,Field Animation(场动画)使植物受到场动画体积的影响,使您能够局部覆盖动画参数(例如,模拟靠近旋翼机的旋翼下洗效果)。
茎干动画#
茎干动画基于空间3D噪声应用顶点移动,以模拟由风引起的植物树干或茎干的弯曲。网格的枢轴点被认为是固定的,顶点沿Z轴越远,应用的移动越强。
因此,必须将枢轴点放置在正确的位置(通常是茎干的最底部),并调整模型的方向,使Z轴向上。
一套控制动画的参数
请注意,植物的所有表面必须具有相同的茎干动画参数才能同步它们的运动。
树叶动画#
树叶是顶点着色器动画的另一层,主要用于树叶,提供额外的细节弯曲。使用此类型的动画需要在建模阶段对几何体进行初步调整。
有几种种现成的树叶动画方法。使用Leaves(树叶)选项选择动画类型。
基于顶点颜色的几何#
这种推荐的方法提供了对树叶的最佳控制,意味着树叶作为多边形渲染,并使用顶点颜色进行动画。
植被运动由顶点颜色的RGB通道定义如下:
![]() |
红色通道用于较小或外围植被部分(树叶)的动画。明亮部分被动画化,暗部分僵硬。 |
![]() |
绿色通道用于定义树枝的运动顺序以使其不同步。运动序列从最亮的元素开始到最暗的元素。 |
![]() |
蓝色通道用于定义树枝的哪些部分可以弯曲。较亮的部分表示可弯曲的部分,较暗的部分表示僵硬的部分。 |
动画参数控制顶点运动:
这也是使用此技术动画树枝的常规做法,即使它们附着在树干上:
在这种情况下,相关表面必须在相邻顶点上具有相同的顶点颜色和相同的动画参数,以同步它们的运动:
基于UV的几何#
这是一种较为过时的方法,当树叶作为标准多边形渲染时。它需要为网格定义UV通道2。
![]() 基于 UV 的几何动画
|
![]() UV 通道 2:最硬的顶点在左上角
|
动画使用物体的UV通道2如下:在UV网格中,[0,1]是物体运动的轴心点,也是物体最硬的部分,朝向[1,0],物体变得更加灵活.
![]() |
![]() |
通过相同的控制顶点移动动画参数。
Billboard(广告牌)#
Billboard(广告牌)是最节省性能的动画远距离植被的方式:所有四边形都作为广告牌渲染,始终面向摄像机;UV通道2定义多边形的大小和运动。因此,树叶网格应仅包含用于树叶的四边形多边形。
![]() 基于广告牌的灌木
|
![]() 灌木的网格
|
动画使用对象的UV通道2如下:在UV网格中,[0,1]是广告牌运动的轴心点,可以通过缩放UV通道中的多边形来改变广告牌的大小。
![]() UV 通道 1
|
![]() UV 通道 2
|
![]() 网格(上)和结果(下)
|
通过相同的控制多边形运动动画参数。
全局动画选项#
散布植物#
为了随机散布大量相同的网格在地形上,使用 Mesh Clutter。 Mesh Clutter程序化地散布对象,并仅渲染那些在视锥体内的对象。典型的工作流程如下:
-
单击 Create -> Clutter -> Mesh 并指定要用作 Mesh Clutter 的源网格的 .mesh 资源。在视口中单击以将新节点放置在世界中。
注意.fbx 资源是 .mesh 资源的容器,右键单击资源并选择 Open 或双击它以访问其内容。 -
如果您已经在世界中配置了一棵树,您可以从配置的树的表面复制所有材质和参数,并按表面名称或顺序粘贴到 Mesh Clutter。
-
将节点放置在场景中并设置 Size 以覆盖整个可玩区域。
注意Mesh Clutter 对象的操作是基于浮点的,所以不建议使用大于 10000 单位的 Size 纵向和横向。如果您需要填充超出此限制的区域,则需要手动将单个 Mesh Clutter 对象拆分为由多个Clutter组成的网格。
Sandworm在生成地形时自动进行切片。
- 调整散布参数:设置每平方单位所需的密度;通过随机化Scale、Offset 和 Rotation参数来多样化森林的外观。
-
使Clutter对象成为地形的子对象,并启用Intersection标志以使树木跟随表面。
注意如果已启用 Intersection 标志,请将其关闭再重新打开,以强制重新生成 Clutter 对象。 - 调整可见性和淡出距离。考虑到在茂密森林中可能涉及的多边形数量,建议使Mesh Clutter在尽可能短的距离内可见,并在更远的距离上使用Impostor对象。
-
默认情况下,树木散布在整个区域。您可以通过以下方法屏蔽植被区域:
-
使用单通道纹理。您可以在第三方软件中准备纹理或创建新纹理并从头绘制掩码。所有使用该纹理的Mesh Clutter和Grass对象都会实时更新。
-
使用地形掩码。如果您的世界包含配置了掩码的Landscape Terrain,您可以使用Mask Terrain的数据来定义植被的密度。
您还可以使用画笔编辑器编辑掩码,并实时更新 Mesh Clutter。
注意所有Landscape Terrain数据,包括掩码,都会受到数据流传输的影响。如果您的流传输设置未优化,在世界启动或更改相机位置时,掩码数据的加载可能会出现瓶颈,从而影响 Mesh Clutter 的生成性能。 -
您还可以通过使用网格进行掩码:
-
- 创建表示裁剪体积边界的 Mesh Static 或 Decal,并启用 Clutter Interaction 标志。
- 选择并启用要用于裁剪功能的对象Intersection 的一个位。
- 启用 Clutter 对象的 Cutout Intersection 掩码中相同的位。
- 通过禁用其 Viewport 掩码的所有位并禁用阴影投射,隐藏该对象的视觉表现,使其不在相机中显示。
在框内裁剪树木
-
-
保持最佳 Step 值以获得最佳性能。
Clutter 渲染为 2D 网格,在每个网格单元中,网格会根据密度和出现概率随机分布。网格的生成采用时间切片方式,从最近的单元开始,以减少 CPU 负载。
网格划分为单元Step 值定义了单元的大小(单位为世界单位)。因此,该值决定了每个轴上的最终单元数(整体大小除以步长)。建议选择能够整除的数值。
注意每个单元都需要进行一次 DIP调用,因此单元数量越多(步长越小),性能下降越明显。然而,创建较大的单元需要更长的时间。当摄像机移动速度较快时,较小的单元可以快速、平滑地逐个生成,而较大的单元可能会突然显现,导致轻微的渲染卡顿。
您可以使用相同的方法在地形上散布灌木丛和多边形草块。
最后,通过结合不同类型的 树木、灌木和草地的 Mesh Clutter,可以打造更加多样化的植被景观。
手动放置#
作为最后的修饰,您可以在需要的地方将树木放置为Static Mesh。为了性能优化,将大量相同的网格收集到Mesh Cluster对象中,以便将一堆网格作为一个对象处理和渲染。
您可以烘焙其层级结构中的相同网格,或收集世界中所有相似的网格。有关集群网格的收集方法,请参阅相关文档。
另一种方便的方法是使用 网格放置画笔工具,快速在场景中散布草丛、灌木和树木集群。
-
切换到Cluster Editor模式:
- 在场景中选择一个或多个 Mesh Cluster 对象,或使用 Active Tool 窗口中的 Create 按钮创建一个新对象。
-
用画笔绘制区域,在场景中散布网格:
- 如果需要,可以手动编辑集群以重新定位或移除某些网格。
Billboards(广告牌)#
Billboard(广告牌)是一个始终面向相机的平面矩形对象。使用广告牌代替几乎看不到的完整功能对象可以显著简化和加速渲染。
Impostor(替身)#
在UNIGINE中,Impostor(替身)是一种类似广告牌的对象,能够通过根据视角显示纹理的不同区域来模仿多边形网格的外观。替身对象通过减少多边形数量来加速几何渲染,同时保持视觉保真度。
内置的 Impostor Creator(替身创建)工具可以轻松为单个网格和Mesh Clutter生成替身。
对于基于 Mesh Clutter 的森林,将使用带有grass_impostor_base 材质的 Grass 对象作为低多边形LOD。在这种情况下, Cluttergrass参数必须匹配,以确保所有LOD的位置和方向相同。
![]() Mesh Clutter和替身
|
![]() 网格和替身的线框
|
草地对象也以2D网格的形式渲染以优化性能。Step 参数定义了单元格的大小。通常,替身(impostors)的可见距离比网格远得多,因此需要相应地选择Step 值。您可以使用Subdivision参数将大的草地单元格细分,以使其与Mesh Clutter的较小单元格匹配,从而使随机散布的对象位置与基于草地的替身位置一致。因此,Clutter的Step必须与草地的Step/Subdivision值的比例相匹配。
Grass(草地)#
带有 grass_base 材质的 Grass(草地) 对象可以填充地形上的空白区域,并增加场景中低矮植被的整体密度。grass_base材质 旨在表现基础的草地特性,其视觉精度比mesh_base材质 低,因此 Grass 应被视为草地的额外填充层。
首先,您需要准备一张 Diffuse 纹理,其中包含用于表示小草丛的纹理块:
纹理中的块应按照以下方式排列:
- 列代表不同的草种,每种草都会根据 Mask纹理的对应通道进行分布。因此,列数必须与Mask纹理的通道数匹配,否则草丛会被错误地切割。
- 行代表特定草种的变化(如更细、更粗、缠绕等)。行数可在 1 到 4 之间,且必须与 Num Textures 参数的值一致。
对于具有 4 列的草地纹理,应使用带有 4 个通道的蒙版:
有关详细信息,请参阅 Texture Slots 章节。
虽然高质量的草地视觉效果更吸引人,但如果整体渲染,可能会降低性能。因此,所有计算都采用 时间切片方式,并按 2D 网格的单元 进行处理,以确保交互式帧率的渲染性能。因此,选择合适的 Step 值对于优化性能至关重要。
有关创建和配置草的更多详细信息,请参阅深入教程:添加草地。
草地:通用建议#
在场景中添加草地时,请遵循以下建议,以避免性能下降:
- 使用 LOD(层级细节) 并尽可能简化最远的 LOD。LOD 之间的淡入淡出距离不应过大,因为 LOD 过渡时会同时显示两个对象,而不是一个,这将影响性能。
- 禁用草地对象表面的阴影投射,并使用 屏幕空间阴影(Screen-Space Shadows)。
- 确保草地网格的法线方向朝上,以获得正确的光照效果。
- 使地面(背景可见部分)的 Albedo/Roughness 贴图与草地的 Albedo/Roughness 贴图相匹配,这样在远处,草地与地面的过渡会更加平滑、自然。
也可以看看#
- 使用 Sandworm 根据地表覆盖数据生成植被
- 草地优化
- Vegetation 植被内容示例
- Vegetation 附加组件
- Fox Hole 演示