@@ -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