You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-17 14:11:06 +00:00
Implement occlusion culling
Added an occlusion culling system with support for static occluder meshes. It can be enabled via `Project Settings > Rendering > Occlusion Culling > Use Occlusion Culling`. Occluders are defined via the new `Occluder3D` resource and instanced using the new `OccluderInstance3D` node. The occluders can also be automatically baked from a scene using the built-in editor plugin.
This commit is contained in:
@@ -2368,6 +2368,9 @@ void Node3DEditorViewport::_project_settings_changed() {
|
||||
viewport->set_screen_space_aa(Viewport::ScreenSpaceAA(ssaa_mode));
|
||||
const bool use_debanding = GLOBAL_GET("rendering/anti_aliasing/quality/use_debanding");
|
||||
viewport->set_use_debanding(use_debanding);
|
||||
|
||||
const bool use_occlusion_culling = GLOBAL_GET("rendering/occlusion_culling/use_occlusion_culling");
|
||||
viewport->set_use_occlusion_culling(use_occlusion_culling);
|
||||
}
|
||||
|
||||
void Node3DEditorViewport::_notification(int p_what) {
|
||||
@@ -3071,7 +3074,8 @@ void Node3DEditorViewport::_menu_option(int p_option) {
|
||||
case VIEW_DISPLAY_DEBUG_CLUSTER_OMNI_LIGHTS:
|
||||
case VIEW_DISPLAY_DEBUG_CLUSTER_SPOT_LIGHTS:
|
||||
case VIEW_DISPLAY_DEBUG_CLUSTER_DECALS:
|
||||
case VIEW_DISPLAY_DEBUG_CLUSTER_REFLECTION_PROBES: {
|
||||
case VIEW_DISPLAY_DEBUG_CLUSTER_REFLECTION_PROBES:
|
||||
case VIEW_DISPLAY_DEBUG_OCCLUDERS: {
|
||||
static const int display_options[] = {
|
||||
VIEW_DISPLAY_NORMAL,
|
||||
VIEW_DISPLAY_WIREFRAME,
|
||||
@@ -3097,6 +3101,7 @@ void Node3DEditorViewport::_menu_option(int p_option) {
|
||||
VIEW_DISPLAY_DEBUG_CLUSTER_SPOT_LIGHTS,
|
||||
VIEW_DISPLAY_DEBUG_CLUSTER_DECALS,
|
||||
VIEW_DISPLAY_DEBUG_CLUSTER_REFLECTION_PROBES,
|
||||
VIEW_DISPLAY_DEBUG_OCCLUDERS,
|
||||
VIEW_MAX
|
||||
};
|
||||
static const Viewport::DebugDraw debug_draw_modes[] = {
|
||||
@@ -3124,6 +3129,7 @@ void Node3DEditorViewport::_menu_option(int p_option) {
|
||||
Viewport::DEBUG_DRAW_CLUSTER_SPOT_LIGHTS,
|
||||
Viewport::DEBUG_DRAW_CLUSTER_DECALS,
|
||||
Viewport::DEBUG_DRAW_CLUSTER_REFLECTION_PROBES,
|
||||
Viewport::DEBUG_DRAW_OCCLUDERS,
|
||||
};
|
||||
|
||||
int idx = 0;
|
||||
@@ -3173,6 +3179,7 @@ void Node3DEditorViewport::_init_gizmo_instance(int p_idx) {
|
||||
RS::get_singleton()->instance_set_visible(move_gizmo_instance[i], false);
|
||||
RS::get_singleton()->instance_geometry_set_cast_shadows_setting(move_gizmo_instance[i], RS::SHADOW_CASTING_SETTING_OFF);
|
||||
RS::get_singleton()->instance_set_layer_mask(move_gizmo_instance[i], layer);
|
||||
RS::get_singleton()->instance_geometry_set_flag(move_gizmo_instance[i], RS::INSTANCE_FLAG_IGNORE_OCCLUSION_CULLING, true);
|
||||
|
||||
move_plane_gizmo_instance[i] = RS::get_singleton()->instance_create();
|
||||
RS::get_singleton()->instance_set_base(move_plane_gizmo_instance[i], spatial_editor->get_move_plane_gizmo(i)->get_rid());
|
||||
@@ -3180,6 +3187,7 @@ void Node3DEditorViewport::_init_gizmo_instance(int p_idx) {
|
||||
RS::get_singleton()->instance_set_visible(move_plane_gizmo_instance[i], false);
|
||||
RS::get_singleton()->instance_geometry_set_cast_shadows_setting(move_plane_gizmo_instance[i], RS::SHADOW_CASTING_SETTING_OFF);
|
||||
RS::get_singleton()->instance_set_layer_mask(move_plane_gizmo_instance[i], layer);
|
||||
RS::get_singleton()->instance_geometry_set_flag(move_plane_gizmo_instance[i], RS::INSTANCE_FLAG_IGNORE_OCCLUSION_CULLING, true);
|
||||
|
||||
rotate_gizmo_instance[i] = RS::get_singleton()->instance_create();
|
||||
RS::get_singleton()->instance_set_base(rotate_gizmo_instance[i], spatial_editor->get_rotate_gizmo(i)->get_rid());
|
||||
@@ -3187,6 +3195,7 @@ void Node3DEditorViewport::_init_gizmo_instance(int p_idx) {
|
||||
RS::get_singleton()->instance_set_visible(rotate_gizmo_instance[i], false);
|
||||
RS::get_singleton()->instance_geometry_set_cast_shadows_setting(rotate_gizmo_instance[i], RS::SHADOW_CASTING_SETTING_OFF);
|
||||
RS::get_singleton()->instance_set_layer_mask(rotate_gizmo_instance[i], layer);
|
||||
RS::get_singleton()->instance_geometry_set_flag(rotate_gizmo_instance[i], RS::INSTANCE_FLAG_IGNORE_OCCLUSION_CULLING, true);
|
||||
|
||||
scale_gizmo_instance[i] = RS::get_singleton()->instance_create();
|
||||
RS::get_singleton()->instance_set_base(scale_gizmo_instance[i], spatial_editor->get_scale_gizmo(i)->get_rid());
|
||||
@@ -3194,6 +3203,7 @@ void Node3DEditorViewport::_init_gizmo_instance(int p_idx) {
|
||||
RS::get_singleton()->instance_set_visible(scale_gizmo_instance[i], false);
|
||||
RS::get_singleton()->instance_geometry_set_cast_shadows_setting(scale_gizmo_instance[i], RS::SHADOW_CASTING_SETTING_OFF);
|
||||
RS::get_singleton()->instance_set_layer_mask(scale_gizmo_instance[i], layer);
|
||||
RS::get_singleton()->instance_geometry_set_flag(scale_gizmo_instance[i], RS::INSTANCE_FLAG_IGNORE_OCCLUSION_CULLING, true);
|
||||
|
||||
scale_plane_gizmo_instance[i] = RS::get_singleton()->instance_create();
|
||||
RS::get_singleton()->instance_set_base(scale_plane_gizmo_instance[i], spatial_editor->get_scale_plane_gizmo(i)->get_rid());
|
||||
@@ -3201,6 +3211,7 @@ void Node3DEditorViewport::_init_gizmo_instance(int p_idx) {
|
||||
RS::get_singleton()->instance_set_visible(scale_plane_gizmo_instance[i], false);
|
||||
RS::get_singleton()->instance_geometry_set_cast_shadows_setting(scale_plane_gizmo_instance[i], RS::SHADOW_CASTING_SETTING_OFF);
|
||||
RS::get_singleton()->instance_set_layer_mask(scale_plane_gizmo_instance[i], layer);
|
||||
RS::get_singleton()->instance_geometry_set_flag(scale_plane_gizmo_instance[i], RS::INSTANCE_FLAG_IGNORE_OCCLUSION_CULLING, true);
|
||||
}
|
||||
|
||||
// Rotation white outline
|
||||
@@ -3210,6 +3221,7 @@ void Node3DEditorViewport::_init_gizmo_instance(int p_idx) {
|
||||
RS::get_singleton()->instance_set_visible(rotate_gizmo_instance[3], false);
|
||||
RS::get_singleton()->instance_geometry_set_cast_shadows_setting(rotate_gizmo_instance[3], RS::SHADOW_CASTING_SETTING_OFF);
|
||||
RS::get_singleton()->instance_set_layer_mask(rotate_gizmo_instance[3], layer);
|
||||
RS::get_singleton()->instance_geometry_set_flag(rotate_gizmo_instance[3], RS::INSTANCE_FLAG_IGNORE_OCCLUSION_CULLING, true);
|
||||
}
|
||||
|
||||
void Node3DEditorViewport::_finish_gizmo_instances() {
|
||||
@@ -4043,6 +4055,7 @@ Node3DEditorViewport::Node3DEditorViewport(Node3DEditor *p_spatial_editor, Edito
|
||||
display_submenu->add_radio_check_item(TTR("Spot Light Cluster"), VIEW_DISPLAY_DEBUG_CLUSTER_SPOT_LIGHTS);
|
||||
display_submenu->add_radio_check_item(TTR("Decal Cluster"), VIEW_DISPLAY_DEBUG_CLUSTER_DECALS);
|
||||
display_submenu->add_radio_check_item(TTR("Reflection Probe Cluster"), VIEW_DISPLAY_DEBUG_CLUSTER_REFLECTION_PROBES);
|
||||
display_submenu->add_radio_check_item(TTR("Occlusion Culling Buffer"), VIEW_DISPLAY_DEBUG_OCCLUDERS);
|
||||
|
||||
display_submenu->set_name("display_advanced");
|
||||
view_menu->get_popup()->add_submenu_item(TTR("Display Advanced..."), "display_advanced", VIEW_DISPLAY_ADVANCED);
|
||||
@@ -4625,6 +4638,7 @@ Object *Node3DEditor::_get_editor_data(Object *p_what) {
|
||||
si->sbox_instance,
|
||||
RS::SHADOW_CASTING_SETTING_OFF);
|
||||
RS::get_singleton()->instance_set_layer_mask(si->sbox_instance, 1 << Node3DEditorViewport::MISC_TOOL_LAYER);
|
||||
RS::get_singleton()->instance_geometry_set_flag(si->sbox_instance, RS::INSTANCE_FLAG_IGNORE_OCCLUSION_CULLING, true);
|
||||
si->sbox_instance_xray = RenderingServer::get_singleton()->instance_create2(
|
||||
selection_box_xray->get_rid(),
|
||||
sp->get_world_3d()->get_scenario());
|
||||
@@ -4632,6 +4646,7 @@ Object *Node3DEditor::_get_editor_data(Object *p_what) {
|
||||
si->sbox_instance_xray,
|
||||
RS::SHADOW_CASTING_SETTING_OFF);
|
||||
RS::get_singleton()->instance_set_layer_mask(si->sbox_instance_xray, 1 << Node3DEditorViewport::MISC_TOOL_LAYER);
|
||||
RS::get_singleton()->instance_geometry_set_flag(si->sbox_instance, RS::INSTANCE_FLAG_IGNORE_OCCLUSION_CULLING, true);
|
||||
|
||||
return si;
|
||||
}
|
||||
@@ -5403,6 +5418,7 @@ void Node3DEditor::_init_indicators() {
|
||||
|
||||
origin_instance = RenderingServer::get_singleton()->instance_create2(origin, get_tree()->get_root()->get_world_3d()->get_scenario());
|
||||
RS::get_singleton()->instance_set_layer_mask(origin_instance, 1 << Node3DEditorViewport::GIZMO_GRID_LAYER);
|
||||
RS::get_singleton()->instance_geometry_set_flag(origin_instance, RS::INSTANCE_FLAG_IGNORE_OCCLUSION_CULLING, true);
|
||||
|
||||
RenderingServer::get_singleton()->instance_geometry_set_cast_shadows_setting(origin_instance, RS::SHADOW_CASTING_SETTING_OFF);
|
||||
}
|
||||
@@ -5964,6 +5980,7 @@ void Node3DEditor::_init_grid() {
|
||||
RenderingServer::get_singleton()->instance_set_visible(grid_instance[c], grid_visible[a]);
|
||||
RenderingServer::get_singleton()->instance_geometry_set_cast_shadows_setting(grid_instance[c], RS::SHADOW_CASTING_SETTING_OFF);
|
||||
RS::get_singleton()->instance_set_layer_mask(grid_instance[c], 1 << Node3DEditorViewport::GIZMO_GRID_LAYER);
|
||||
RS::get_singleton()->instance_geometry_set_flag(grid_instance[c], RS::INSTANCE_FLAG_IGNORE_OCCLUSION_CULLING, true);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6465,6 +6482,7 @@ void Node3DEditor::_register_all_gizmos() {
|
||||
add_gizmo_plugin(Ref<Light3DGizmoPlugin>(memnew(Light3DGizmoPlugin)));
|
||||
add_gizmo_plugin(Ref<AudioStreamPlayer3DGizmoPlugin>(memnew(AudioStreamPlayer3DGizmoPlugin)));
|
||||
add_gizmo_plugin(Ref<MeshInstance3DGizmoPlugin>(memnew(MeshInstance3DGizmoPlugin)));
|
||||
add_gizmo_plugin(Ref<OccluderInstance3DGizmoPlugin>(memnew(OccluderInstance3DGizmoPlugin)));
|
||||
add_gizmo_plugin(Ref<SoftBody3DGizmoPlugin>(memnew(SoftBody3DGizmoPlugin)));
|
||||
add_gizmo_plugin(Ref<Sprite3DGizmoPlugin>(memnew(Sprite3DGizmoPlugin)));
|
||||
add_gizmo_plugin(Ref<Skeleton3DGizmoPlugin>(memnew(Skeleton3DGizmoPlugin)));
|
||||
@@ -7340,6 +7358,7 @@ void EditorNode3DGizmoPlugin::create_material(const String &p_name, const Color
|
||||
material->set_shading_mode(StandardMaterial3D::SHADING_MODE_UNSHADED);
|
||||
material->set_transparency(StandardMaterial3D::TRANSPARENCY_ALPHA);
|
||||
material->set_render_priority(StandardMaterial3D::RENDER_PRIORITY_MIN + 1);
|
||||
material->set_cull_mode(StandardMaterial3D::CULL_DISABLED);
|
||||
|
||||
if (p_use_vertex_color) {
|
||||
material->set_flag(StandardMaterial3D::FLAG_ALBEDO_FROM_VERTEX_COLOR, true);
|
||||
|
||||
Reference in New Issue
Block a user