Up to date

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

使用体素全局光照

VoxelGI 是一种完全实时的全局光照形式,旨在用于中小型 3D 场景。VoxelGI 对 GPU 的要求相当高,因此最好在针对专用显卡时使用。

重要

VoxelGI 仅在使用 Forward+ 渲染后端时才受支持,而不是移动端 Forward 或兼容性后端。

参见

不确定 VoxelGI 是否适合你的需求?请参阅 我应该使用哪种全局光照技术? 以了解 Godot 4 中可用的 GI 技术的比较。

视觉比较

VoxelGI 已禁用。

VoxelGI 已禁用。

VoxelGI 已启用。

VoxelGI 已启用。

设置 VoxelGI

  1. 确保在导入停靠面板中将灯光烘焙选项设置为 静态静态光照贴图 的情况下导入静态级别的几何体。对于手动添加的 MeshInstance3D 节点,请确保在检查器中将 全局光照 > 模式 属性设置为 静态

  2. 在场景树面板里创建 VoxelGI 节点。

  3. 通过在 3D 视口中拖动操纵小工具,将 VoxelGI 节点移动到要覆盖的区域的中心。然后,通过在 3D 视口中拖动红色点(或在检查器中输入值)来调整 VoxelGI 的范围。确保 VoxelGI 的范围不会过大,否则质量会受到影响。

  4. 选择 VoxelGI 节点,然后单击 3D 编辑器视口顶部的 烘焙 。这将至少需要几秒钟才能完成(取决于 VoxelGI 细分的数量和场景复杂性)。

如果 VoxelGI 范围内至少包含一个网格的全局光照模式设置为 静态 ,则应看到场景中出现间接光照。

备注

为了避免在文本场景文件中包含大量的二进制数据,确保 VoxelGIData 资源*始终*保存到外部的二进制文件中。该文件必须使用 .res (二进制资源)扩展名保存,而不是 .tres (文本资源)。使用外部的二进制资源来保存 VoxelGIData 将保持你的文本场景文件小巧,同时确保加载和保存的速度快。

VoxelGI 节点属性

烘焙前,可以在 VoxelGI 节点的检查器中调整以下属性:

  • Subdiv: (细分曲面)值越高,间接光照越精确,但代价是性能更低,烘焙时间更长,存储要求更高。

  • Extents: (范围)表示应在其中烘焙间接光照的区域的大小。范围以 VoxelGI 节点的原点为中心。

可以在 VoxelGI 节点烘焙后包含的 VoxelGIData 资源 中调整以下属性:

  • Dynamic Range: (动态范围)可以在间接光照中表示的最大亮度。较高的值可以表示更亮的间接光,但代价是精度较低(这可能导致可见条纹)。如果有疑问,请保持不变。

  • Energy: (能量)间接光照的总能量。这也会影响由具有自发光材质的网格发射的直接光照的能量。

  • Bias: (偏置)在运行时添加到体素缓冲区中查找的可选偏置。这有助于避免自遮挡伪影。

  • Normal Bias: (法线偏置)类似于 Bias ,但通过表面法线偏移到体素缓冲区来查找。这也有助于避免自遮挡伪影。更高的值会减少非粗糙材料中可见的自反射,代价是更明显的漏光和更平坦的间接光照。要将隐藏自反射优先于光照质量,请将 Bias 设置为 0.0 ,并将 Normal Bias 的值设定在 1.02.0 之间。

  • Propagation: (传播)用于反弹间接光照的能量系数。更高的值将导致更明亮、更分散的光照(最终可能看起来过于平坦)。启用 Use Two Bounces 后,可能需要减少 Propagation 以补偿整体更亮的间接光照。

  • Use Two Bounces:(使用二次反弹)如果启用,光照将反射两次,而不是一次。这会产生更逼真的间接照明效果,并使间接照明在反射目标物体上也可见。启用此功能通常不会带来很大的运行压力。

  • Interior:(内部)如果启用,VoxelGI 将忽略环境天空照明。此功能最好在室内场景中启用,以避免光线从外部环境中泄漏进来影响最终效果。

VoxelGI 与灯光和对象的交互

为了确保在使用VoxelGI时获得正确的视觉效果,必须根据网格和灯光在场景中的*用途*(静态或动态)来配置它们的全局照明属性。

网格有 3 种全局光照模式可选:

  • Disabled:(禁用)VoxelGI 烘焙时不考虑该网格。网格仍会接收场景中的间接光照,但是不会贡献场景中的间接光照。

  • Static(默认):(静态)VoxelGI 将依据网格烘焙模型。网格将即时接受为场景提供间接照明。如果网格在烘焙后需要任何方式的更改,则必须再次烘焙 VoxelGI 节点。否则,间接照明效果将会显示的不正常。

  • Dynamic:(动态)VoxelGI 烘焙将忽略网格,但它仍然会即时接收为场景提供间接照明。此选项对于 Static 相比要慢得多。建议仅在游戏过程中会发生明显变化的大型网格上使用 Dynamic 全局照明模式。

此外,对于灯光(DirectionalLight3D、OmniLight3D 和 SpotLight3D),还有三种可用的烘焙模式:

  • Disabled:(禁用)烘焙 VoxelGI 时不会考虑该灯光。该灯光也不会参与场景的间接光照。

  • Static:(静态)VoxelGI 烘焙将启用光线。灯光会为场景提供间接照明。如果在烘焙后以任何方式更改了灯光,则必须再次烘焙 VoxelGI 节点,否则间接照明将看起来不正常。如果再出现问题,请使用此模式进行水平照明。

  • Dynamic(默认):(动态)VoxelGI 烘焙会忽略灯光,但它仍会实时为场景提供间接照明。此选项与 Static 相比速度较慢。建议仅在游戏过程中会发生显著变化的灯光上使用 Dynamic 全局照明模式。

备注

光发射的间接能量取决于它的颜色、能量以及间接能量特性。若要使特定灯光或多或少地发射间接能量而不影响灯光发射的直接光量,请调整 Light3D 检查器中的 Indirect Energy 属性。

调整 VoxelGI 的性能与质量

由于VoxelGI的要求相对较高,因此它会在较新发布的专业GPU的系统上有好的表现力。在较旧GPU和集成图形上,需要调整设置以获得相对好些的性能。

在“项目设置”的 渲染 > 全局光照 中,还可以通过两种方式调整 VoxelGI 质量:

  • 体素 GI > 质量:如果将其设置为 Low 而不是 High,体素锥追踪将只使用 4 个采样点而不是 6 个。这样可以加快渲染速度,但会导致环境遮蔽效果不太明显。

  • GI > 半分辨率:如果启用,VoxelGI 和 SDFGI 将减半分辨率渲染 GI 缓冲区。 例如,在 3840×2160 分辨率时,GI 缓冲区将用 1920×1080 分辨率计算。 启用该选项可节省大量 GPU 运算时间,但它可能会在边缘周围引入可见的锯齿。

注意,必须先启用项目设置对话框的高级开关,才会显示上述设置项。

此外,可以通过隐藏 VoxelGI 节点来完全禁用 VoxelGI 。这可以用于比较目的或提高在低端系统的表现。

减少 VoxelGI 光照泄漏和伪影

烘焙VoxelGI后,你可能会注意到水平几何体中的某些点处存在间接光泄漏。这可以通过以下几种方式进行补救:

  • 对于漏光和伪影,请尝试移动或旋转VoxelGI节点,然后再次烘焙它。

  • 一般来说,为了防止漏光,请确保你的关卡几何体完全密封。这最好在用于设计标高的三维建模软件中完成,但也可以使用全局照明模式设置为 Static 的图源 MeshInstance3D 节点。

  • 为了解决薄几何体的漏光问题,建议将有问题的几何体加厚。如果不可行,请添加一个图元 MeshInstance3D 节点,其全局照明模式设置为 Static。再次烘焙体素 GI,然后隐藏图元 MeshInstance3D 节点(VoxelGI 仍将启用该节点)。为了获得最佳结果,MeshInstance3D 应具有颜色与原始薄几何体匹配的材质。

  • 为了解决在反射表面上可能出现的伪影问题,可以尝试增加上述 VoxelGIData 资源中的 Bias 和/或 Normal Bias。但不要将这些值增加得太高,否则会导致光线泄漏更加明显。

If you notice VoxelGI nodes popping in and out of existence as the camera moves, this is most likely because the engine is rendering too many VoxelGI instances at once. Godot is limited to rendering 8 VoxelGI nodes at once, which means up to 8 instances can be in the camera view before some of them will start flickering.

Additionally, for performance reasons, Godot can only blend between 2 VoxelGI nodes at a given pixel on the screen. If you have more than 2 VoxelGI nodes overlapping, global illumination may appear to flicker as the camera moves or rotates.