植被:创作技巧
多边形植物#
基于多边形网格的植物模型应用于特写镜头和中距离镜头,以最真实地呈现现实生活中的绿色植物。在实时项目中使用优化的 3D 树木模型至关重要。
本节将向您介绍 UNIGINE 和第三方数字内容创建软件中的一些植被创作技巧。
造型#
在准备树叶茂密的树的 3D 模型时,避免为所有树枝和树叶创建拓扑;相反,使用纹理模拟精细细节在性能方面要高效得多。为实时使用而优化的模型的主要规则是“多边形越少越好”。遵循这条规则对于渲染充满多种植物和草的茂密森林更为关键。
因此,强烈建议准备几个层次的细节(细节层次) 用于在距相机不同距离处使用的植物。
树建模的整体工作流程如下:
-
用树叶为几个小树枝建模并将模型烘焙到纹理图集中——获得的纹理将成为你的树叶纹理。以下是此类纹理的示例:
-
创建将代表树叶块的低多边形网格,映射 UV 以获得适当的纹理。块不必是平的,您可以尝试网格的形状和弯曲。准备至少 3 个 LOD 也很重要,因此请确保将 LOD 的网格优化到最大程度:
植被 LOD -
创建具有大分支和详细级别的树干。准备和分配必要的纹理和材质。
主干 LOD此外,建议将法线从树干转移到分支的相邻顶点,以使关节看起来更自然:
调整关节处的分支法线提供更自然的外观 -
将树叶块的 LOD 散布在形成树冠的相应树干 LOD 的树枝上:
在所有 LOD 上使用相同数量的块这一事实可能会导致更高的多边形数量。但是,这种方法有很多优点:
- 分支的高度多样性使得创建更逼真的植物成为可能。
- LOD 之间更好的、几乎无缝的过渡。所有元素都可以随时调整,以消除任何不一致。
- 更宽松的艺术管道使艺术家能够从相同的块中收集不同大小和年龄的树木。
- 即使在最低 LOD(SSAO, SSGI 等)上也能准确处理后期效果。
- 还建议创建单独的低细节植物 LOD 以简化阴影投射。为此,您可以复制最低的 LOD 并对其进行更多优化,并且配置阴影投射在 UNIGINE 中。
-
为了更好地与地形融合,请准备一个单独的树干底部并分配新材质。为方便起见,您可以将其合并到最高 LOD 的网格中:
-
定位模型因此它将适当地导入 UNIGINE,重置所有转换。
注意网格的枢轴点的正确位置(显然,所有 LOD 必须具有相同的位置)。通常,枢轴放置在工厂的最底部,以便于世界设计。但是,如果需要,您可以更改枢轴的位置茎动画.
-
因此,该模型具有以下内容:
为方便起见,建议为稍后将在导入期间使用的详细级别的名称添加后缀。
- 考虑进一步调整顶点法线和顶点颜色和UV叶动画.
- 导出模型到推荐的 FBX 格式。
配置工厂的外观#
将创建的模型导入 UNIGINE FBX 导入指南和将植物添加到场景中.
要使单个 Mesh Static 的所有单独对象表面,启用合并静态网格体在导入设置中。
设置 LOD#
设置可见距离细节层次通过启用 Combine By Postfixes 选项并调整导入设置中的值。
阴影细节层次#
什么时候动态阴影投射使用时,启用阴影的每个光源都会再渲染一次所有多边形。 World 光源最多可以有 4 个阴影级联,因此渲染到阴影贴图中的多边形数量可能非常巨大,从而对性能造成很大影响。您可以使用渲染分析器.
这就是为什么对树叶阴影使用低多边形网格是最佳实践的原因。执行以下步骤:
-
禁用除阴影 LOD 之外的所有植物 LOD 的阴影投射。您可以通过以下方式之一执行此操作:
- 通过禁用 Cast Proj and Omni Shadows 和 Cast World Shadows 标志。
- 通过切换所有位影子面具.
- 通过切换所有位来隐藏任何相机的阴影 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 是对远处植被进行动画处理的最性能友好的方式:所有四边形都被渲染为始终面向相机的 billboards; UV 通道 2 定义了多边形的大小和运动。因此,树叶网格应该只包含树叶的四边形。
基于广告牌的灌木
|
灌木的网格
|
动画使用对象的UV通道2如下:在UV网格中,[0,1]是广告牌运动的轴心点,可以通过缩放UV通道中的多边形来改变广告牌的大小。
紫外线通道 1
|
紫外线通道 2
|
网格(上)和结果(下)
|
通过相同的控制多边形运动动画参数.
全局动画选项#
散射植物#
为了在地形上随机散布大量相同的网格,使用 Mesh Clutter。 Mesh Clutter 按程序分散对象并仅渲染位于视锥体中的对象。典型的工作流程如下:
-
单击 Create -> Clutter -> Mesh 并指定要用作 Mesh Clutter 的源网格的 .mesh 资源。在视口中单击以将新节点放置在世界中。
.fbx 资源是 .mesh 资源的容器,右键单击资源并选择 Open 或双击它以访问其内容。 -
如果您的世界中已经有一个配置树,您可以从配置树的表面复制所有材质和参数并粘贴它们按顺序或按表面名称到 Mesh Clutter。
-
将节点放置在场景中并设置 Size 以覆盖整个可玩区域。
Mesh Clutter 对象的操作是基于浮点的,所以不建议使用大于 10000 单位的 Sizes 纵向和横向。如果您需要填充超出此限制的区域,则需要手动将单个 Mesh Clutter 对象拆分为由多个杂物组成的网格。
这Sandworm 在生成地形时自动进行切片。
- 调整散射参数:设置所需的密度每平方单位的目数;通过随机化使森林的外观多样化缩放、偏移和旋转参数。
-
使杂波对象成为地形的子对象并启用路口旗帜使树木跟随水面。
如果启用了 Intersection 标志,请将其关闭再打开以强制重新生成 Clutter 对象。 - 调整能见度和褪色距离。鉴于可能在茂密的森林中发挥作用的多边形数量,建议使 Mesh Clutter 在尽可能短的距离可见,并在更远的距离使用 Impostor 对象。
-
默认情况下,树木散布在整个区域。你可以用植被遮盖区域通过以下方法:
-
通过使用单通道纹理。您可以在第三方软件中准备纹理或创建一个新的,然后画面具从头开始。所有使用该纹理的 Mesh Clutter 和 Grass 对象都会即时更新。
-
通过使用景观地形蒙版.您可以使用 Landscape Terrain 蒙版的数据来定义植被的密度,前提是您的世界包含 Landscape Terrain 并配置了蒙版:在 Mask Terrain 参数中选择所需的蒙版:
您还可以使用画笔编辑器并即时更新 Mesh Clutter。
所有景观地形数据,包括蒙版,均受制于数据流.如果您有未优化的流设置,则在世界启动和更改相机位置时加载掩码数据可能会出现瓶颈,从而影响 Mesh Clutter 生成的性能。 -
作为附加功能,用网格遮蔽也可用:
-
- 创建代表边界切割体积的 Mesh Static 或 Decal。为它启用 Clutter Interaction 标志。
- 选择并启用将用于剪切功能的对象的一些 Intersection 掩码。
- 启用 Clutter 对象的 Cutout Intersection 掩码的相同位。
- 通过禁用其 Viewport 掩码的所有位并禁用阴影投射为了它。
在盒子里砍树
-
-
保持最佳 Step 值以获得最佳性能。
Clutter 被渲染为 2D 网格,在每个单元格中,网格根据出现的密度和概率随机散布。从最近的单元开始,单元中网格的生成是时间分片的,以减少 CPU 的负载。
细胞分裂Step 值以单位定义像元大小。因此,该值指定沿每个轴生成的单元格数(大小除以步长)。强烈建议选择除以无余的值。
每个cell都需要1 DIP调用,所以cell的数量越多(即step越小),性能下降越多。但是,创建大单元格需要更长的时间。当相机移动得足够快时,小单元会非常快速且流畅地逐个创建,但大单元会明显出现并导致轻微的渲染延迟。
您可以以相同的方式在地形上散布灌木和多边形草块。
最后,通过为不同类型的树木、灌木和草组合多种杂物,您可以获得多样化的植被外观。
手动放置#
作为画龙点睛的一笔,您可以在需要的地方将树放置为 Static Mesh。将大量相同的网格收集到一个 Mesh Cluster 对象中,以便将一堆网格视为一个对象并进行渲染,这在性能方面是有效的。
您可以烘焙其层次结构的相同网格或收集世界上所有相似的网格。有关方法的更多详细信息,请参阅专用文章收集集群.
另一种在场景中快速散布草丛、灌木丛和树木的便捷方法是使用网格放置画笔工具:
-
切换到Cluster Editor模式:
- 在场景中选择一个或多个 Mesh Cluster 对象,或使用 Active Tool 窗口中的 Create 按钮创建一个新对象。
-
用画笔绘制区域,在场景中散布网格:
- 如果需要的话,编辑集群手动重新定位或删除一些网格。
Billboards#
Billboard 是一个始终面向相机的平面矩形对象。使用 billboards 而不是从远处几乎看不到的功能齐全的对象可以显着简化并加快渲染速度。
Impostors#
就 UNIGINE 而言,Impostor 是一个类似于 billboard 的对象,能够通过根据视角显示不同区域的纹理来模仿多边形网格的外观。 Impostor 对象通过减少多边形的数量同时节省视觉保真度来加速几何渲染。
内置的 Impostor Creator 工具可以轻松生成单个网格的 Impostors 和 Mesh Clutters。
对于基于 Mesh Clutter 的森林,具有 grass_impostor_base 材质的 Grass 对象将用作低多边形 LOD。那时, Clutter和草参数必须匹配以确保所有 LOD 的位置和方向相同。
网格混乱和冒名顶替者
|
网格和冒名顶替者的线框
|
草对象也被渲染为 2D 网格以优化性能。 Step 参数定义像元大小。通常,冒名顶替者比网格更远可见,并且要分别选择 Step 值。您可以使用细分大草细胞的 Subdivision 参数,使它们与 Mesh Clutter 的较小细胞相匹配,以使随机散布对象的位置与基于草的冒名顶替者的位置一致。因此,杂波 Step 必须与草的 Step/Subdivision 值的比率相匹配。
草#
具有 grass_base 材质的 Grass 对象可以填充地形上的空白点,并增加场景中较低植被的整体密度。 grass_base 材质旨在代表草的基本特征。与 mesh_base 材质相比,它的视觉保真度较低,因此应将 Grass 视为草的额外填充层。
首先,您需要准备一个 Diffuse 纹理,其中的块代表小草丛:
块将按如下方式放置在纹理中:
- 垂直的柱子代表不同的草种,每一个都会根据 Mask 纹理的对应通道进行分布。因此,列数必须与Mask纹理的通道数相匹配;否则,草丛将被错误地切割。
- 水平行表示特定物种的草的变化(更薄、更厚、缠结等)。可以有从 1 到 4 行,并且这个数字必须与 Num Textures 值一致。
对于具有 4 列的草纹理,应使用具有 4 个通道的遮罩:
有关详细信息,请参阅 Texture Slots 部分。
但是,如果将草作为一个整体进行渲染,则具有视觉吸引力的草可能会降低性能。所有计算都是时间切片的,并按 2D 网格的每个单元执行,以允许以交互式帧速率进行渲染。因此,为细胞选择最佳的 Step 对于更好的性能至关重要。
有关创建和配置草的更多详细信息,请参阅深入教程:添加草.
也可以看看#
- 使用 Sandworm 基于土地覆盖数据生成植被
- 草优化
- Vegetation 内容样本
- Vegetation 附加组件
- Fox Hole 演示