使用贴花

备注

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

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

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

While decals cannot add actual geometry detail onto the projected surface, decals can still make use of physically-based rendering to provide similar properties to full-blown PBR materials.

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

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

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

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

参见

如果想要参考一个示例项目, 可以参考该OS测试demo:https://github.com/godotengine/godot-demo-projects/tree/master/misc/os_test

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

使用案例

静态装饰

Sometimes, the fastest way to add texture detail to a scene is to use decals. This is especially the case for organic detail, such as patches of dirt or sand scattered on a large surface. Decals can help break up texture repetition in scenes and make patterns look more natural. On a smaller scale, decals can also be used to create detail variations for objects. For example, decals can be used to add nuts and bolts on top of hard-surface geometry.

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

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

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

动态游戏元素

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

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

Blob shadows

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

由于斑点阴影,动态对象仍然可以投射近似阴影。 这不仅有助于场景中的深度感知,而且还可以成为一种游戏元素,尤其是在 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: The emission texture to use for the decal. Unlike Albedo, this texture will appear to glow in the dark.

参数

  • 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: The curve over which the decal will fade as the surface gets further from the center of the AABB (towards the decal’s projection angle). Only positive values are valid.

  • Lower Fade: The curve over which the decal will fade as the surface gets further from the center of the AABB (away from the decal’s projection angle). Only positive values are valid.

距离淡出

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

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

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

Cull Mask(剔除遮罩)

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

调整性能和质量

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

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

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

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

限制

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

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

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

在使用Forward Mobile后端时,每个单独的Mesh 资源上只能应用8个贴花。如果单个mesh上有更多贴花,它们并不会全部渲染在mesh上。

Previous Next


© 版权所有 2014-present Juan Linietsky, Ariel Manzur and the Godot community (CC BY 3.0). Revision b1c660f7.

Built with Sphinx using a theme provided by Read the Docs.