Attention: Here be dragons
This is the latest
(unstable) version of this documentation, which may document features
not available in or compatible with released stable versions of Godot.
Checking the stable version of the documentation...
OccluderInstance3D¶
为 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 ( int layer_number ) const |
|
void |
set_bake_mask_value ( int layer_number, bool value ) |
属性说明¶
int bake_mask = 4294967295
烘焙遮挡物时要考虑的可视层。只有其 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 ( Occluder3D value )
Occluder3D get_occluder ( )
这个 OccluderInstance3D 的遮挡器资源。要生成遮挡器资源,你可以先选中 OccluderInstance3D 节点,然后使用编辑器顶部的烘焙遮挡器按钮。
你还可以通过在“检查器”中为 occluder 属性添加新的 PolygonOccluder3D 资源来绘制自己的 2D 遮挡器多边形。
另外,你也可以选择要使用的基本遮挡器:QuadOccluder3D、BoxOccluder3D、SphereOccluder3D。
方法说明¶
bool get_bake_mask_value ( int layer_number ) const
返回是否启用了 bake_mask 的指定层,该层由给定的一个介于 1 和 32 之间的 layer_number
指定。
void set_bake_mask_value ( int layer_number, bool value )
基于 value
,启用或禁用 bake_mask 中的指定层,该层由给定的一个介于 1 和 32 之间的 layer_number
指定。