[Bf-blender-cvs] [9075f934aae] blender2.8: Eevee: Initial Depth Of Field commit.

Clément Foucault noreply at git.blender.org
Wed May 10 01:12:10 CEST 2017


Commit: 9075f934aae2cccad18ba96130650965875f2fa1
Author: Clément Foucault
Date:   Tue May 9 21:57:13 2017 +0200
Branches: blender2.8
https://developer.blender.org/rB9075f934aae2cccad18ba96130650965875f2fa1

Eevee: Initial Depth Of Field commit.

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

M	release/scripts/startup/bl_ui/properties_data_camera.py
M	source/blender/draw/CMakeLists.txt
M	source/blender/draw/engines/eevee/eevee_effects.c
M	source/blender/draw/engines/eevee/eevee_private.h
A	source/blender/draw/engines/eevee/shaders/effect_dof_frag.glsl
A	source/blender/draw/engines/eevee/shaders/effect_dof_geom.glsl
A	source/blender/draw/engines/eevee/shaders/effect_dof_vert.glsl

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

diff --git a/release/scripts/startup/bl_ui/properties_data_camera.py b/release/scripts/startup/bl_ui/properties_data_camera.py
index b0c4a8d6d37..b5271431795 100644
--- a/release/scripts/startup/bl_ui/properties_data_camera.py
+++ b/release/scripts/startup/bl_ui/properties_data_camera.py
@@ -37,7 +37,7 @@ class CAMERA_MT_presets(Menu):
     bl_label = "Camera Presets"
     preset_subdir = "camera"
     preset_operator = "script.execute_preset"
-    COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME', 'BLENDER_CLAY'}
+    COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME', 'BLENDER_CLAY', 'BLENDER_EEVEE'}
     draw = Menu.draw_preset
 
 
@@ -45,14 +45,14 @@ class SAFE_AREAS_MT_presets(Menu):
     bl_label = "Camera Presets"
     preset_subdir = "safe_areas"
     preset_operator = "script.execute_preset"
-    COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME', 'BLENDER_CLAY'}
+    COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME', 'BLENDER_CLAY', 'BLENDER_EEVEE'}
     draw = Menu.draw_preset
 
 
 class DATA_PT_context_camera(CameraButtonsPanel, Panel):
     bl_label = ""
     bl_options = {'HIDE_HEADER'}
-    COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME', 'BLENDER_CLAY'}
+    COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME', 'BLENDER_CLAY', 'BLENDER_EEVEE'}
 
     def draw(self, context):
         layout = self.layout
@@ -72,7 +72,7 @@ class DATA_PT_context_camera(CameraButtonsPanel, Panel):
 
 class DATA_PT_lens(CameraButtonsPanel, Panel):
     bl_label = "Lens"
-    COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME', 'BLENDER_CLAY'}
+    COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME', 'BLENDER_CLAY', 'BLENDER_EEVEE'}
 
     def draw(self, context):
         layout = self.layout
@@ -183,7 +183,7 @@ class DATA_PT_camera_stereoscopy(CameraButtonsPanel, Panel):
 
 class DATA_PT_camera(CameraButtonsPanel, Panel):
     bl_label = "Camera"
-    COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME', 'BLENDER_CLAY'}
+    COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME', 'BLENDER_CLAY', 'BLENDER_EEVEE'}
 
     def draw(self, context):
         layout = self.layout
@@ -217,7 +217,7 @@ class DATA_PT_camera(CameraButtonsPanel, Panel):
 
 class DATA_PT_camera_dof(CameraButtonsPanel, Panel):
     bl_label = "Depth of Field"
-    COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME', 'BLENDER_CLAY'}
+    COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME', 'BLENDER_CLAY', 'BLENDER_EEVEE'}
 
     def draw(self, context):
         layout = self.layout
@@ -247,7 +247,7 @@ class DATA_PT_camera_dof(CameraButtonsPanel, Panel):
 
 class DATA_PT_camera_display(CameraButtonsPanel, Panel):
     bl_label = "Display"
-    COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME', 'BLENDER_CLAY'}
+    COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME', 'BLENDER_CLAY', 'BLENDER_EEVEE'}
 
     def draw(self, context):
         layout = self.layout
@@ -277,7 +277,7 @@ class DATA_PT_camera_display(CameraButtonsPanel, Panel):
 class DATA_PT_camera_safe_areas(CameraButtonsPanel, Panel):
     bl_label = "Safe Areas"
     bl_options = {'DEFAULT_CLOSED'}
-    COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME', 'BLENDER_CLAY'}
+    COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME', 'BLENDER_CLAY', 'BLENDER_EEVEE'}
 
     def draw_header(self, context):
         cam = context.camera
@@ -293,7 +293,7 @@ class DATA_PT_camera_safe_areas(CameraButtonsPanel, Panel):
 
 
 class DATA_PT_custom_props_camera(CameraButtonsPanel, PropertyPanel, Panel):
-    COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME', 'BLENDER_CLAY'}
+    COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME', 'BLENDER_CLAY', 'BLENDER_EEVEE'}
     _context_path = "object.data"
     _property_type = bpy.types.Camera
 
diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index 0b229ecee8d..343f08343fd 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -115,6 +115,9 @@ data_to_c_simple(engines/eevee/shaders/background_vert.glsl SRC)
 data_to_c_simple(engines/eevee/shaders/lit_surface_frag.glsl SRC)
 data_to_c_simple(engines/eevee/shaders/lit_surface_vert.glsl SRC)
 data_to_c_simple(engines/eevee/shaders/effect_bloom_frag.glsl SRC)
+data_to_c_simple(engines/eevee/shaders/effect_dof_vert.glsl SRC)
+data_to_c_simple(engines/eevee/shaders/effect_dof_geom.glsl SRC)
+data_to_c_simple(engines/eevee/shaders/effect_dof_frag.glsl SRC)
 data_to_c_simple(engines/eevee/shaders/effect_motion_blur_frag.glsl SRC)
 data_to_c_simple(engines/eevee/shaders/probe_filter_frag.glsl SRC)
 data_to_c_simple(engines/eevee/shaders/probe_sh_frag.glsl SRC)
diff --git a/source/blender/draw/engines/eevee/eevee_effects.c b/source/blender/draw/engines/eevee/eevee_effects.c
index 2279f0a6b44..586580e3a93 100644
--- a/source/blender/draw/engines/eevee/eevee_effects.c
+++ b/source/blender/draw/engines/eevee/eevee_effects.c
@@ -29,8 +29,10 @@
 #include "DRW_render.h"
 
 #include "DNA_anim_types.h"
+#include "DNA_camera_types.h"
 #include "DNA_view3d_types.h"
 
+#include "BKE_camera.h"
 #include "BKE_object.h"
 #include "BKE_animsys.h"
 
@@ -44,8 +46,10 @@ typedef struct EEVEE_ProbeData {
 /* TODO Option */
 #define ENABLE_EFFECT_MOTION_BLUR 1
 #define ENABLE_EFFECT_BLOOM 1
+#define ENABLE_EFFECT_DOF 1
 
 static struct {
+	/* Motion Blur */
 	struct GPUShader *motion_blur_sh;
 
 	/* Bloom */
@@ -54,11 +58,19 @@ static struct {
 	struct GPUShader *bloom_upsample_sh[2];
 	struct GPUShader *bloom_resolve_sh[2];
 
+	/* Depth Of Field */
+	struct GPUShader *dof_downsample_sh;
+	struct GPUShader *dof_scatter_sh;
+	struct GPUShader *dof_resolve_sh;
+
 	struct GPUShader *tonemap_sh;
 } e_data = {NULL}; /* Engine data */
 
 extern char datatoc_effect_motion_blur_frag_glsl[];
 extern char datatoc_effect_bloom_frag_glsl[];
+extern char datatoc_effect_dof_vert_glsl[];
+extern char datatoc_effect_dof_geom_glsl[];
+extern char datatoc_effect_dof_frag_glsl[];
 extern char datatoc_tonemap_frag_glsl[];
 
 void EEVEE_effects_init(EEVEE_Data *vedata)
@@ -66,19 +78,28 @@ void EEVEE_effects_init(EEVEE_Data *vedata)
 	EEVEE_StorageList *stl = vedata->stl;
 	EEVEE_FramebufferList *fbl = vedata->fbl;
 	EEVEE_TextureList *txl = vedata->txl;
+	EEVEE_EffectsInfo *effects;
 
-	/* Ping Pong buffer */
-	DRWFboTexture tex = {&txl->color_post, DRW_BUF_RGBA_16, DRW_TEX_FILTER};
+	const DRWContextState *draw_ctx = DRW_context_state_get();
+	Scene *scene = draw_ctx->scene;
+	View3D *v3d = draw_ctx->v3d;
+	RegionView3D *rv3d = draw_ctx->rv3d;
 
 	const float *viewport_size = DRW_viewport_size_get();
-	DRW_framebuffer_init(&fbl->effect_fb,
-	                    (int)viewport_size[0], (int)viewport_size[1],
-	                    &tex, 1);
 
 	if (!e_data.motion_blur_sh) {
 		e_data.motion_blur_sh = DRW_shader_create_fullscreen(datatoc_effect_motion_blur_frag_glsl, NULL);
 	}
 
+	if (!e_data.dof_downsample_sh) {
+		e_data.dof_downsample_sh = DRW_shader_create(datatoc_effect_dof_vert_glsl, NULL,
+		                                                datatoc_effect_dof_frag_glsl, "#define STEP_DOWNSAMPLE\n");
+		e_data.dof_scatter_sh = DRW_shader_create(datatoc_effect_dof_vert_glsl, NULL,
+		                                             datatoc_effect_dof_frag_glsl, "#define STEP_SCATTER\n");
+		e_data.dof_resolve_sh = DRW_shader_create(datatoc_effect_dof_vert_glsl, NULL,
+		                                             datatoc_effect_dof_frag_glsl, "#define STEP_RESOLVE\n");
+	}
+
 	if (!e_data.bloom_blit_sh[0]) {
 		e_data.bloom_blit_sh[0] = DRW_shader_create_fullscreen(datatoc_effect_bloom_frag_glsl, "#define STEP_BLIT\n");
 		e_data.bloom_blit_sh[1] = DRW_shader_create_fullscreen(datatoc_effect_bloom_frag_glsl, "#define STEP_BLIT\n"
@@ -103,18 +124,15 @@ void EEVEE_effects_init(EEVEE_Data *vedata)
 
 	if (!stl->effects) {
 		stl->effects = MEM_callocN(sizeof(EEVEE_EffectsInfo), "EEVEE_EffectsInfo");
-		stl->effects->enabled_effects = 0;
 	}
 
+	effects = stl->effects;
+
+	effects->enabled_effects = 0;
+
 #if ENABLE_EFFECT_MOTION_BLUR
 	{
 		/* Update Motion Blur Matrices */
-		EEVEE_EffectsInfo *effects = stl->effects;
-		const DRWContextState *draw_ctx = DRW_context_state_get();
-		Scene *scene = draw_ctx->scene;
-		View3D *v3d = draw_ctx->v3d;
-		RegionView3D *rv3d = draw_ctx->rv3d;
-
 		if (rv3d->persp == RV3D_CAMOB && v3d->camera) {
 			float ctime = BKE_scene_frame_get(scene);
 			float past_obmat[4][4], future_obmat[4][4], winmat[4][4];
@@ -157,9 +175,9 @@ void EEVEE_effects_init(EEVEE_Data *vedata)
 	}
 #endif /* ENABLE_EFFECT_MOTION_BLUR */
 
+#if ENABLE_EFFECT_BLOOM
 	{
 		/* Bloom */
-		EEVEE_EffectsInfo *effects = stl->effects;
 		int blitsize[2], texsize[2];
 
 		/* Blit Buffer */
@@ -229,6 +247,76 @@ void EEVEE_effects_init(EEVEE_Data *vedata)
 
 		effects->enabled_effects |= EFFECT_BLOOM;
 	}
+#endif /* ENABLE_EFFECT_BLOOM */
+
+#if ENABLE_EFFECT_DOF
+	{
+		/* Depth Of Field */
+		if (rv3d->persp == RV3D_CAMOB && v3d->camera) {
+			Camera *cam = (Camera *)v3d->camera->data;
+
+			/* Retreive Near and Far distance */
+			effects->dof_near_far[0] = -cam->clipsta;
+			effects->dof_near_far[1] = -cam->clipend;
+
+			int buffer_size[2] = {(int)viewport_size[0] / 2, (int)viewport_size[1] / 2};
+
+			/* Setup buffers */
+			DRWFboTexture tex_down[3] = {{&txl->dof_down_near, DRW_BUF_RGBA_16, 0},
+			                             {&txl->dof_down_far, DRW_BUF_RGBA_16, 0},
+			                             {&txl->dof_coc, DRW_BUF_RG_16, 0}};
+			DRW_framebuffer_init(&fbl->dof_down_fb, buffer_size[0], buffer_size[1], tex_down, 3);
+
+			DRWFboTexture tex_scatter_far = {&txl->dof_far_blur, DRW_BUF_RGBA_16, DRW_TEX_FILTER};
+			DRW_framebuffer_init(&fbl->dof_scatter_far_fb, buffer_size[0], buffer_size[1], &tex_scatter_far, 1);
+
+			DRWFboTexture tex_scatter_near = {&txl->dof_near_blur, DRW_BUF_RGBA_16, DRW_TEX_FILTER};
+			DRW_framebuffer_init(&fbl->dof_scatter_near_fb, buffer_size[0], buffer_size[1], &tex_scatter_near, 1);
+
+			/* Parameters */
+			/* TODO UI Options */
+			float fstop = cam->gpu_dof.fstop;
+			float blades = cam->gpu_dof.num_blades;
+			float rotation = 0.0f;
+			float ratio = 1.0f;
+			float sensor = BKE_camera_sensor_size(cam->sensor_fit, cam->sensor_x, cam->sensor_y);
+			float focus_dist = BKE_camera_object_dof_di

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list