Skip to content

Commit

Permalink
Make the occlusion culling debug draw mode draw a translucent overlay
Browse files Browse the repository at this point in the history
This allows for easy, depth-aware navigation in the 3D editor while
being able to view which meshes are occluders and which meshes aren't.

Co-authored-by: myaaaaaaaaa <[email protected]>
  • Loading branch information
Calinou and myaaaaaaaaa committed Jul 21, 2023
1 parent f8dbed4 commit 63a59c9
Show file tree
Hide file tree
Showing 4 changed files with 37 additions and 6 deletions.
30 changes: 26 additions & 4 deletions servers/rendering/renderer_rd/effects/copy_effects.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,7 @@ CopyEffects::CopyEffects(bool p_prefer_raster_effects) {
copy_modes.push_back("\n#define MULTIVIEW\n"); // COPY_TO_FB_MULTIVIEW
copy_modes.push_back("\n#define MULTIVIEW\n#define MODE_TWO_SOURCES\n"); // COPY_TO_FB_MULTIVIEW_WITH_DEPTH
copy_modes.push_back("\n#define MODE_SET_COLOR\n"); // COPY_TO_FB_SET_COLOR
copy_modes.push_back("\n#define MODE_OCCLUSION_CULLING_BUFFER\n"); // COPY_TO_FB_OCCLUSION_CULLING_BUFFER

copy_to_fb.shader.initialize(copy_modes);

Expand All @@ -117,11 +118,28 @@ CopyEffects::CopyEffects(bool p_prefer_raster_effects) {

copy_to_fb.shader_version = copy_to_fb.shader.version_create();

//use additive

for (int i = 0; i < COPY_TO_FB_MAX; i++) {
if (copy_to_fb.shader.is_variant_enabled(i)) {
copy_to_fb.pipelines[i].setup(copy_to_fb.shader.version_get_shader(copy_to_fb.shader_version, i), RD::RENDER_PRIMITIVE_TRIANGLES, RD::PipelineRasterizationState(), RD::PipelineMultisampleState(), RD::PipelineDepthStencilState(), RD::PipelineColorBlendState::create_disabled(), 0);
RD::PipelineColorBlendState blend_state;
if (i == COPY_TO_FB_OCCLUSION_CULLING_BUFFER) {
// Use additive blend mode.
RD::PipelineColorBlendState::Attachment ba;
ba.enable_blend = true;
ba.src_color_blend_factor = RD::BLEND_FACTOR_SRC_ALPHA;
ba.dst_color_blend_factor = RD::BLEND_FACTOR_ONE_MINUS_SRC_ALPHA;
ba.src_alpha_blend_factor = RD::BLEND_FACTOR_ONE;
ba.dst_alpha_blend_factor = RD::BLEND_FACTOR_ONE;
ba.color_blend_op = RD::BLEND_OP_ADD;
ba.alpha_blend_op = RD::BLEND_OP_MAXIMUM;

RD::PipelineColorBlendState blend_additive;
blend_additive.attachments.push_back(ba);
blend_state = blend_additive;
} else {
blend_state = RD::PipelineColorBlendState::create_disabled();
}

copy_to_fb.pipelines[i].setup(copy_to_fb.shader.version_get_shader(copy_to_fb.shader_version, i), RD::RENDER_PRIMITIVE_TRIANGLES, RD::PipelineRasterizationState(), RD::PipelineMultisampleState(), RD::PipelineDepthStencilState(), blend_state, 0);
} else {
copy_to_fb.pipelines[i].clear();
}
Expand Down Expand Up @@ -539,7 +557,7 @@ void CopyEffects::copy_to_atlas_fb(RID p_source_rd_texture, RID p_dest_framebuff
RD::get_singleton()->draw_list_draw(draw_list, true);
}

void CopyEffects::copy_to_fb_rect(RID p_source_rd_texture, RID p_dest_framebuffer, const Rect2i &p_rect, bool p_flip_y, bool p_force_luminance, bool p_alpha_to_zero, bool p_srgb, RID p_secondary, bool p_multiview, bool p_alpha_to_one, bool p_linear) {
void CopyEffects::copy_to_fb_rect(RID p_source_rd_texture, RID p_dest_framebuffer, const Rect2i &p_rect, bool p_flip_y, bool p_force_luminance, bool p_alpha_to_zero, bool p_srgb, RID p_secondary, bool p_multiview, bool p_alpha_to_one, bool p_linear, bool p_occlusion_culling_buffer) {
UniformSetCacheRD *uniform_set_cache = UniformSetCacheRD::get_singleton();
ERR_FAIL_NULL(uniform_set_cache);
MaterialStorage *material_storage = MaterialStorage::get_singleton();
Expand Down Expand Up @@ -580,6 +598,10 @@ void CopyEffects::copy_to_fb_rect(RID p_source_rd_texture, RID p_dest_framebuffe
mode = p_secondary.is_valid() ? COPY_TO_FB_MULTIVIEW_WITH_DEPTH : COPY_TO_FB_MULTIVIEW;
} else {
mode = p_secondary.is_valid() ? COPY_TO_FB_COPY2 : COPY_TO_FB_COPY;

if (p_occlusion_culling_buffer) {
mode = COPY_TO_FB_OCCLUSION_CULLING_BUFFER;
}
}

RID shader = copy_to_fb.shader.version_get_shader(copy_to_fb.shader_version, mode);
Expand Down
3 changes: 2 additions & 1 deletion servers/rendering/renderer_rd/effects/copy_effects.h
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,7 @@ class CopyEffects {
COPY_TO_FB_MULTIVIEW_WITH_DEPTH,

COPY_TO_FB_SET_COLOR,
COPY_TO_FB_OCCLUSION_CULLING_BUFFER,
COPY_TO_FB_MAX,
};

Expand Down Expand Up @@ -326,7 +327,7 @@ class CopyEffects {
void copy_cubemap_to_panorama(RID p_source_cube, RID p_dest_panorama, const Size2i &p_panorama_size, float p_lod, bool p_is_array);
void copy_depth_to_rect(RID p_source_rd_texture, RID p_dest_framebuffer, const Rect2i &p_rect, bool p_flip_y = false);
void copy_depth_to_rect_and_linearize(RID p_source_rd_texture, RID p_dest_texture, const Rect2i &p_rect, bool p_flip_y, float p_z_near, float p_z_far);
void copy_to_fb_rect(RID p_source_rd_texture, RID p_dest_framebuffer, const Rect2i &p_rect, bool p_flip_y = false, bool p_force_luminance = false, bool p_alpha_to_zero = false, bool p_srgb = false, RID p_secondary = RID(), bool p_multiview = false, bool alpha_to_one = false, bool p_linear = false);
void copy_to_fb_rect(RID p_source_rd_texture, RID p_dest_framebuffer, const Rect2i &p_rect, bool p_flip_y = false, bool p_force_luminance = false, bool p_alpha_to_zero = false, bool p_srgb = false, RID p_secondary = RID(), bool p_multiview = false, bool alpha_to_one = false, bool p_linear = false, bool p_occlusion_culling_buffer = false);
void copy_to_atlas_fb(RID p_source_rd_texture, RID p_dest_framebuffer, const Rect2 &p_uv_rect, RD::DrawListID p_draw_list, bool p_flip_y = false, bool p_panorama = false);
void copy_raster(RID p_source_texture, RID p_dest_framebuffer);

Expand Down
2 changes: 1 addition & 1 deletion servers/rendering/renderer_rd/renderer_scene_render_rd.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -736,7 +736,7 @@ void RendererSceneRenderRD::_render_buffers_debug_draw(const RenderDataRD *p_ren
if (debug_draw == RS::VIEWPORT_DEBUG_DRAW_OCCLUDERS) {
if (p_render_data->occluder_debug_tex.is_valid()) {
Size2i rtsize = texture_storage->render_target_get_size(render_target);
copy_effects->copy_to_fb_rect(texture_storage->texture_get_rd_texture(p_render_data->occluder_debug_tex), texture_storage->render_target_get_rd_framebuffer(render_target), Rect2i(Vector2(), rtsize), true, false);
copy_effects->copy_to_fb_rect(texture_storage->texture_get_rd_texture(p_render_data->occluder_debug_tex), texture_storage->render_target_get_rd_framebuffer(render_target), Rect2i(Vector2(), rtsize), true, false, false, false, RID(), false, false, false, true);
}
}

Expand Down
8 changes: 8 additions & 0 deletions servers/rendering/renderer_rd/shaders/effects/copy_to_fb.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -193,6 +193,14 @@ void main() {
color.rgb = srgb_to_linear(color.rgb);
}

#ifdef MODE_OCCLUSION_CULLING_BUFFER
// Modify result to make the background partially visible,
// which helps with 3D navigation.
// This relies on the additive blend state from the `CopyEffects()` constructor.
color.a = (1.0 - color.r) * 0.5;
color.rgb = vec3(1.0, 0.0, 0.0);
#endif // MODE_OCCLUSION_CULLING_BUFFER

frag_color = color / params.luminance_multiplier;
#endif // MODE_SET_COLOR
}

0 comments on commit 63a59c9

Please sign in to comment.