OccluderInstance3D
继承: VisualInstance3D < Node3D < Node < Object
为 3D 节点提供遮挡剔除,可以提高封闭区域的性能。
描述
遮挡剔除可以通过隐藏被其他对象遮挡的几何体,来提高封闭/半开放区域的渲染性能。
遮挡剔除系统大多是静态的。OccluderInstance3D 可以在运行时移动或隐藏,但这样做会触发可能需要几帧的背景重新计算。建议仅偶尔移动 OccluderInstance3D(例如,出于程序生成目的),而不是每帧都这样做。
遮挡剔除系统的工作原理是,使用 Embree 在 CPU 上并行渲染遮挡物,将结果绘制到一个低分辨率缓冲区,然后使用它来单独剔除 3D 的节点。在 3D 编辑器中,可以通过选择 3D 视口左上角的透视图 > 高级调试… > 遮挡剔除缓冲区,来预览遮挡剔除缓冲区。可以在项目设置中调整遮挡剔除缓冲区的质量。
烘焙:选择一个 OccluderInstance3D 节点,然后使用 3D 编辑器顶部的烘焙遮挡物按钮。只考虑不透明的材质;遮挡器生成将忽略透明材质(alpha 混合或 alpha 测试)。
注意:遮挡剔除只有在 ProjectSettings.rendering/occlusion_culling/use_occlusion_culling 为 true
时才有效。启用遮挡剔除会消耗一定的 CPU。仅当确实打算使用遮挡剔除时才启用它。具有很少或没有物体,将阻挡视口的大型开放场景,通常不会从遮挡剔除中受益更多。与遮挡剔除相比,大型开放场景通常从网格 LOD 和可见性范围(GeometryInstance3D.visibility_range_begin 和 GeometryInstance3D.visibility_range_end)中受益更多。
注意:由于内存限制,Web 导出模板中默认不支持遮挡剔除。编译自定义 Web 导出模板时使用 module_raycast_enabled=yes
可以启用。
教程
属性
| ||
| ||
方法
get_bake_mask_value(layer_number: int) const | |
void | set_bake_mask_value(layer_number: int, value: bool) |
属性说明
烘焙遮挡物时要考虑的可视层。只有其 VisualInstance3D.layers 与该 bake_mask 匹配的 MeshInstance3D,才会被包含在生成的遮挡物网格中。默认情况下,所有具有不透明材质的对象,都将被考虑用于遮挡物烘焙。
为了提高性能并避免伪影,建议将动态对象、小对象和固定装置从烘焙过程中排除,方法是将它们移动到一个单独的可视层,并在 bake_mask 中排除该层。
float bake_simplification_distance = 0.1
🔗
用于简化生成的遮挡物多边形的简化距离(单位为 3D 单位)。更高的值会导致遮挡物网格的细节更少,这会提高性能但会降低剔除精度。
遮挡物几何体是在 CPU 上渲染的,因此保持其几何体尽可能简单很重要。由于缓冲区以低分辨率渲染,因此细节较少的遮挡网格通常仍能正常工作。默认值相当激进,因此如果遇到误报(即使相机可见的对象也被遮挡),可能必须降低该属性。0.01
的值将保守地起作用,并将保持几何体感知在遮挡剔除缓冲区中不受影响。根据场景的不同,与完全禁用简化相比,0.01
的值仍能显著简化网格。
将该属性设置为 0.0
将会完全禁用简化,但仍会合并位置完全相同的顶点。网格也将被重新索引以减少顶点和索引的数量。
注意:这在底层使用了 meshoptimizer 库,类似于 LOD 生成。
Occluder3D occluder 🔗
void set_occluder(value: Occluder3D)
Occluder3D get_occluder()
这个 OccluderInstance3D 的遮挡器资源。要生成遮挡器资源,你可以先选中 OccluderInstance3D 节点,然后使用编辑器顶部的烘焙遮挡器按钮。
你还可以通过在“检查器”中为 occluder 属性添加新的 PolygonOccluder3D 资源来绘制自己的 2D 遮挡器多边形。
另外,你也可以选择要使用的基本遮挡器:QuadOccluder3D、BoxOccluder3D、SphereOccluder3D。
方法说明
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
指定。