[Bf-blender-cvs] [f48e53f5625] blender2.8: Eevee: Shadows: Separate Cube and Cascade shadow maps into 2 texture array.

Clément Foucault noreply at git.blender.org
Fri May 4 16:22:27 CEST 2018


Commit: f48e53f5625b5c4091cddee09154b43ee98ecfdb
Author: Clément Foucault
Date:   Fri May 4 14:39:05 2018 +0200
Branches: blender2.8
https://developer.blender.org/rBf48e53f5625b5c4091cddee09154b43ee98ecfdb

Eevee: Shadows: Separate Cube and Cascade shadow maps into 2 texture array.

This mean we can now have different shadow resolutions for both.

However each shadow type keep the same size accross all lamps because of
future "real" Cube Shadowmaps limitation and to save texture sampler slots.

That said the cascade shadow resolution could (in the future) still be
changed to be adjustable per sun lamp.

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

M	release/scripts/startup/bl_ui/properties_render.py
M	release/scripts/startup/bl_ui/properties_view_layer.py
M	source/blender/draw/engines/eevee/eevee_data.c
M	source/blender/draw/engines/eevee/eevee_engine.c
M	source/blender/draw/engines/eevee/eevee_lights.c
M	source/blender/draw/engines/eevee/eevee_materials.c
M	source/blender/draw/engines/eevee/eevee_private.h
M	source/blender/draw/engines/eevee/eevee_volumes.c
M	source/blender/draw/engines/eevee/shaders/lamps_lib.glsl
M	source/blender/makesrna/intern/rna_layer.c

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

diff --git a/release/scripts/startup/bl_ui/properties_render.py b/release/scripts/startup/bl_ui/properties_render.py
index 08f19a02ecc..610166f5845 100644
--- a/release/scripts/startup/bl_ui/properties_render.py
+++ b/release/scripts/startup/bl_ui/properties_render.py
@@ -675,7 +675,8 @@ class RENDER_PT_eevee_shadows(RenderButtonsPanel, Panel):
 
         col = layout.column()
         col.prop(props, "shadow_method")
-        col.prop(props, "shadow_size")
+        col.prop(props, "shadow_cube_size")
+        col.prop(props, "shadow_cascade_size")
         col.prop(props, "shadow_high_bitdepth")
 
 
diff --git a/release/scripts/startup/bl_ui/properties_view_layer.py b/release/scripts/startup/bl_ui/properties_view_layer.py
index 842a3f36fa2..a8128f04bd4 100644
--- a/release/scripts/startup/bl_ui/properties_view_layer.py
+++ b/release/scripts/startup/bl_ui/properties_view_layer.py
@@ -308,7 +308,8 @@ class VIEWLAYER_PT_eevee_shadows(ViewLayerButtonsPanel, Panel):
 
         col = layout.column()
         col.template_override_property(layer_props, scene_props, "shadow_method")
-        col.template_override_property(layer_props, scene_props, "shadow_size")
+        col.template_override_property(layer_props, scene_props, "shadow_cube_size")
+        col.template_override_property(layer_props, scene_props, "shadow_cascade_size")
         col.template_override_property(layer_props, scene_props, "shadow_high_bitdepth")
 
 
diff --git a/source/blender/draw/engines/eevee/eevee_data.c b/source/blender/draw/engines/eevee/eevee_data.c
index 5adcf9e9ffb..e9883cc3054 100644
--- a/source/blender/draw/engines/eevee/eevee_data.c
+++ b/source/blender/draw/engines/eevee/eevee_data.c
@@ -39,13 +39,15 @@ static void eevee_view_layer_data_free(void *storage)
 	DRW_UBO_FREE_SAFE(sldata->shadow_ubo);
 	DRW_UBO_FREE_SAFE(sldata->shadow_render_ubo);
 	GPU_FRAMEBUFFER_FREE_SAFE(sldata->shadow_cube_target_fb);
+	GPU_FRAMEBUFFER_FREE_SAFE(sldata->shadow_cube_store_fb);
 	GPU_FRAMEBUFFER_FREE_SAFE(sldata->shadow_cascade_target_fb);
-	GPU_FRAMEBUFFER_FREE_SAFE(sldata->shadow_store_fb);
+	GPU_FRAMEBUFFER_FREE_SAFE(sldata->shadow_cascade_store_fb);
 	DRW_TEXTURE_FREE_SAFE(sldata->shadow_cube_target);
 	DRW_TEXTURE_FREE_SAFE(sldata->shadow_cube_blur);
+	DRW_TEXTURE_FREE_SAFE(sldata->shadow_cube_pool);
 	DRW_TEXTURE_FREE_SAFE(sldata->shadow_cascade_target);
 	DRW_TEXTURE_FREE_SAFE(sldata->shadow_cascade_blur);
-	DRW_TEXTURE_FREE_SAFE(sldata->shadow_pool);
+	DRW_TEXTURE_FREE_SAFE(sldata->shadow_cascade_pool);
 	MEM_SAFE_FREE(sldata->shcasters_buffers[0].shadow_casters);
 	MEM_SAFE_FREE(sldata->shcasters_buffers[0].flags);
 	MEM_SAFE_FREE(sldata->shcasters_buffers[1].shadow_casters);
diff --git a/source/blender/draw/engines/eevee/eevee_engine.c b/source/blender/draw/engines/eevee/eevee_engine.c
index afea335d733..1c0247068cc 100644
--- a/source/blender/draw/engines/eevee/eevee_engine.c
+++ b/source/blender/draw/engines/eevee/eevee_engine.c
@@ -497,7 +497,8 @@ static void eevee_view_layer_settings_create(RenderEngine *UNUSED(engine), IDPro
 	BKE_collection_engine_property_add_float(props, "motion_blur_shutter", 1.0f);
 
 	BKE_collection_engine_property_add_int(props, "shadow_method", SHADOW_ESM);
-	BKE_collection_engine_property_add_int(props, "shadow_size", 512);
+	BKE_collection_engine_property_add_int(props, "shadow_cube_size", 512);
+	BKE_collection_engine_property_add_int(props, "shadow_cascade_size", 1024);
 	BKE_collection_engine_property_add_bool(props, "shadow_high_bitdepth", false);
 }
 
diff --git a/source/blender/draw/engines/eevee/eevee_lights.c b/source/blender/draw/engines/eevee/eevee_lights.c
index b7adcbf0835..b7790d7dd0f 100644
--- a/source/blender/draw/engines/eevee/eevee_lights.c
+++ b/source/blender/draw/engines/eevee/eevee_lights.c
@@ -129,30 +129,24 @@ void EEVEE_lights_init(EEVEE_ViewLayerData *sldata)
 	SWAP(EEVEE_ShadowCasterBuffer *, sldata->lamps->shcaster_frontbuffer, sldata->lamps->shcaster_backbuffer);
 
 	int sh_method = BKE_collection_engine_property_value_get_int(props, "shadow_method");
-	int sh_size = BKE_collection_engine_property_value_get_int(props, "shadow_size");
+	int sh_cube_size = BKE_collection_engine_property_value_get_int(props, "shadow_cube_size");
+	int sh_cascade_size = BKE_collection_engine_property_value_get_int(props, "shadow_cascade_size");
 	int sh_high_bitdepth = BKE_collection_engine_property_value_get_int(props, "shadow_high_bitdepth");
 
 	EEVEE_LampsInfo *linfo = sldata->lamps;
-	if ((linfo->shadow_size != sh_size) ||
+	if ((linfo->shadow_cube_size != sh_cube_size) ||
 	    (linfo->shadow_method != sh_method) ||
 	    (linfo->shadow_high_bitdepth != sh_high_bitdepth))
 	{
-		BLI_assert((sh_size > 0) && (sh_size <= 8192));
-		DRW_TEXTURE_FREE_SAFE(sldata->shadow_pool);
+		BLI_assert((sh_cube_size > 0) && (sh_cube_size <= 8192));
+		DRW_TEXTURE_FREE_SAFE(sldata->shadow_cube_pool);
 		DRW_TEXTURE_FREE_SAFE(sldata->shadow_cube_target);
-		DRW_TEXTURE_FREE_SAFE(sldata->shadow_cascade_target);
 		DRW_TEXTURE_FREE_SAFE(sldata->shadow_cube_blur);
-		DRW_TEXTURE_FREE_SAFE(sldata->shadow_cascade_blur);
-
-		linfo->shadow_high_bitdepth = sh_high_bitdepth;
-		linfo->shadow_method = sh_method;
-		linfo->shadow_size = sh_size;
-		linfo->shadow_render_data.stored_texel_size = 1.0 / (float)linfo->shadow_size;
 
 		/* Compute adequate size for the cubemap render target.
 		 * The 3.0f factor is here to make sure there is no under sampling between
 		 * the octahedron mapping and the cubemap. */
-		int new_cube_target_size = (int)ceil(sqrt((float)(sh_size * sh_size) / 6.0f) * 3.0f);
+		int new_cube_target_size = (int)ceil(sqrt((float)(sh_cube_size * sh_cube_size) / 6.0f) * 3.0f);
 
 		CLAMP(new_cube_target_size, 1, 4096);
 
@@ -160,6 +154,21 @@ void EEVEE_lights_init(EEVEE_ViewLayerData *sldata)
 		linfo->shadow_render_data.cube_texel_size = 1.0 / (float)linfo->shadow_cube_target_size;
 	}
 
+	if ((linfo->shadow_cascade_size != sh_cascade_size) ||
+	    (linfo->shadow_method != sh_method) ||
+	    (linfo->shadow_high_bitdepth != sh_high_bitdepth))
+	{
+		BLI_assert((sh_cascade_size > 0) && (sh_cascade_size <= 8192));
+		DRW_TEXTURE_FREE_SAFE(sldata->shadow_cascade_pool);
+		DRW_TEXTURE_FREE_SAFE(sldata->shadow_cascade_target);
+		DRW_TEXTURE_FREE_SAFE(sldata->shadow_cascade_blur);
+	}
+
+	linfo->shadow_high_bitdepth = sh_high_bitdepth;
+	linfo->shadow_method = sh_method;
+	linfo->shadow_cube_size = sh_cube_size;
+	linfo->shadow_cascade_size = sh_cascade_size;
+
 	/* only compile the ones needed. reduce startup time. */
 	if ((sh_method == SHADOW_ESM) && !e_data.shadow_store_cube_sh[SHADOW_ESM]) {
 		DynStr *ds_frag = BLI_dynstr_new();
@@ -223,7 +232,8 @@ void EEVEE_lights_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
 
 	linfo->shcaster_frontbuffer->count = 0;
 	linfo->num_light = 0;
-	linfo->num_layer = 0;
+	linfo->num_cube_layer = 0;
+	linfo->num_cascade_layer = 0;
 	linfo->gpu_cube_ct = linfo->gpu_cascade_ct = linfo->gpu_shadow_ct = 0;
 	linfo->cpu_cube_ct = linfo->cpu_cascade_ct = 0;
 	memset(linfo->light_ref, 0, sizeof(linfo->light_ref));
@@ -331,12 +341,12 @@ void EEVEE_lights_cache_add(EEVEE_ViewLayerData *sldata, Object *ob)
 					EEVEE_ShadowCascadeData *data = &led->data.scad;
 					data->shadow_id = linfo->gpu_shadow_ct;
 					data->cascade_id = linfo->gpu_cascade_ct;
-					data->layer_id = linfo->num_layer;
+					data->layer_id = linfo->num_cascade_layer;
 
 					/* Increment indices. */
 					linfo->gpu_shadow_ct += 1;
 					linfo->gpu_cascade_ct += sh_nbr;
-					linfo->num_layer += sh_nbr * cascade_nbr;
+					linfo->num_cascade_layer += sh_nbr * cascade_nbr;
 
 					linfo->cpu_cascade_ct += 1;
 				}
@@ -365,12 +375,12 @@ void EEVEE_lights_cache_add(EEVEE_ViewLayerData *sldata, Object *ob)
 					/* Store indices. */
 					data->shadow_id = linfo->gpu_shadow_ct;
 					data->cube_id = linfo->gpu_cube_ct;
-					data->layer_id = linfo->num_layer;
+					data->layer_id = linfo->num_cube_layer;
 
 					/* Increment indices. */
 					linfo->gpu_shadow_ct += 1;
 					linfo->gpu_cube_ct += sh_nbr;
-					linfo->num_layer += sh_nbr;
+					linfo->num_cube_layer += sh_nbr;
 
 					linfo->cpu_cube_ct += 1;
 				}
@@ -478,9 +488,15 @@ void EEVEE_lights_cache_finish(EEVEE_ViewLayerData *sldata)
 
 	/* Setup enough layers. */
 	/* Free textures if number mismatch. */
-	if (linfo->num_layer != linfo->cache_num_layer) {
-		DRW_TEXTURE_FREE_SAFE(sldata->shadow_pool);
-		linfo->cache_num_layer = linfo->num_layer;
+	if (linfo->num_cube_layer != linfo->cache_num_cube_layer) {
+		DRW_TEXTURE_FREE_SAFE(sldata->shadow_cube_pool);
+		linfo->cache_num_cube_layer = linfo->num_cube_layer;
+		linfo->update_flag |= LIGHT_UPDATE_SHADOW_CUBE;
+	}
+
+	if (linfo->num_cube_layer != linfo->cache_num_cube_layer) {
+		DRW_TEXTURE_FREE_SAFE(sldata->shadow_cube_pool);
+		linfo->cache_num_cube_layer = linfo->num_cube_layer;
 		linfo->update_flag |= LIGHT_UPDATE_SHADOW_CUBE;
 	}
 
@@ -492,27 +508,29 @@ void EEVEE_lights_cache_finish(EEVEE_ViewLayerData *sldata)
 			break;
 	}
 
+	/* Cubemaps */
 	if (!sldata->shadow_cube_target) {
-		/* TODO render everything on the same 2d render target using clip planes and no Geom Shader. */
-		/* Cubemaps */
 		sldata->shadow_cube_target = DRW_texture_create_cube(
 		        linfo->shadow_cube_target_size, GPU_DEPTH_COMPONENT24, 0, NULL);
 		sldata->shadow_cube_blur = DRW_texture_create_cube(
 		        linfo->shadow_cube_target_size, shadow_pool_format, DRW_TEX_FILTER, NULL);
 	}
+	if (!sldata->shadow_cube_pool) {
+		sldata->shadow_cube_pool = DRW_texture_create_2D_array(
+		        linfo->shadow_cube_size, linfo->shadow_cube_size, max_ff(1, linfo->num_cube_layer),
+		        shadow_pool_format, DRW_TEX_FILTER, NULL);
+	}
 
+	/* CSM */
 	if (!sldata->shadow_cascade_target) {
-		/* CSM */
 		sldata->shadow_cascade_target = DRW_texture_create_2D_array(
-		        linfo->shadow_size, linfo->shadow_size, MAX_CASCADE_NUM, GPU_DEPTH_COMPONENT24, 0, NULL);
+		        linfo->shadow_cascade_size, linfo->shadow_cascade_size, MAX_CASCADE_NUM, GPU_DEPTH_COMPONENT24, 0, NULL);
 		sldata->shadow_cascade_blur = DRW_texture_create_2D_array(
-		        linfo->shadow_size, linfo->shadow_size, MAX_CASCADE_NUM, shadow_pool_format, DRW_

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list