Browse Source

Implement CameraEffects override_exposure

Dominic-ATOR 3 years ago
parent
commit
d7a4187b05
1 changed files with 16 additions and 7 deletions
  1. 16 7
      servers/rendering/renderer_rd/renderer_scene_render_rd.cpp

+ 16 - 7
servers/rendering/renderer_rd/renderer_scene_render_rd.cpp

@@ -2086,7 +2086,7 @@ void RendererSceneRenderRD::_render_buffers_post_process_and_tonemap(const Rende
 	ERR_FAIL_COND(!rb);
 	ERR_FAIL_COND(!rb);
 
 
 	RendererSceneEnvironmentRD *env = environment_owner.get_or_null(p_render_data->environment);
 	RendererSceneEnvironmentRD *env = environment_owner.get_or_null(p_render_data->environment);
-	//glow (if enabled)
+	// Glow and override exposure (if enabled).
 	CameraEffects *camfx = camera_effects_owner.get_or_null(p_render_data->camera_effects);
 	CameraEffects *camfx = camera_effects_owner.get_or_null(p_render_data->camera_effects);
 
 
 	bool can_use_effects = rb->width >= 8 && rb->height >= 8;
 	bool can_use_effects = rb->width >= 8 && rb->height >= 8;
@@ -2102,7 +2102,7 @@ void RendererSceneRenderRD::_render_buffers_post_process_and_tonemap(const Rende
 
 
 		EffectsRD::BokehBuffers buffers;
 		EffectsRD::BokehBuffers buffers;
 
 
-		// textures we use
+		// Textures we use.
 		buffers.base_texture_size = Size2i(rb->width, rb->height);
 		buffers.base_texture_size = Size2i(rb->width, rb->height);
 		buffers.base_texture = rb->texture;
 		buffers.base_texture = rb->texture;
 		buffers.depth_texture = rb->depth_texture;
 		buffers.depth_texture = rb->depth_texture;
@@ -2114,7 +2114,7 @@ void RendererSceneRenderRD::_render_buffers_post_process_and_tonemap(const Rende
 		if (can_use_storage) {
 		if (can_use_storage) {
 			storage->get_effects()->bokeh_dof(buffers, camfx->dof_blur_far_enabled, camfx->dof_blur_far_distance, camfx->dof_blur_far_transition, camfx->dof_blur_near_enabled, camfx->dof_blur_near_distance, camfx->dof_blur_near_transition, bokeh_size, dof_blur_bokeh_shape, dof_blur_quality, dof_blur_use_jitter, p_render_data->z_near, p_render_data->z_far, p_render_data->cam_ortogonal);
 			storage->get_effects()->bokeh_dof(buffers, camfx->dof_blur_far_enabled, camfx->dof_blur_far_distance, camfx->dof_blur_far_transition, camfx->dof_blur_near_enabled, camfx->dof_blur_near_distance, camfx->dof_blur_near_transition, bokeh_size, dof_blur_bokeh_shape, dof_blur_quality, dof_blur_use_jitter, p_render_data->z_near, p_render_data->z_far, p_render_data->cam_ortogonal);
 		} else {
 		} else {
-			// set framebuffers
+			// Set framebuffers.
 			buffers.base_fb = rb->texture_fb;
 			buffers.base_fb = rb->texture_fb;
 			buffers.secondary_fb = rb->weight_buffers[1].fb;
 			buffers.secondary_fb = rb->weight_buffers[1].fb;
 			buffers.half_fb[0] = rb->weight_buffers[2].fb;
 			buffers.half_fb[0] = rb->weight_buffers[2].fb;
@@ -2124,7 +2124,7 @@ void RendererSceneRenderRD::_render_buffers_post_process_and_tonemap(const Rende
 			buffers.weight_texture[2] = rb->weight_buffers[2].weight;
 			buffers.weight_texture[2] = rb->weight_buffers[2].weight;
 			buffers.weight_texture[3] = rb->weight_buffers[3].weight;
 			buffers.weight_texture[3] = rb->weight_buffers[3].weight;
 
 
-			// set weight buffers
+			// Set weight buffers.
 			buffers.base_weight_fb = rb->base_weight_fb;
 			buffers.base_weight_fb = rb->base_weight_fb;
 
 
 			storage->get_effects()->bokeh_dof_raster(buffers, camfx->dof_blur_far_enabled, camfx->dof_blur_far_distance, camfx->dof_blur_far_transition, camfx->dof_blur_near_enabled, camfx->dof_blur_near_distance, camfx->dof_blur_near_transition, bokeh_size, dof_blur_bokeh_shape, dof_blur_quality, p_render_data->z_near, p_render_data->z_far, p_render_data->cam_ortogonal);
 			storage->get_effects()->bokeh_dof_raster(buffers, camfx->dof_blur_far_enabled, camfx->dof_blur_far_distance, camfx->dof_blur_far_transition, camfx->dof_blur_near_enabled, camfx->dof_blur_near_distance, camfx->dof_blur_near_transition, bokeh_size, dof_blur_bokeh_shape, dof_blur_quality, p_render_data->z_near, p_render_data->z_far, p_render_data->cam_ortogonal);
@@ -2147,13 +2147,13 @@ void RendererSceneRenderRD::_render_buffers_post_process_and_tonemap(const Rende
 		} else {
 		} else {
 			storage->get_effects()->luminance_reduction_raster(rb->texture, Size2i(rb->width, rb->height), rb->luminance.reduce, rb->luminance.fb, rb->luminance.current, env->min_luminance, env->max_luminance, step, set_immediate);
 			storage->get_effects()->luminance_reduction_raster(rb->texture, Size2i(rb->width, rb->height), rb->luminance.reduce, rb->luminance.fb, rb->luminance.current, env->min_luminance, env->max_luminance, step, set_immediate);
 		}
 		}
-		//swap final reduce with prev luminance
+		// Swap final reduce with prev luminance.
 		SWAP(rb->luminance.current, rb->luminance.reduce.write[rb->luminance.reduce.size() - 1]);
 		SWAP(rb->luminance.current, rb->luminance.reduce.write[rb->luminance.reduce.size() - 1]);
 		if (!can_use_storage) {
 		if (!can_use_storage) {
 			SWAP(rb->luminance.current_fb, rb->luminance.fb.write[rb->luminance.fb.size() - 1]);
 			SWAP(rb->luminance.current_fb, rb->luminance.fb.write[rb->luminance.fb.size() - 1]);
 		}
 		}
 
 
-		RenderingServerDefault::redraw_request(); //redraw all the time if auto exposure rendering is on
+		RenderingServerDefault::redraw_request(); // Redraw all the time if auto exposure rendering is on.
 		RD::get_singleton()->draw_command_end_label();
 		RD::get_singleton()->draw_command_end_label();
 	}
 	}
 
 
@@ -2207,7 +2207,6 @@ void RendererSceneRenderRD::_render_buffers_post_process_and_tonemap(const Rende
 	{
 	{
 		RD::get_singleton()->draw_command_begin_label("Tonemap");
 		RD::get_singleton()->draw_command_begin_label("Tonemap");
 
 
-		//tonemap
 		EffectsRD::TonemapSettings tonemap;
 		EffectsRD::TonemapSettings tonemap;
 
 
 		if (can_use_effects && env && env->auto_exposure && rb->luminance.current.is_valid()) {
 		if (can_use_effects && env && env->auto_exposure && rb->luminance.current.is_valid()) {
@@ -2246,6 +2245,10 @@ void RendererSceneRenderRD::_render_buffers_post_process_and_tonemap(const Rende
 			tonemap.exposure = env->exposure;
 			tonemap.exposure = env->exposure;
 		}
 		}
 
 
+		if (camfx && camfx->override_exposure_enabled) {
+			tonemap.exposure = camfx->override_exposure;
+		}
+
 		tonemap.use_color_correction = false;
 		tonemap.use_color_correction = false;
 		tonemap.use_1d_color_correction = false;
 		tonemap.use_1d_color_correction = false;
 		tonemap.color_correction_texture = storage->texture_rd_get_default(RendererStorageRD::DEFAULT_RD_TEXTURE_3D_WHITE);
 		tonemap.color_correction_texture = storage->texture_rd_get_default(RendererStorageRD::DEFAULT_RD_TEXTURE_3D_WHITE);
@@ -2280,6 +2283,8 @@ void RendererSceneRenderRD::_post_process_subpass(RID p_source_texture, RID p_fr
 	ERR_FAIL_COND(!rb);
 	ERR_FAIL_COND(!rb);
 
 
 	RendererSceneEnvironmentRD *env = environment_owner.get_or_null(p_render_data->environment);
 	RendererSceneEnvironmentRD *env = environment_owner.get_or_null(p_render_data->environment);
+	// Override exposure (if enabled).
+	CameraEffects *camfx = camera_effects_owner.get_or_null(p_render_data->camera_effects);
 
 
 	bool can_use_effects = rb->width >= 8 && rb->height >= 8;
 	bool can_use_effects = rb->width >= 8 && rb->height >= 8;
 
 
@@ -2293,6 +2298,10 @@ void RendererSceneRenderRD::_post_process_subpass(RID p_source_texture, RID p_fr
 		tonemap.white = env->white;
 		tonemap.white = env->white;
 	}
 	}
 
 
+	if (camfx && camfx->override_exposure_enabled) {
+		tonemap.exposure = camfx->override_exposure;
+	}
+
 	// We don't support glow or auto exposure here, if they are needed, don't use subpasses!
 	// We don't support glow or auto exposure here, if they are needed, don't use subpasses!
 	// The problem is that we need to use the result so far and process them before we can
 	// The problem is that we need to use the result so far and process them before we can
 	// apply this to our results.
 	// apply this to our results.