@@ -53,8 +53,9 @@ CopyEffects::CopyEffects(bool p_prefer_raster_effects) {
5353 Vector<String> blur_modes;
5454 blur_modes.push_back (" \n #define MODE_MIPMAP\n " ); // BLUR_MIPMAP
5555 blur_modes.push_back (" \n #define MODE_GAUSSIAN_BLUR\n " ); // BLUR_MODE_GAUSSIAN_BLUR
56- blur_modes.push_back (" \n #define MODE_GAUSSIAN_GLOW\n " ); // BLUR_MODE_GAUSSIAN_GLOW
57- blur_modes.push_back (" \n #define MODE_GAUSSIAN_GLOW\n #define GLOW_USE_AUTO_EXPOSURE\n " ); // BLUR_MODE_GAUSSIAN_GLOW_AUTO_EXPOSURE
56+ blur_modes.push_back (" \n #define MODE_GLOW_GATHER\n " ); // BLUR_MODE_GAUSSIAN_GLOW_GATHER
57+ blur_modes.push_back (" \n #define MODE_GLOW_DOWNSAMPLE\n " ); // BLUR_MODE_GAUSSIAN_GLOW_DOWNSAMPLE
58+ blur_modes.push_back (" \n #define MODE_GLOW_UPSAMPLE\n " ); // BLUR_MODE_GAUSSIAN_GLOW_UPSAMPLE
5859 blur_modes.push_back (" \n #define MODE_COPY\n " ); // BLUR_MODE_COPY
5960 blur_modes.push_back (" \n #define MODE_SET_COLOR\n " ); // BLUR_MODE_SET_COLOR
6061
@@ -66,6 +67,15 @@ CopyEffects::CopyEffects(bool p_prefer_raster_effects) {
6667 blur_raster.pipelines [i].setup (blur_raster.shader .version_get_shader (blur_raster.shader_version , i), RD::RENDER_PRIMITIVE_TRIANGLES, RD::PipelineRasterizationState (), RD::PipelineMultisampleState (), RD::PipelineDepthStencilState (), RD::PipelineColorBlendState::create_disabled (), 0 );
6768 }
6869
70+ RD::SamplerState sampler_state;
71+ sampler_state.mag_filter = RD::SAMPLER_FILTER_LINEAR;
72+ sampler_state.min_filter = RD::SAMPLER_FILTER_LINEAR;
73+ sampler_state.repeat_u = RD::SAMPLER_REPEAT_MODE_CLAMP_TO_BORDER;
74+ sampler_state.repeat_v = RD::SAMPLER_REPEAT_MODE_CLAMP_TO_BORDER;
75+ sampler_state.border_color = RD::SAMPLER_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK;
76+
77+ blur_raster.glow_sampler = RD::get_singleton ()->sampler_create (sampler_state);
78+
6979 } else {
7080 // not used in clustered
7181 for (int i = 0 ; i < BLUR_MODE_MAX; i++) {
@@ -319,6 +329,7 @@ CopyEffects::~CopyEffects() {
319329
320330 if (prefer_raster_effects) {
321331 blur_raster.shader .version_free (blur_raster.shader_version );
332+ RD::get_singleton ()->free_rid (blur_raster.glow_sampler );
322333 cubemap_downsampler.raster_shader .version_free (cubemap_downsampler.shader_version );
323334 filter.raster_shader .version_free (filter.shader_version );
324335 roughness.raster_shader .version_free (roughness.shader_version );
@@ -733,8 +744,8 @@ void CopyEffects::gaussian_blur_raster(RID p_source_rd_texture, RID p_dest_textu
733744
734745 BlurRasterMode blur_mode = BLUR_MODE_GAUSSIAN_BLUR;
735746
736- blur_raster.push_constant .pixel_size [0 ] = 1.0 / float (p_size.x );
737- blur_raster.push_constant .pixel_size [1 ] = 1.0 / float (p_size.y );
747+ blur_raster.push_constant .dest_pixel_size [0 ] = 1.0 / float (p_size.x );
748+ blur_raster.push_constant .dest_pixel_size [1 ] = 1.0 / float (p_size.y );
738749
739750 // setup our uniforms
740751 RID default_sampler = material_storage->sampler_rd_get_default (RS::CANVAS_ITEM_TEXTURE_FILTER_LINEAR, RS::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED);
@@ -805,24 +816,22 @@ void CopyEffects::gaussian_glow(RID p_source_rd_texture, RID p_back_texture, con
805816 RD::get_singleton ()->compute_list_end ();
806817}
807818
808- void CopyEffects::gaussian_glow_raster (RID p_source_rd_texture, RID p_half_texture, RID p_dest_texture, float p_luminance_multiplier, const Size2i &p_size, float p_strength, bool p_first_pass, float p_luminance_cap, float p_exposure, float p_bloom, float p_hdr_bleed_threshold, float p_hdr_bleed_scale, RID p_auto_exposure, float p_auto_exposure_scale ) {
819+ void CopyEffects::gaussian_glow_downsample_raster (RID p_source_rd_texture, RID p_dest_texture, float p_luminance_multiplier, const Size2i &p_size, float p_strength, bool p_first_pass, float p_luminance_cap, float p_exposure, float p_bloom, float p_hdr_bleed_threshold, float p_hdr_bleed_scale) {
809820 ERR_FAIL_COND_MSG (!prefer_raster_effects, " Can't use the raster version of the gaussian glow with the clustered renderer." );
810821
811822 UniformSetCacheRD *uniform_set_cache = UniformSetCacheRD::get_singleton ();
812823 ERR_FAIL_NULL (uniform_set_cache);
813824 MaterialStorage *material_storage = MaterialStorage::get_singleton ();
814825 ERR_FAIL_NULL (material_storage);
815826
816- RID half_framebuffer = FramebufferCacheRD::get_singleton ()->get_cache (p_half_texture);
817827 RID dest_framebuffer = FramebufferCacheRD::get_singleton ()->get_cache (p_dest_texture);
818828
819829 memset (&blur_raster.push_constant , 0 , sizeof (BlurRasterPushConstant));
820830
821- BlurRasterMode blur_mode = p_first_pass && p_auto_exposure.is_valid () ? BLUR_MODE_GAUSSIAN_GLOW_AUTO_EXPOSURE : BLUR_MODE_GAUSSIAN_GLOW;
822- uint32_t base_flags = 0 ;
831+ BlurRasterMode blur_mode = p_first_pass ? BLUR_MODE_GAUSSIAN_GLOW_GATHER : BLUR_MODE_GAUSSIAN_GLOW_DOWNSAMPLE;
823832
824- blur_raster.push_constant .pixel_size [0 ] = 1.0 / float (p_size.x );
825- blur_raster.push_constant .pixel_size [1 ] = 1.0 / float (p_size.y );
833+ blur_raster.push_constant .source_pixel_size [0 ] = 1.0 / float (p_size.x );
834+ blur_raster.push_constant .source_pixel_size [1 ] = 1.0 / float (p_size.y );
826835
827836 blur_raster.push_constant .glow_strength = p_strength;
828837 blur_raster.push_constant .glow_bloom = p_bloom;
@@ -832,45 +841,62 @@ void CopyEffects::gaussian_glow_raster(RID p_source_rd_texture, RID p_half_textu
832841 blur_raster.push_constant .glow_white = 0 ; // actually unused
833842 blur_raster.push_constant .glow_luminance_cap = p_luminance_cap;
834843
835- blur_raster.push_constant .glow_auto_exposure_scale = p_auto_exposure_scale; // unused also
836-
837844 blur_raster.push_constant .luminance_multiplier = p_luminance_multiplier;
838845
839846 // setup our uniforms
840- RID default_sampler = material_storage->sampler_rd_get_default (RS::CANVAS_ITEM_TEXTURE_FILTER_LINEAR, RS::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED);
841-
842- RD::Uniform u_source_rd_texture (RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0 , Vector<RID>({ default_sampler, p_source_rd_texture }));
843- RD::Uniform u_half_texture (RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0 , Vector<RID>({ default_sampler, p_half_texture }));
847+ RD::Uniform u_source_rd_texture (RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0 , Vector<RID>({ blur_raster.glow_sampler , p_source_rd_texture }));
844848
845849 RID shader = blur_raster.shader .version_get_shader (blur_raster.shader_version , blur_mode);
846850 ERR_FAIL_COND (shader.is_null ());
847851
848- // HORIZONTAL
849- RD::DrawListID draw_list = RD::get_singleton ()->draw_list_begin (half_framebuffer);
850- RD::get_singleton ()->draw_list_bind_render_pipeline (draw_list, blur_raster.pipelines [blur_mode].get_render_pipeline (RD::INVALID_ID, RD::get_singleton ()->framebuffer_get_format (half_framebuffer)));
852+ RD::DrawListID draw_list = RD::get_singleton ()->draw_list_begin (dest_framebuffer);
853+ RD::get_singleton ()->draw_list_bind_render_pipeline (draw_list, blur_raster.pipelines [blur_mode].get_render_pipeline (RD::INVALID_ID, RD::get_singleton ()->framebuffer_get_format (dest_framebuffer)));
851854 RD::get_singleton ()->draw_list_bind_uniform_set (draw_list, uniform_set_cache->get_cache (shader, 0 , u_source_rd_texture), 0 );
852- if (p_auto_exposure.is_valid () && p_first_pass) {
853- RD::Uniform u_auto_exposure (RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0 , Vector<RID>({ default_sampler, p_auto_exposure }));
854- RD::get_singleton ()->draw_list_bind_uniform_set (draw_list, uniform_set_cache->get_cache (shader, 1 , u_auto_exposure), 1 );
855- }
856855
857- blur_raster.push_constant .flags = base_flags | BLUR_FLAG_HORIZONTAL | (p_first_pass ? BLUR_FLAG_GLOW_FIRST_PASS : 0 );
858856 RD::get_singleton ()->draw_list_set_push_constant (draw_list, &blur_raster.push_constant , sizeof (BlurRasterPushConstant));
859857
860858 RD::get_singleton ()->draw_list_draw (draw_list, false , 1u , 3u );
861859 RD::get_singleton ()->draw_list_end ();
860+ }
862861
863- blur_mode = BLUR_MODE_GAUSSIAN_GLOW;
862+ void CopyEffects::gaussian_glow_upsample_raster (RID p_source_rd_texture, RID p_dest_texture, RID p_blend_texture, float p_luminance_multiplier, const Size2i &p_source_size, const Size2i &p_dest_size, float p_level, float p_base_strength, bool p_use_debanding) {
863+ ERR_FAIL_COND_MSG (!prefer_raster_effects, " Can't use the raster version of the gaussian glow with the clustered renderer." );
864864
865- shader = blur_raster.shader .version_get_shader (blur_raster.shader_version , blur_mode);
865+ UniformSetCacheRD *uniform_set_cache = UniformSetCacheRD::get_singleton ();
866+ ERR_FAIL_NULL (uniform_set_cache);
867+ MaterialStorage *material_storage = MaterialStorage::get_singleton ();
868+ ERR_FAIL_NULL (material_storage);
869+
870+ RID dest_framebuffer = FramebufferCacheRD::get_singleton ()->get_cache (p_dest_texture);
871+
872+ memset (&blur_raster.push_constant , 0 , sizeof (BlurRasterPushConstant));
873+
874+ BlurRasterMode blur_mode = BLUR_MODE_GAUSSIAN_GLOW_UPSAMPLE;
875+
876+ blur_raster.push_constant .source_pixel_size [0 ] = 1.0 / float (p_source_size.x );
877+ blur_raster.push_constant .source_pixel_size [1 ] = 1.0 / float (p_source_size.y );
878+ blur_raster.push_constant .dest_pixel_size [0 ] = 1.0 / float (p_dest_size.x );
879+ blur_raster.push_constant .dest_pixel_size [1 ] = 1.0 / float (p_dest_size.y );
880+ blur_raster.push_constant .luminance_multiplier = p_luminance_multiplier;
881+ blur_raster.push_constant .level = p_level * 0.5 ;
882+ blur_raster.push_constant .glow_strength = p_base_strength;
883+
884+ uint32_t spec_constant = p_use_debanding ? 1 : 0 ;
885+ spec_constant |= p_level > 0.01 ? 2 : 0 ;
886+
887+ // setup our uniforms
888+ RID default_sampler = material_storage->sampler_rd_get_default (RS::CANVAS_ITEM_TEXTURE_FILTER_LINEAR, RS::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED);
889+ RD::Uniform u_source_rd_texture (RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0 , Vector<RID>({ default_sampler, p_source_rd_texture }));
890+ RD::Uniform u_blend_rd_texture (RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0 , Vector<RID>({ default_sampler, p_blend_texture }));
891+
892+ RID shader = blur_raster.shader .version_get_shader (blur_raster.shader_version , blur_mode);
866893 ERR_FAIL_COND (shader.is_null ());
867894
868- // VERTICAL
869- draw_list = RD::get_singleton ()->draw_list_begin (dest_framebuffer);
870- RD::get_singleton ()->draw_list_bind_render_pipeline (draw_list, blur_raster. pipelines [blur_mode]. get_render_pipeline (RD::INVALID_ID, RD::get_singleton ()-> framebuffer_get_format (dest_framebuffer)) );
871- RD::get_singleton ()->draw_list_bind_uniform_set (draw_list, uniform_set_cache->get_cache (shader, 0 , u_half_texture ), 0 );
895+ RD::DrawListID draw_list = RD::get_singleton ()-> draw_list_begin (dest_framebuffer);
896+ RD::get_singleton ()-> draw_list_bind_render_pipeline ( draw_list, blur_raster. pipelines [blur_mode]. get_render_pipeline (RD::INVALID_ID, RD::get_singleton ()->framebuffer_get_format (dest_framebuffer), false , 0 , spec_constant) );
897+ RD::get_singleton ()->draw_list_bind_uniform_set (draw_list, uniform_set_cache-> get_cache (shader, 0 , u_source_rd_texture), 0 );
898+ RD::get_singleton ()->draw_list_bind_uniform_set (draw_list, uniform_set_cache->get_cache (shader, 1 , u_blend_rd_texture ), 1 );
872899
873- blur_raster.push_constant .flags = base_flags;
874900 RD::get_singleton ()->draw_list_set_push_constant (draw_list, &blur_raster.push_constant , sizeof (BlurRasterPushConstant));
875901
876902 RD::get_singleton ()->draw_list_draw (draw_list, false , 1u , 3u );
@@ -925,8 +951,8 @@ void CopyEffects::make_mipmap_raster(RID p_source_rd_texture, RID p_dest_texture
925951
926952 BlurRasterMode mode = BLUR_MIPMAP;
927953
928- blur_raster.push_constant .pixel_size [0 ] = 1.0 / float (p_size.x );
929- blur_raster.push_constant .pixel_size [1 ] = 1.0 / float (p_size.y );
954+ blur_raster.push_constant .dest_pixel_size [0 ] = 1.0 / float (p_size.x );
955+ blur_raster.push_constant .dest_pixel_size [1 ] = 1.0 / float (p_size.y );
930956
931957 // setup our uniforms
932958 RID default_sampler = material_storage->sampler_rd_get_default (RS::CANVAS_ITEM_TEXTURE_FILTER_LINEAR, RS::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED);
0 commit comments