Up to date

This page is up to date for Godot 4.2. If you still find outdated information, please open an issue.

体积雾和雾体积

备注

只有“集群 Forward”渲染后端支持体积雾,“Forward 移动”和“兼容”不支持。

环境和后期处理 中已经介绍过,Godot 支持的各种视觉效果中包含两种雾:传统(非体积)雾和体积雾。传统雾会影响整个场景,无法使用 雾着色器 进行自定义。

如果需要,体积雾可以和非体积雾一同使用。

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

  • 如何在 Godot 中设置体积雾。

  • 雾体积是什么,和“全局”体积雾有什么区别。

参见

你可以使用 体积雾演示项目 来查看体积雾的实际工作原理。

以下是传统雾(不与光照交互)和体积雾(能够与光照交互)之间的比较:

../../_images/volumetric_fog_comparison.png

体积雾属性

在 WorldEnvironment 节点的 Environment 资源中启用体积雾之后,可以编辑以下属性:

  • Density:密度。体积雾的基础指数密度。请将这个值设置为你想要的全局最低密度。可以在特定区域中使用 FogVolume 来增加或减少这个密度。设为 0.0 会禁用全局体积雾,但仍然可以在特定区域中使用 FogVolume 来显示体积雾。雾的渲染呈指数效果,和现实生活中一致。

  • Albedo:反照率。体积雾在与灯光交互时的颜色。雾的反照率接近于白色(Color(1, 1, 1, 1)),而烟的反照率要更暗一些。

  • Emission:自发光。体积雾发出的光。启用了自发光的体积雾并不会向其它表面发射光线。自发光常用于实现环境光。因为体积雾效果只使用单散射,所以雾需要有一点点自发光才能柔化阴影。

  • Emission Energy:自发光能量。体积雾发出的光的亮度。

  • GI Inject:GI 注入。对体积雾在全局光照中使用的反照率颜色强度进行缩放。设为 0.0 意味着全局光照不影响体积雾。设为大于 0.0 的值时对影响略有影响。

  • 各向异性(Anisotropy): 散射光穿过体积雾时的方向。 接近 1.0 的值意味着几乎所有光都向前散射。 接近 0.0 的值意味着光在各个方向上均匀散射。 接近 -1.0 的值意味着光大部分向后散射。 雾和薄雾将光线稍微向前散射,而烟雾则将光线均匀地向各个方向散射。

  • 长度(Length): 计算体积雾的距离。 增加以在更大范围内计算雾,减少以在不需要长范围时添加更多细节。 为了获得最佳质量的雾,请将其保持尽可能低。

  • 细节分布(Detail Spread): froxel 缓冲区长度上的大小分布。 较高的值会压缩 Froxels 使其更靠近相机,并将更多细节放置在更靠近相机的位置。

  • 环境注入(Ambient Inject): 缩放体积雾中使用的环境光的强度。 值 0.0 表示环境光不会影响体积雾。 当设置高于 0.0 时,性能成本很小。

  • 天空影响(Sky Affect:): 控制应在背景天空上绘制多少体积雾。 如果设置为 0.0 ,体积雾根本不会影响天空渲染(包括 FogVolumes)。

时间重投影 部分提供了两个附加属性:

  • 时间重投影 > 已启用: 在体积雾中启用时间重投影。 时间重投影将当前帧的体积雾与上一帧的体积雾混合以平滑锯齿状边缘。 性能成本很小,但它确实会导致移动 FogVolume 和 Light3D 出现“重影”并留下痕迹。 启用时间重投影时,尽量避免 FogVolume 或 Light3D 移动得太快。 短暂的动态照明效果应将**体积雾能量**设置为 0.0 以避免重影。

  • 时间重投影 > 数量: 最后一帧与当前帧的混合量。 数值越高,体积雾越平滑,但“重影”会更严重。 较低的值可减少重影,但会导致每帧时间抖动变得可见。

备注

与非体积雾不同,体积雾具有 有限 范围。 这意味着体积雾无法完全覆盖一个大世界,因为它最终将停止在远处渲染。

如果你希望对玩家隐藏较远的区域,建议同时启用非体积雾和体积雾,并相应地调整其密度。

光与体积雾的交互

为了模拟现实生活中的雾光散射行为,所有光类型都将与体积雾相互作用。 每个灯光对体积雾的影响程度可以使用每个灯光的 体积雾能量 属性进行调整。 在灯光上启用阴影也会使这些阴影在体积雾中可见。

如果出于艺术原因不需要雾灯交互,可以通过在环境资源中将**体积雾 > 反照率**设置为纯黑色来全局禁用雾灯交互。 还可以通过将其**体积雾能量**设置为 0 来禁用特定灯光的雾灯交互。 这样做还可以通过从体积雾计算中排除光线来稍微提高性能。

使用体积雾作为体积照明解决方案

虽然物理上不准确,但可以调整体积雾的设置以用作体积 照明 解决方案。 这意味着环境中未照亮的部分将不再因雾而变暗,但光仍然能够使特定区域的雾变得更亮。

这可以通过将体积雾密度设置为最低允许值*大于零*( 0.0001 ),然后将灯光的“体积雾能量”属性增加到比默认值高得多的值来进行补偿。 10000100000 之间的值通常对此效果很好。

../../_images/volumetric_fog_lighting.png

平衡性能与质量

有一些项目设置可用于调整体积雾性能和质量:

  • 渲染 > 环境 > 体积雾 > 体积大小: 用于确定相机 X 轴和 Y 轴中 froxel 缓冲区大小的基本大小。 最终尺寸会根据屏幕的宽高比进行缩放,因此实际值可能与设置值有所不同。 设置较大的尺寸以获得更详细的雾,设置较小的尺寸以获得更好的性能。

  • 渲染 > 环境 > 体积雾 > 体积深度: 沿着体积雾的 froxel 缓冲区深度使用的切片数量。 数字越低效率越高,但可能会导致相机移动期间出现伪影。

  • 渲染 > 环境 > 体积雾 > 使用过滤器: 在集成之前启用体积雾效果的过滤。 这大大模糊了雾,减少了精细细节,但也平滑了粗糙的边缘和锯齿伪影。 当需要更多详细信息时禁用。

备注

Volumetric fog can cause banding to appear on the viewport, especially at higher density levels. See 带状颜色 for guidance on reducing banding.

使用雾体积进行局部体积雾

有时,你希望将雾限制在特定区域。 相反地,你可能希望拥有全局体积雾,但应将雾排除在某些区域之外。 这两种方法都可以使用 FogVolume 节点来遵循。

以下是使用 FogVolumes 的快速入门指南:

  • 确保在环境属性中启用 体积雾 。 如果不需要全局体积雾,请将其 密度 设置为 0.0

  • 创建自定义节点。

  • 将新的 FogMaterial 分配给 FogVolume 节点的 Material 属性。

  • 在 FogMaterial 中,将 密度 设置为正值以增加 FogVolume 内的密度,或设置为负值以从全局体积雾中减去密度。

  • 根据需要配置 FogVolume 的范围和形状。

备注

当相机移动或旋转时,薄雾体积可能会出现闪烁。 这可以通过增加 渲染 > 环境 > 体积雾 > 体积深度 项目设置(以性能成本)或通过减少环境体积雾属性中的长度(没有性能成本,但以性能为代价)来缓解。或者,可以将 FogVolume 做得更厚,并在 Material(材质)中使用较低的密度。

FogVolume 属性

  • Extents: (范围)当 ShapeEllipsoidConeCylinderBox 时 FogVolume 的大小。 如果 形状圆锥体圆柱体 ,圆锥体/圆柱体将被调整以适应范围。 不支持通过 Extents 属性对圆锥体/圆柱体形状进行非均匀缩放,但你可以改为缩放 FogVolume 节点。

  • Shape: (形状)FogVolume 的形状。 可以设置为 Ellipsoid (椭球体)、 Cone (锥体)、 Cylinder (圆柱体)、 Box (盒子)或 World (充当全局体积雾)。

  • Material: FogVolume 使用的材质。 可以是内置 FogMaterial 或自定义 ShaderMaterial ( 雾着色器 )。

Material 属性中选择 新建 FogMaterial 后,你可以在 FogMaterial 中调整以下属性:

  • Density: FogVolume 的密度。 密度较大的对象更加不透明,但可能会出现看起来像条纹的采样不足的伪影。 负值可用于从其他 FogVolume 或全局体积雾中减去雾。

  • Albedo: (反照率)FogVolume 的单散射颜色。 在内部,成员反照率转换为单散射,与其他 FogVolume 和全局体积雾的 Albedo 相加混合。

  • Emission: (自发光)FogVolume 发出的光的颜色。 发射的光不会在其他对象上投射光或阴影,但可用于独立于光源调制 FogVolume 的颜色。

  • Height Falloff: (高度衰减)随着世界空间中高度的增加,基于高度的雾密度降低的速率。 高衰减将导致急剧的过渡,而低衰减将导致更平滑的过渡。 值 0.0 会产生均匀密度的雾。 高度阈值由关联的 FogVolume 的高度确定。

  • Edge Fade: (边缘淡入淡出)FogVolume 边缘的硬度。 较高的值将导致较柔和的边缘,而较低的值将导致较硬的边缘。

  • Density Texture:(密度纹理)用于缩放 FogVolume 的成员密度的 3D 纹理。 这可用于通过任何类型的静态图案来改变 FogVolume 内的雾密度。 对于动画效果,请考虑使用自定义雾着色器。你可以在“导入”面板中更改其导入类型,将任何图像导入为 3D 纹理。

使用 3D 噪声密度纹理

从 Godot 4.1 开始,有一个 NoiseTexture3D 资源可用于按程序生成 3D 噪声。 这非常适合 FogMaterial 密度纹理,可以产生更详细的雾效果:

FogMaterial 比较(没有和有密度纹理的情况)

屏幕截图是在 体积大小 项目设置设置为 192 时拍摄的,以使高频细节在雾中更加明显。

为此,请选择 Density Texture 属性,然后选择 New NoiseTexture3D 。 单击此 NoiseTexture3D 对其进行编辑,然后单击 NoiseTexture3D 属性底部的 Noise 并选择 New FastNoiseLite 。 根据雾体积的尺寸调整噪波纹理的宽度、高度和深度。

为了提高性能,建议使用较小的纹理尺寸(64×64×64 或更低),因为在 FogVolume 中很难注意到高频细节。 如果你希望表示更详细的密度变化,则需要在项目设置中增加 渲染 > 环境 > 体积雾 > 体积大小 ,这会产生性能成本。

备注

NoiseTexture3D 的 颜色渐变 影响 FogMaterial 密度纹理,但由于仅对纹理的红色通道进行采样,因此只有颜色渐变的红色通道会影响生成的密度。

然而,使用颜色渐变将 不会 根据纹理对雾体积进行着色。 你需要使用读取 Texture3D 的自定义着色器来实现此目的。

自定义 FogVolume 着色器

本页面仅涵盖 FogMaterial 提供的内置设置。 如果你需要在 FogVolume 节点内自定义雾行为(例如创建动画雾),可以使用 雾着色器 自定义 FogVolume 节点的外观。

使用 Quad(四方形) 伪造体积雾

在某些情况下,最好使用专门配置的 QuadMeshes 作为体积雾的替代方案:

  • Quads 可与任何渲染方法配合使用,包括Forward+,移动和兼容模式。

  • Quads 不需要时间重投影即可看起来平滑,这使得它们适合快速移动的动态效果,例如激光。 它们还可以表示体积雾无法有效实现的小细节。

  • Quads 通常比体积雾具有更低的性能成本。

但这种方法有一些缺点:

  • 雾效果的衰减不太真实,尤其是当相机进入雾中时。

  • 当精灵重叠时,可能会出现透明度排序问题。

  • 若相机附近有很多精灵,性能不一定比体积雾好。

创建一个基于 QuadMesh 的雾精灵:

  1. Mesh 属性中创建一个具有 QuadMesh 资源的 MeshInstance3D 节点。 根据需要设置尺寸。

  2. 在网格的 Material 属性中创建一个新的 StandardMaterial3D。

  3. 在 StandardMaterial3D 中,将 着色> 着色模式 设置为 不着色公告板> 模式 设置为 启用 ,启用 临近淡出 并将 距离淡出 设置为 像素Alpha

  4. 反照率 > 纹理 设置为下面的纹理(右键单击并选择 另存为... ):

    ../../_images/volumetric_fog_quad_mesh_texture.webp
  5. 设置反照率纹理 之后 ,转到导入面板,选择纹理并将其压缩模式更改为 无损 以提高质量。

雾的颜色使用 反照率> 颜色 属性设置; 它的密度是使用颜色的 Alpha 通道设置的。 为了获得最佳结果,你必须根据 QuadMesh 的大小调整 临近淡出 > 距离距离淡出 > 最大距离

或者,如果你将四边形放置在其所有角都处于实体几何形状中的方式,则可以禁用公告板。 这对于相机无法进入的大型平面(例如无底坑)中的雾效非常有用。