[Bf-blender-cvs] [ba9a4deddad] blender2.8: Eevee: Initial Final Render support.

Clément Foucault noreply at git.blender.org
Mon Jan 29 22:23:28 CET 2018


Commit: ba9a4deddad599fbbbcfe7305b1937aa95f495bd
Author: Clément Foucault
Date:   Mon Jan 29 18:16:11 2018 +0100
Branches: blender2.8
https://developer.blender.org/rBba9a4deddad599fbbbcfe7305b1937aa95f495bd

Eevee: Initial Final Render support.

TAA / multiple samples is not working at the moment.

===================================================================

M	source/blender/draw/CMakeLists.txt
M	source/blender/draw/engines/eevee/eevee_depth_of_field.c
M	source/blender/draw/engines/eevee/eevee_effects.c
M	source/blender/draw/engines/eevee/eevee_engine.c
M	source/blender/draw/engines/eevee/eevee_materials.c
M	source/blender/draw/engines/eevee/eevee_motion_blur.c
M	source/blender/draw/engines/eevee/eevee_private.h
A	source/blender/draw/engines/eevee/eevee_render.c
M	source/blender/draw/engines/eevee/eevee_temporal_sampling.c
M	source/blender/draw/intern/draw_manager.c

===================================================================

diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index 2c8a61bf9e9..1bff4b875ce 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -94,6 +94,7 @@ set(SRC
 	engines/eevee/eevee_materials.c
 	engines/eevee/eevee_motion_blur.c
 	engines/eevee/eevee_occlusion.c
+	engines/eevee/eevee_render.c
 	engines/eevee/eevee_screen_raytrace.c
 	engines/eevee/eevee_subsurface.c
 	engines/eevee/eevee_temporal_sampling.c
diff --git a/source/blender/draw/engines/eevee/eevee_depth_of_field.c b/source/blender/draw/engines/eevee/eevee_depth_of_field.c
index 124873add96..f5fc79aba4f 100644
--- a/source/blender/draw/engines/eevee/eevee_depth_of_field.c
+++ b/source/blender/draw/engines/eevee/eevee_depth_of_field.c
@@ -75,7 +75,7 @@ static void eevee_create_shader_depth_of_field(void)
 	                                          datatoc_effect_dof_frag_glsl, "#define STEP_RESOLVE\n");
 }
 
-int EEVEE_depth_of_field_init(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data *vedata)
+int EEVEE_depth_of_field_init(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data *vedata, Object *camera)
 {
 	EEVEE_StorageList *stl = vedata->stl;
 	EEVEE_FramebufferList *fbl = vedata->fbl;
@@ -88,17 +88,15 @@ int EEVEE_depth_of_field_init(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data *v
 
 	if (BKE_collection_engine_property_value_get_bool(props, "dof_enable")) {
 		Scene *scene = draw_ctx->scene;
-		View3D *v3d = draw_ctx->v3d;
 		RegionView3D *rv3d = draw_ctx->rv3d;
 
 		if (!e_data.dof_downsample_sh) {
 			eevee_create_shader_depth_of_field();
 		}
 
-		if (rv3d->persp == RV3D_CAMOB && v3d->camera) {
+		if (camera) {
 			const float *viewport_size = DRW_viewport_size_get();
-			Object *camera_object = DEG_get_evaluated_object(draw_ctx->depsgraph, v3d->camera);
-			Camera *cam = (Camera *)camera_object->data;
+			Camera *cam = (Camera *)camera->data;
 
 			/* Retreive Near and Far distance */
 			effects->dof_near_far[0] = -cam->clipsta;
@@ -147,7 +145,7 @@ int EEVEE_depth_of_field_init(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data *v
 			float rotation = cam->gpu_dof.rotation;
 			float ratio = 1.0f / cam->gpu_dof.ratio;
 			float sensor = BKE_camera_sensor_size(cam->sensor_fit, cam->sensor_x, cam->sensor_y);
-			float focus_dist = BKE_camera_object_dof_distance(camera_object);
+			float focus_dist = BKE_camera_object_dof_distance(camera);
 			float focal_len = cam->lens;
 
 			UNUSED_VARS(rotation, ratio);
@@ -163,9 +161,13 @@ int EEVEE_depth_of_field_init(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data *v
 			float focal_len_scaled = scale_camera * focal_len;
 			float sensor_scaled = scale_camera * sensor;
 
+			if (rv3d != NULL) {
+				sensor_scaled *= rv3d->viewcamtexcofac[0];
+			}
+
 			effects->dof_params[0] = aperture * fabsf(focal_len_scaled / (focus_dist - focal_len_scaled));
 			effects->dof_params[1] = -focus_dist;
-			effects->dof_params[2] = viewport_size[0] / (rv3d->viewcamtexcofac[0] * sensor_scaled);
+			effects->dof_params[2] = viewport_size[0] / sensor_scaled;
 			effects->dof_bokeh[0] = blades;
 			effects->dof_bokeh[1] = rotation;
 			effects->dof_bokeh[2] = ratio;
diff --git a/source/blender/draw/engines/eevee/eevee_effects.c b/source/blender/draw/engines/eevee/eevee_effects.c
index 5821111c59d..c1ac085230e 100644
--- a/source/blender/draw/engines/eevee/eevee_effects.c
+++ b/source/blender/draw/engines/eevee/eevee_effects.c
@@ -27,8 +27,6 @@
 
 #include "DRW_render.h"
 
-#include "BKE_global.h" /* for G.debug_value */
-
 #include "eevee_private.h"
 #include "GPU_texture.h"
 #include "GPU_extensions.h"
@@ -100,7 +98,7 @@ static void eevee_create_shader_downsample(void)
 	        "#define COPY_DEPTH\n");
 }
 
-void EEVEE_effects_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
+void EEVEE_effects_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, Object *camera)
 {
 	EEVEE_CommonUniformBuffer *common_data = &sldata->common_data;
 	EEVEE_StorageList *stl = vedata->stl;
@@ -122,9 +120,9 @@ void EEVEE_effects_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
 	effects = stl->effects;
 
 	effects->enabled_effects = 0;
-	effects->enabled_effects |= EEVEE_motion_blur_init(sldata, vedata);
+	effects->enabled_effects |= EEVEE_motion_blur_init(sldata, vedata, camera);
 	effects->enabled_effects |= EEVEE_bloom_init(sldata, vedata);
-	effects->enabled_effects |= EEVEE_depth_of_field_init(sldata, vedata);
+	effects->enabled_effects |= EEVEE_depth_of_field_init(sldata, vedata, camera);
 	effects->enabled_effects |= EEVEE_temporal_sampling_init(sldata, vedata);
 	effects->enabled_effects |= EEVEE_occlusion_init(sldata, vedata);
 	effects->enabled_effects |= EEVEE_subsurface_init(sldata, vedata);
@@ -406,7 +404,6 @@ void EEVEE_draw_effects(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
 	EEVEE_FramebufferList *fbl = vedata->fbl;
 	EEVEE_StorageList *stl = vedata->stl;
 	EEVEE_EffectsInfo *effects = stl->effects;
-	DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get();
 	DefaultTextureList *dtxl = DRW_viewport_texture_list_get();
 
 	/* only once per frame after the first post process */
@@ -427,42 +424,9 @@ void EEVEE_draw_effects(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
 	EEVEE_depth_of_field_draw(vedata);
 	EEVEE_bloom_draw(vedata);
 
-	/* Restore default framebuffer */
-	DRW_framebuffer_texture_attach(dfbl->default_fb, dtxl->depth, 0, 0);
-	DRW_framebuffer_bind(dfbl->default_fb);
-
-	/* Tonemapping */
-	DRW_transform_to_display(effects->source_buffer);
-
-	/* Debug : Ouput buffer to view. */
-	switch (G.debug_value) {
-		case 1:
-			if (txl->maxzbuffer) DRW_transform_to_display(txl->maxzbuffer);
-			break;
-		case 2:
-			if (stl->g_data->ssr_pdf_output) DRW_transform_to_display(stl->g_data->ssr_pdf_output);
-			break;
-		case 3:
-			if (txl->ssr_normal_input) DRW_transform_to_display(txl->ssr_normal_input);
-			break;
-		case 4:
-			if (txl->ssr_specrough_input) DRW_transform_to_display(txl->ssr_specrough_input);
-			break;
-		case 5:
-			if (txl->color_double_buffer) DRW_transform_to_display(txl->color_double_buffer);
-			break;
-		case 6:
-			if (stl->g_data->gtao_horizons_debug) DRW_transform_to_display(stl->g_data->gtao_horizons_debug);
-			break;
-		case 7:
-			if (txl->gtao_horizons) DRW_transform_to_display(txl->gtao_horizons);
-			break;
-		case 8:
-			if (txl->sss_data) DRW_transform_to_display(txl->sss_data);
-			break;
-		default:
-			break;
-	}
+	/* Save the final texture and framebuffer for final transformation or read. */
+	effects->final_tx = effects->source_buffer;
+	effects->final_fb = (effects->target_buffer != fbl->main) ? fbl->main : fbl->effect_fb;
 
 	/* If no post processes is enabled, buffers are still not swapped, do it now. */
 	SWAP_DOUBLE_BUFFERS();
diff --git a/source/blender/draw/engines/eevee/eevee_engine.c b/source/blender/draw/engines/eevee/eevee_engine.c
index d06aac18877..8e74f3344dd 100644
--- a/source/blender/draw/engines/eevee/eevee_engine.c
+++ b/source/blender/draw/engines/eevee/eevee_engine.c
@@ -29,9 +29,13 @@
 #include "BLI_rand.h"
 
 #include "BKE_object.h"
+#include "BKE_global.h" /* for G.debug_value */
+#include "BKE_screen.h"
 
 #include "DNA_world_types.h"
 
+#include "ED_screen.h"
+
 #include "GPU_material.h"
 #include "GPU_glew.h"
 
@@ -52,6 +56,11 @@ static void eevee_engine_init(void *ved)
 	EEVEE_StorageList *stl = ((EEVEE_Data *)vedata)->stl;
 	EEVEE_ViewLayerData *sldata = EEVEE_view_layer_data_ensure();
 
+	const DRWContextState *draw_ctx = DRW_context_state_get();
+	View3D *v3d = draw_ctx->v3d;
+	RegionView3D *rv3d = draw_ctx->rv3d;
+	Object *camera = (rv3d->persp == RV3D_CAMOB) ? v3d->camera : NULL;
+
 	if (!stl->g_data) {
 		/* Alloc transient pointers */
 		stl->g_data = MEM_callocN(sizeof(*stl->g_data), __func__);
@@ -71,8 +80,7 @@ static void eevee_engine_init(void *ved)
 	}
 
 	/* EEVEE_effects_init needs to go first for TAA */
-	EEVEE_effects_init(sldata, vedata);
-
+	EEVEE_effects_init(sldata, vedata, camera);
 	EEVEE_materials_init(sldata, stl, fbl);
 	EEVEE_lights_init(sldata);
 	EEVEE_lightprobes_init(sldata, vedata);
@@ -160,12 +168,14 @@ static void eevee_cache_finish(void *vedata)
 static void eevee_draw_background(void *vedata)
 {
 	EEVEE_PassList *psl = ((EEVEE_Data *)vedata)->psl;
+	EEVEE_TextureList *txl = ((EEVEE_Data *)vedata)->txl;
 	EEVEE_StorageList *stl = ((EEVEE_Data *)vedata)->stl;
 	EEVEE_FramebufferList *fbl = ((EEVEE_Data *)vedata)->fbl;
 	EEVEE_ViewLayerData *sldata = EEVEE_view_layer_data_ensure();
 
 	/* Default framebuffer and texture */
 	DefaultTextureList *dtxl = DRW_viewport_texture_list_get();
+	DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get();
 
 	/* Number of iteration: needed for all temporal effect (SSR, TAA)
 	 * when using opengl render. */
@@ -176,14 +186,10 @@ static void eevee_draw_background(void *vedata)
 		double offset[3] = {0.0, 0.0, 0.0};
 		double r[3];
 
-		if (DRW_state_is_image_render()) {
-			BLI_halton_3D(primes, offset, stl->effects->taa_current_sample, r);
-			/* Set jitter offset */
-			EEVEE_update_noise(psl, fbl, r);
-		}
-		else if ((stl->effects->enabled_effects & EFFECT_TAA) != 0) {
+		if (DRW_state_is_image_render() ||
+			((stl->effects->enabled_effects & EFFECT_TAA) != 0))
+		{
 			BLI_halton_3D(primes, offset, stl->effects->taa_current_sample, r);
-			/* Set jitter offset */
 			EEVEE_update_noise(psl, fbl, r);
 		}
 
@@ -281,6 +287,43 @@ static void eevee_draw_background(void *vedata)
 		}
 	}
 
+	/* Restore default framebuffer */
+	DRW_framebuffer_texture_attach(dfbl->default_fb, dtxl->depth, 0, 0);
+	DRW_framebuffer_bind(dfbl->default_fb);
+
+	/* Tonemapping */
+	DRW_transform_to_display(stl->effects->final_tx);
+
+	/* Debug : Ouput buffer to view. */
+	switch (G.debug_value) {
+		case 1:
+			if (txl->maxzbuffer) DRW_transform_to_display(txl->maxzbuffer);
+			break;
+		case 2:
+			if (stl->g_data->ssr_pdf_output) DRW_transform_to_display(stl->g_data->ssr_pdf_output);
+			break;
+		case 3:
+			if (txl->ssr_normal_input) DRW_transform_to_display(txl->ssr_normal_input);
+			break;
+		case 4:
+			if (txl->ssr_specrough_input) DRW_transform_to_display(txl->ssr_specrough_input);
+			break;
+		case 5:
+			if (txl->color_double_buff

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list