OccluderInstance3D

继承: VisualInstance3D < Node3D < Node < Object

为 3D 节点提供遮挡剔除,可以提高封闭区域的性能。

描述

遮挡剔除可以通过隐藏被其他对象遮挡的几何体,来提高封闭/半开放区域的渲染性能。

遮挡剔除系统大多是静态的。OccluderInstance3D 可以在运行时移动或隐藏,但这样做会触发可能需要几帧的背景重新计算。建议仅偶尔移动 OccluderInstance3D(例如,出于程序生成目的),而不是每帧都这样做。

遮挡剔除系统的工作原理是,使用 Embree 在 CPU 上并行渲染遮挡物,将结果绘制到一个低分辨率缓冲区,然后使用它来单独剔除 3D 的节点。在 3D 编辑器中,可以通过选择 3D 视口左上角的透视图 > 高级调试… > 遮挡剔除缓冲区,来预览遮挡剔除缓冲区。可以在项目设置中调整遮挡剔除缓冲区的质量。

烘焙:选择一个 OccluderInstance3D 节点,然后使用 3D 编辑器顶部的烘焙遮挡物按钮。只考虑不透明的材质;遮挡器生成将忽略透明材质(alpha 混合或 alpha 测试)。

注意:遮挡剔除只有在 ProjectSettings.rendering/occlusion_culling/use_occlusion_cullingtrue 时才有效。启用遮挡剔除会消耗一定的 CPU。仅当确实打算使用遮挡剔除时才启用它。具有很少或没有物体,将阻挡视口的大型开放场景,通常不会从遮挡剔除中受益更多。与遮挡剔除相比,大型开放场景通常从网格 LOD 和可见性范围(GeometryInstance3D.visibility_range_beginGeometryInstance3D.visibility_range_end)中受益更多。

注意:由于内存限制,Web 导出模板中默认不支持遮挡剔除。编译自定义 Web 导出模板时使用 module_raycast_enabled=yes 可以启用。

教程

属性

int

bake_mask

4294967295

float

bake_simplification_distance

0.1

Occluder3D

occluder

方法

bool

get_bake_mask_value(layer_number: int) const

void

set_bake_mask_value(layer_number: int, value: bool)


属性说明

int bake_mask = 4294967295 🔗

  • void set_bake_mask(value: int)

  • int get_bake_mask()

烘焙遮挡物时要考虑的可视层。只有其 VisualInstance3D.layers 与该 bake_mask 匹配的 MeshInstance3D,才会被包含在生成的遮挡物网格中。默认情况下,所有具有不透明材质的对象,都将被考虑用于遮挡物烘焙。

为了提高性能并避免伪影,建议将动态对象、小对象和固定装置从烘焙过程中排除,方法是将它们移动到一个单独的可视层,并在 bake_mask 中排除该层。


float bake_simplification_distance = 0.1 🔗

  • void set_bake_simplification_distance(value: float)

  • float get_bake_simplification_distance()

用于简化生成的遮挡物多边形的简化距离(单位为 3D 单位)。更高的值会导致遮挡物网格的细节更少,这会提高性能但会降低剔除精度。

遮挡物几何体是在 CPU 上渲染的,因此保持其几何体尽可能简单很重要。由于缓冲区以低分辨率渲染,因此细节较少的遮挡网格通常仍能正常工作。默认值相当激进,因此如果遇到误报(即使相机可见的对象也被遮挡),可能必须降低该属性。0.01 的值将保守地起作用,并将保持几何体感知在遮挡剔除缓冲区中不受影响。根据场景的不同,与完全禁用简化相比,0.01 的值仍能显著简化网格。

将该属性设置为 0.0 将会完全禁用简化,但仍会合并位置完全相同的顶点。网格也将被重新索引以减少顶点和索引的数量。

注意:这在底层使用了 meshoptimizer 库,类似于 LOD 生成。


Occluder3D occluder 🔗

这个 OccluderInstance3D 的遮挡器资源。要生成遮挡器资源,你可以先选中 OccluderInstance3D 节点,然后使用编辑器顶部的烘焙遮挡器按钮。

你还可以通过在“检查器”中为 occluder 属性添加新的 PolygonOccluder3D 资源来绘制自己的 2D 遮挡器多边形。

另外,你也可以选择要使用的基本遮挡器:QuadOccluder3DBoxOccluder3DSphereOccluder3D


方法说明

bool get_bake_mask_value(layer_number: int) const 🔗

返回是否启用了 bake_mask 的指定层,该层由给定的一个介于 1 和 32 之间的 layer_number 指定。


void set_bake_mask_value(layer_number: int, value: bool) 🔗

基于 value,启用或禁用 bake_mask 中的指定层,该层由给定的一个介于 1 和 32 之间的 layer_number 指定。