|
@@ -56,6 +56,7 @@ CopyEffects::CopyEffects(bool p_prefer_raster_effects) {
|
|
|
blur_modes.push_back("\n#define MODE_GAUSSIAN_GLOW\n"); // BLUR_MODE_GAUSSIAN_GLOW
|
|
|
blur_modes.push_back("\n#define MODE_GAUSSIAN_GLOW\n#define GLOW_USE_AUTO_EXPOSURE\n"); // BLUR_MODE_GAUSSIAN_GLOW_AUTO_EXPOSURE
|
|
|
blur_modes.push_back("\n#define MODE_COPY\n"); // BLUR_MODE_COPY
|
|
|
+ blur_modes.push_back("\n#define MODE_SET_COLOR\n"); // BLUR_MODE_SET_COLOR
|
|
|
|
|
|
blur_raster.shader.initialize(blur_modes);
|
|
|
memset(&blur_raster.push_constant, 0, sizeof(BlurRasterPushConstant));
|
|
@@ -105,6 +106,7 @@ CopyEffects::CopyEffects(bool p_prefer_raster_effects) {
|
|
|
copy_modes.push_back("\n#define MODE_TWO_SOURCES\n"); // COPY_TO_FB_COPY2
|
|
|
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_to_fb.shader.initialize(copy_modes);
|
|
|
|
|
@@ -535,7 +537,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) {
|
|
|
+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) {
|
|
|
UniformSetCacheRD *uniform_set_cache = UniformSetCacheRD::get_singleton();
|
|
|
ERR_FAIL_NULL(uniform_set_cache);
|
|
|
MaterialStorage *material_storage = MaterialStorage::get_singleton();
|
|
@@ -555,6 +557,9 @@ void CopyEffects::copy_to_fb_rect(RID p_source_rd_texture, RID p_dest_framebuffe
|
|
|
if (p_srgb) {
|
|
|
copy_to_fb.push_constant.srgb = true;
|
|
|
}
|
|
|
+ if (p_alpha_to_one) {
|
|
|
+ copy_to_fb.push_constant.alpha_to_one = true;
|
|
|
+ }
|
|
|
|
|
|
// setup our uniforms
|
|
|
RID default_sampler = material_storage->sampler_rd_get_default(RS::CANVAS_ITEM_TEXTURE_FILTER_LINEAR, RS::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED);
|
|
@@ -608,8 +613,6 @@ void CopyEffects::copy_raster(RID p_source_texture, RID p_dest_framebuffer) {
|
|
|
RD::get_singleton()->draw_list_bind_render_pipeline(draw_list, blur_raster.pipelines[BLUR_MODE_COPY].get_render_pipeline(RD::INVALID_ID, RD::get_singleton()->framebuffer_get_format(p_dest_framebuffer)));
|
|
|
RD::get_singleton()->draw_list_bind_uniform_set(draw_list, uniform_set_cache->get_cache(shader, 0, u_source_texture), 0);
|
|
|
RD::get_singleton()->draw_list_bind_index_array(draw_list, material_storage->get_quad_index_array());
|
|
|
-
|
|
|
- memset(&blur_raster.push_constant, 0, sizeof(BlurRasterPushConstant));
|
|
|
RD::get_singleton()->draw_list_set_push_constant(draw_list, &blur_raster.push_constant, sizeof(BlurRasterPushConstant));
|
|
|
|
|
|
RD::get_singleton()->draw_list_draw(draw_list, true);
|
|
@@ -641,7 +644,6 @@ void CopyEffects::gaussian_blur(RID p_source_rd_texture, RID p_texture, const Re
|
|
|
RID shader = copy.shader.version_get_shader(copy.shader_version, mode);
|
|
|
ERR_FAIL_COND(shader.is_null());
|
|
|
|
|
|
- //HORIZONTAL
|
|
|
RD::DrawListID compute_list = RD::get_singleton()->compute_list_begin();
|
|
|
RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, copy.pipelines[mode]);
|
|
|
RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 0, u_source_rd_texture), 0);
|
|
@@ -654,6 +656,43 @@ void CopyEffects::gaussian_blur(RID p_source_rd_texture, RID p_texture, const Re
|
|
|
RD::get_singleton()->compute_list_end();
|
|
|
}
|
|
|
|
|
|
+void CopyEffects::gaussian_blur_raster(RID p_source_rd_texture, RID p_dest_texture, const Rect2i &p_region, const Size2i &p_size) {
|
|
|
+ ERR_FAIL_COND_MSG(!prefer_raster_effects, "Can't use the raster version of the gaussian blur with the clustered renderer.");
|
|
|
+
|
|
|
+ UniformSetCacheRD *uniform_set_cache = UniformSetCacheRD::get_singleton();
|
|
|
+ ERR_FAIL_NULL(uniform_set_cache);
|
|
|
+ MaterialStorage *material_storage = MaterialStorage::get_singleton();
|
|
|
+ ERR_FAIL_NULL(material_storage);
|
|
|
+
|
|
|
+ RID dest_framebuffer = FramebufferCacheRD::get_singleton()->get_cache(p_dest_texture);
|
|
|
+
|
|
|
+ memset(&blur_raster.push_constant, 0, sizeof(BlurRasterPushConstant));
|
|
|
+
|
|
|
+ BlurRasterMode blur_mode = BLUR_MODE_GAUSSIAN_BLUR;
|
|
|
+
|
|
|
+ blur_raster.push_constant.pixel_size[0] = 1.0 / float(p_size.x);
|
|
|
+ blur_raster.push_constant.pixel_size[1] = 1.0 / float(p_size.y);
|
|
|
+
|
|
|
+ // setup our uniforms
|
|
|
+ RID default_sampler = material_storage->sampler_rd_get_default(RS::CANVAS_ITEM_TEXTURE_FILTER_LINEAR, RS::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED);
|
|
|
+
|
|
|
+ RD::Uniform u_source_rd_texture(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ default_sampler, p_source_rd_texture }));
|
|
|
+
|
|
|
+ RID shader = blur_raster.shader.version_get_shader(blur_raster.shader_version, blur_mode);
|
|
|
+ ERR_FAIL_COND(shader.is_null());
|
|
|
+
|
|
|
+ RD::DrawListID draw_list = RD::get_singleton()->draw_list_begin(dest_framebuffer, RD::INITIAL_ACTION_KEEP, RD::FINAL_ACTION_READ, RD::INITIAL_ACTION_KEEP, RD::FINAL_ACTION_DISCARD);
|
|
|
+ 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)));
|
|
|
+ RD::get_singleton()->draw_list_bind_uniform_set(draw_list, uniform_set_cache->get_cache(shader, 0, u_source_rd_texture), 0);
|
|
|
+
|
|
|
+ RD::get_singleton()->draw_list_bind_index_array(draw_list, material_storage->get_quad_index_array());
|
|
|
+
|
|
|
+ RD::get_singleton()->draw_list_set_push_constant(draw_list, &blur_raster.push_constant, sizeof(BlurRasterPushConstant));
|
|
|
+
|
|
|
+ RD::get_singleton()->draw_list_draw(draw_list, true);
|
|
|
+ RD::get_singleton()->draw_list_end();
|
|
|
+}
|
|
|
+
|
|
|
void CopyEffects::gaussian_glow(RID p_source_rd_texture, RID p_back_texture, const Size2i &p_size, float p_strength, bool p_high_quality, 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) {
|
|
|
ERR_FAIL_COND_MSG(prefer_raster_effects, "Can't use the compute version of the gaussian glow with the mobile renderer.");
|
|
|
|
|
@@ -882,6 +921,36 @@ void CopyEffects::set_color(RID p_dest_texture, const Color &p_color, const Rect
|
|
|
RD::get_singleton()->compute_list_end();
|
|
|
}
|
|
|
|
|
|
+void CopyEffects::set_color_raster(RID p_dest_texture, const Color &p_color, const Rect2i &p_region) {
|
|
|
+ ERR_FAIL_COND_MSG(!prefer_raster_effects, "Can't use the raster version of the set_color shader with the clustered renderer.");
|
|
|
+
|
|
|
+ UniformSetCacheRD *uniform_set_cache = UniformSetCacheRD::get_singleton();
|
|
|
+ ERR_FAIL_NULL(uniform_set_cache);
|
|
|
+ MaterialStorage *material_storage = MaterialStorage::get_singleton();
|
|
|
+ ERR_FAIL_NULL(material_storage);
|
|
|
+
|
|
|
+ memset(©_to_fb.push_constant, 0, sizeof(CopyToFbPushConstant));
|
|
|
+
|
|
|
+ copy_to_fb.push_constant.set_color[0] = p_color.r;
|
|
|
+ copy_to_fb.push_constant.set_color[1] = p_color.g;
|
|
|
+ copy_to_fb.push_constant.set_color[2] = p_color.b;
|
|
|
+ copy_to_fb.push_constant.set_color[3] = p_color.a;
|
|
|
+
|
|
|
+ RID dest_framebuffer = FramebufferCacheRD::get_singleton()->get_cache(p_dest_texture);
|
|
|
+
|
|
|
+ CopyToFBMode mode = COPY_TO_FB_SET_COLOR;
|
|
|
+
|
|
|
+ RID shader = copy_to_fb.shader.version_get_shader(copy_to_fb.shader_version, mode);
|
|
|
+ ERR_FAIL_COND(shader.is_null());
|
|
|
+
|
|
|
+ RD::DrawListID draw_list = RD::get_singleton()->draw_list_begin(dest_framebuffer, RD::INITIAL_ACTION_KEEP, RD::FINAL_ACTION_READ, RD::INITIAL_ACTION_KEEP, RD::FINAL_ACTION_DISCARD, Vector<Color>(), 1.0, 0, p_region);
|
|
|
+ RD::get_singleton()->draw_list_bind_render_pipeline(draw_list, copy_to_fb.pipelines[mode].get_render_pipeline(RD::INVALID_ID, RD::get_singleton()->framebuffer_get_format(dest_framebuffer)));
|
|
|
+ RD::get_singleton()->draw_list_bind_index_array(draw_list, material_storage->get_quad_index_array());
|
|
|
+ RD::get_singleton()->draw_list_set_push_constant(draw_list, ©_to_fb.push_constant, sizeof(CopyToFbPushConstant));
|
|
|
+ RD::get_singleton()->draw_list_draw(draw_list, true);
|
|
|
+ RD::get_singleton()->draw_list_end();
|
|
|
+}
|
|
|
+
|
|
|
void CopyEffects::copy_cubemap_to_dp(RID p_source_rd_texture, RID p_dst_framebuffer, const Rect2 &p_rect, const Vector2 &p_dst_size, float p_z_near, float p_z_far, bool p_dp_flip) {
|
|
|
UniformSetCacheRD *uniform_set_cache = UniformSetCacheRD::get_singleton();
|
|
|
ERR_FAIL_NULL(uniform_set_cache);
|