使用贴花

备注

Decals are only supported in the Forward+ and Mobile renderers, not the Compatibility renderer.

If using the Compatibility renderer, consider using Sprite3D as an alternative for projecting decals onto (mostly) flat surfaces.

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

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

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

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

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

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

参见

The Godot demo projects repository contains a 3D decals demo.

如果你想在表面上写入任意 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 图层。 默认情况下,贴花会影响所有图层。 使用它可以指定哪些类型的对象接收贴花,哪些类型不接收贴花。 这个功能特别有用,你可以确保动态对象不会意外收到针对其下方地形的贴花。

贴花的渲染顺序

默认情况下,贴花的渲染顺序是基于他们的: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 属性。 这将使远处的贴花在远离相机时淡出(并且可能对最终场景渲染几乎没有影响)。 使用节点组,你还可以根据用户配置防止生成非必要的装饰贴花。

The way decals are rendered also has an impact on performance. The Rendering > Textures > Decals > Filter advanced project setting lets you control how decal textures should be filtered. Nearest/Linear does not use mipmaps. However, decals will look grainy at a distance. Nearest/Linear Mipmaps will look smoother at a distance, but decals will look blurry when viewed from oblique angles. This can be resolved by using Nearest/Linear Mipmaps Anisotropic, which provides the highest quality, but is also slower to render.

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

限制

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

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

When using the Forward+ renderer, Godot uses a clustering approach for decal rendering. As many decals as desired can be added (as long as performance allows). However, there's still a default limit of 512 clustered elements that can be present in the current camera view. A clustered element is an omni light, a spot light, a decal or a reflection probe. This limit can be increased by adjusting Max Clustered Elements in Project Settings > Rendering > Limits > Cluster Builder.

When using the Mobile renderer, only 8 decals can be applied on each individual Mesh resource. If there are more decals affecting a single mesh, not all of them will be rendered on the mesh.