OcclusionRender

继承: VisualRender < Item3D < Item < Object

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

描述

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

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

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

烘焙:选择一个OcclusionRender节点,然后使用3D编辑器顶部的烘焙封堵器按钮。只有不透明的材质会被考虑在内;透明材质(alpha混合或alpha测试)将被封堵器生成忽略。

注意:遮挡剔除只有在ProjectSettings.rendering/occlusion_culling/use_occlusion_cullingtrue时才有效。启用遮挡剔除对CPU有成本。只有在实际计划使用时才启用遮挡剔除。很少或没有对象遮挡视图的大型开放场景通常不会从遮挡剔除中受益太多。与遮挡剔除相比,大型开放场景通常更受益于网格LOD和可见性范围(GeometryRender.visibility_range_beginGeometryRender.visibility_range_end)。

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

属性

方法

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()

烘焙封堵器时要考虑的视觉层。只有VisualRender.layers与此bake_mask匹配的MeshRender才会包含在生成的封堵器网格中。默认情况下,封堵器烘焙会考虑所有具有不透明材质的对象。

为了提高性能并避免伪影,建议将动态对象、小对象和固定装置从烘焙过程中排除,方法是将它们移动到单独的视觉层,并在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完全禁用简化,但完全相同位置的顶点仍将被合并。网格也将被重新索引以减少顶点和索引的数量。

注意:这使用引擎盖下的meshotimizer库,类似于LOD生成。


Occluder3D occluder 🔗

OcclusionRender的封堵器资源。您可以通过选择OcclusionRender节点然后使用编辑器顶部的Bake Occelders按钮来生成封堵器资源。

您还可以通过在检查器中的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