使用贴花

备注

贴花仅在集群Forward 和 Forward Mobile 渲染后端中受支持,在兼容性后端中则不受支持。

如果使用兼容性后端,请考虑使用 Sprite3D 作为将贴花投影到(大部分)平坦表面的替代方案。

贴花是应用于 3D 不透明或透明表面的投影纹理。 该投影是实时生成的,不依赖于网格生成。 这允许你在每一帧移动贴花,即使在复杂的网格上应用时,也只会对性能产生很小的影响。

虽然贴花无法将实际的几何细节添加到投影表面上,但贴花仍然可以利用基于物理的渲染来提供与完整的 PBR 材质类似的属性。

你会在这个页面中学习到:

  • 如何在 3D 编辑器中设置贴花。

  • 如何在游戏过程中为 3D 场景创建贴花(例如弹孔)。

  • 如何为贴花的配置进行性能和质量之间的平衡。

参见

Godot 示例项目仓库包含一个 3D 贴花演示

如果你想在表面上写入任意 3D 文本,请使用靠近表面放置的 3D 文本 而不是贴花节点。

使用案例

静态装饰

有时,向场景添加纹理细节的最快方法是使用贴花。 对于有机细节(organic detail)尤其如此,例如散布在大表面上的污垢或沙子。 贴花可以帮助打破场景中的纹理重复,并使图案看起来更自然。 在较小的规模上,贴花也可用于创建对象的细节变化。 例如,贴花可用于在硬表面几何体(hard-surface geometry)顶部添加螺母和螺栓。

由于贴花可以在投影表面上注入自己的 PBR 属性,因此它们也可以用于创建足迹或湿水坑。

使用贴花在关卡几何体( level geometry )顶部添加污垢

使用贴花在关卡几何体( level geometry )顶部添加污垢

动态游戏元素

贴花可以展现暂时或持久的游戏特效,例如子弹撞击和爆炸烧焦。

使用 AnimationPlayer 节点或脚本,可以使贴花随着时间的推移而褪色(然后使用 queue_free() 删除)以提高性能。

片面阴影

斑点阴影经常用于移动项目(或遵循复古艺术风格),因为实时照明在低端移动设备上往往耗费过大。 但是,当依赖具有完全烘焙灯光的烘焙光照贴图时,动态对象不会从这些灯光投射 任何 阴影。 与实时光照相比,这使得光照贴图场景中的动态对象看起来很平坦,动态对象几乎看起来像是漂浮的。

由于斑点阴影,动态对象仍然可以投射近似阴影。 这不仅有助于场景中的深度感知,而且还可以成为一种游戏元素,尤其是在 3D 平台游戏中。 斑点阴影的长度可以延长,让玩家知道如果他们垂直落下时自己会落在哪里。

即使使用实时光照,斑点阴影仍然可以作为环境光遮挡的一种形式,适用于 SSAO 由于其屏幕空间性质而消耗过大或过于不稳定的情况。 例如,使用斑点阴影很好地表现了车辆的底部阴影。

对象比较下的斑点阴影

对象比较下的斑点阴影

快速入门指南

在编辑器中创建贴花

  1. 在 3D 编辑器中创建贴花节点。

  2. 在检查器中,展开 Textures 部分并在 Textures > Albedo 中加载纹理。

  3. 将贴花节点移向对象,然后旋转它以使贴花可见(并且方向正确)。 如果贴花看起来是镜像的,请尝试将其旋转 180 度。 你可以通过将 Parameters > Normal Fade 增加到 0.5 来仔细检查其方向是否正确。 这将防止贴花投影到不面向贴花的表面上。

  4. 如果你的贴花仅影响静态对象,请将其配置为防止影响动态对象(反之亦然)。 为此,请更改贴花的 Cull Mask (剔除蒙版)属性以排除某些图层。 执行此操作后,修改动态对象的 MeshInstance3D 节点以更改其可见性层。 例如,你可以将它们从第 1 层移动到第 2 层,然后在贴花的 Cull Mask 属性中禁用第 2 层。

贴花节点属性

  • Extents: (范围)贴花的大小。 Y 轴决定贴花投影的长度。 保持投影长度尽可能短,以增加剔除机会,从而提高性能。

纹理

  • Albedo: (反照率)用于贴花的反照率(漫反射/颜色)贴图。 在大多数情况下,这是你要首先设置的纹理。 如果使用法线或 ORM 贴图,则 必须 设置反照率贴图以提供 Alpha 通道。 该 Alpha 通道将用作遮罩,以确定法线/ORM 贴图对底层表面的影响程度。

  • Normal: (法线)用于贴花的法线贴图。 这可用于通过修改光对其的反应方式来增加贴花上的感知细节。 该纹理的影响会乘以反照率纹理的 Alpha 通道(但不是 Albedo Mix )。

  • ORM: 用于贴花的遮挡(Occlusion)/粗糙度(Roughness)/金属贴图(Metallic map)。 这是用于存储 PBR 材质贴图的优化格式。 环境光遮挡贴图存储在红色通道中,粗糙度贴图存储在绿色通道中,金属贴图存储在蓝色通道中。 该纹理的影响会乘以反照率纹理的 Alpha 通道(但不是 Albedo Mix )。

  • Emission: (自发光)用于贴花的自发光纹理。与 Albedo 不同,此纹理看起来会在黑暗中发光。

参数

  • Emission Energy: (自发光能量)自发光纹理的亮度。

  • Modulate: (调制)将反射率和自发光贴图的颜色相乘。通过这种方式对贴花进行着色(例如,对于绘画贴花)或通过随机化每个贴花的调制来增加多样性。

  • Albedo Mix: (反照率混合)反照率纹理的不透明度。与使用具有更透明 alpha 通道的反照率纹理不同,将该值降低到 1.0 以下 不会 减少法线/ORM 纹理对下表面的影响。在创建仅普通/ORM 贴花(如足迹或湿水坑)时,将此值设置为 0.0

  • Normal Fade: (法线衰减)当贴花的 AABB (Axis-Aligned Bounding Box, 轴对齐边界框)`与目标表面之间的角度变得过大时,贴花将会淡出。值为 ``0.0` 时,不管角度如何都会投影出贴花,而值为 0.999 时,贴花将仅限于几乎垂直的表面。由于额外的法线角度计算,将 Normal Fade 设置为大于 0.0 的值会带来一些性能损耗。

垂直淡化(Vertical Fade)

  • Upper Fade:(上部淡化)随着表面远离 AABB 中心(朝向贴花的投影角),贴花将逐渐淡出的曲线。 只有正值才有效。

  • Lower Fade:(下部淡化)随着表面远离 AABB 中心(远离贴花的投影角),贴花将逐渐淡出的曲线。 只有正值才有效。

距离淡出

  • Enabled(启用):控制是否启用距离淡出(LOD 的一种形式)。 贴花将在 Begin + Length 内淡出,之后它将被剔除并且根本不会发送到着色器。 使用它可以减少场景中活动贴花的数量,从而提高性能。

  • Begin: (开始)贴花开始淡出时距相机的距离(以 3D 单位表示)。

  • Length: (长度)贴花淡出的距离(以 3D 单位表示)。 贴花在这段距离内逐渐变得透明,最后完全不可见。 值越高,淡出过渡越平滑,这在相机快速移动时更适合。

Cull Mask(剔除遮罩)

  • Cull Mask: (剔除遮罩)指定此贴花将投影到哪些 VisualInstance3D 图层。 默认情况下,贴花会影响所有图层。 使用它可以指定哪些类型的对象接收贴花,哪些类型不接收贴花。 这个功能特别有用,你可以确保动态对象不会意外收到针对其下方地形的贴花。

Decal rendering order

默认情况下,贴花的渲染顺序是基于他们的:abbr:AABB (Axis-Aligned Bounding Box) 和相机的距离排序的。距离相机更近的AABB会优先被渲染,这意味着如果有些贴花处于相同的位置,那贴花的渲染顺序有时会随相机位置的变化而变化。

为解决贴花重叠导致的闪烁问题,你可以调整贴花Node检查器下的VisualInstance3D中的**Sorting Offset**属性。这个offset不是一个严格的优先级排序,而是一个*准则*,虽然渲染器会依据该准则决定渲染顺序,但贴花排序方式仍会受到AABB大小的影响。因此,offset值更高的贴花*总是*会被绘制在offset值更低的贴花上。

如果你想让某个贴花总是渲染在其他贴花上,你需要将该贴花的**Sorting Offset**属性设置成正值,该值要大于可能与其重叠的其他最大贴花的AABB长度。相反,如果想让该贴花绘制在其他贴花后,将**Sorting Offset**设置为负值即可。

不同VisualInstance3D Sorting Offset的贴花相比较

不同VisualInstance3D Sorting Offset的贴花相比较

调整性能和质量

贴花渲染性能主要取决于其屏幕覆盖范围及其数量。 一般来说,覆盖大部分屏幕的一些大贴花的渲染消耗,会比散布在各处的许多小贴花的渲染消耗更高。

要提高渲染性能,你可以如上所述启用 Distance Fade 属性。 这将使远处的贴花在远离相机时淡出(并且可能对最终场景渲染几乎没有影响)。 使用节点组,你还可以根据用户配置防止生成非必要的装饰贴花。

贴花的渲染方式也会对性能产生影响。 渲染 > 纹理 > 贴花 > 过滤 高级项目设置可让你控制如何过滤贴花纹理。 Nearest/Linear 不使用 mipmap。 然而,贴花在远处看起来会有颗粒感。 Nearest/Linear Mipmaps 在远处看起来会更平滑,但从倾斜角度观看时贴花会看起来模糊。 这可以通过使用 Nearest/Linear Mipmaps Anisotropic 来解决,它提供最高的质量,但渲染速度也较慢。

如果你的项目具有像素艺术风格,请考虑将过滤设置为 Nearest 值之一(即具有 Nearest 属性的任意一个过滤),以便贴花使用最近邻过滤(nearest-neighbor filtering)。 否则,请继续使用 Linear

限制

贴图不能影响除上面列出的材质特性之外的材质特性,例如高度(用于视差贴图)。

出于性能方面的考虑,贴花使用的是完全固定的渲染逻辑,也就是说贴花无法使用自定义着色器。然而,投影面上的自定义着色器能够读取被贴花覆盖的信息,例如表面的粗糙度和金属性。

在使用 Forward+ 渲染器时,Godot 采用 集群 方法进行贴花渲染。只要性能允许,可以添加任意数量的贴花。不过,默认情况下,当前摄像机视图中的 集群元素 上限仍为 512 个。集群元素是指全向灯、聚光灯、 贴花反射探针。可以通过调整 “渲染 > 限制 > 群集生成器 > 最大群集元素“高级项目设置来增加此限制。

在使用 Forward 移动后端时,每个单独的 Mesh 资源 上只能应用 8 个贴花。如果有更多贴花影响单个网格,则并非所有贴花都会渲染在网格上。