[Bf-blender-cvs] [39050f6eee1] blender2.8: Eevee: Shadows: Compute Octahedron size from CubeMap size.

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


Commit: 39050f6eee1927e36c88610a35f472390679c43a
Author: Clément Foucault
Date:   Fri May 4 15:59:01 2018 +0200
Branches: blender2.8
https://developer.blender.org/rB39050f6eee1927e36c88610a35f472390679c43a

Eevee: Shadows: Compute Octahedron size from CubeMap size.

This was the otherway around before. But since we can have a different size*
for cube texture now, we can compute the correct-ish texture size.

This will give us on average the same texture appearance when we will add
support for real cubemap shadows.

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

M	source/blender/draw/engines/eevee/eevee_lights.c
M	source/blender/draw/engines/eevee/eevee_private.h

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

diff --git a/source/blender/draw/engines/eevee/eevee_lights.c b/source/blender/draw/engines/eevee/eevee_lights.c
index c123ea033ca..c7dedbeba1a 100644
--- a/source/blender/draw/engines/eevee/eevee_lights.c
+++ b/source/blender/draw/engines/eevee/eevee_lights.c
@@ -143,16 +143,13 @@ void EEVEE_lights_init(EEVEE_ViewLayerData *sldata)
 		DRW_TEXTURE_FREE_SAFE(sldata->shadow_cube_target);
 		DRW_TEXTURE_FREE_SAFE(sldata->shadow_cube_blur);
 
-		/* 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_cube_size * sh_cube_size) / 6.0f) * 3.0f);
+		/* Compute adequate size for the octahedral map. */
+		linfo->shadow_cube_store_size = (int)ceil(sqrt((sh_cube_size * sh_cube_size) * 6.0f));
 
-		CLAMP(new_cube_target_size, 1, 4096);
+		CLAMP(linfo->shadow_cube_store_size, 1, 4096);
 		CLAMP(sh_cube_size, 1, 4096);
 
-		linfo->shadow_cube_target_size = new_cube_target_size;
-		linfo->shadow_render_data.cube_texel_size = 1.0 / (float)linfo->shadow_cube_target_size;
+		linfo->shadow_render_data.cube_texel_size = 1.0f / sh_cube_size;
 	}
 
 	if ((linfo->shadow_cascade_size != sh_cascade_size) ||
@@ -514,13 +511,13 @@ void EEVEE_lights_cache_finish(EEVEE_ViewLayerData *sldata)
 	/* Cubemaps */
 	if (!sldata->shadow_cube_target) {
 		sldata->shadow_cube_target = DRW_texture_create_cube(
-		        linfo->shadow_cube_target_size, GPU_DEPTH_COMPONENT24, 0, NULL);
+		        linfo->shadow_cube_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);
+		        linfo->shadow_cube_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),
+		        linfo->shadow_cube_store_size, linfo->shadow_cube_store_size, max_ff(1, linfo->num_cube_layer),
 		        shadow_pool_format, DRW_TEX_FILTER, NULL);
 	}
 
@@ -1071,7 +1068,7 @@ void EEVEE_draw_shadows(EEVEE_ViewLayerData *sldata, EEVEE_PassList *psl)
 		srd->clip_far = la->clipend;
 		copy_v3_v3(srd->position, ob->obmat[3]);
 
-		srd->stored_texel_size = 1.0 / (float)linfo->shadow_cube_size;
+		srd->stored_texel_size = 1.0 / (float)linfo->shadow_cube_store_size;
 
 		DRW_uniformbuffer_update(sldata->shadow_render_ubo, srd);
 
@@ -1101,10 +1098,11 @@ void EEVEE_draw_shadows(EEVEE_ViewLayerData *sldata, EEVEE_PassList *psl)
 
 		/* 0.001f is arbitrary, but it should be relatively small so that filter size is not too big. */
 		float filter_texture_size = la->soft * 0.001f;
-		float filter_pixel_size = ceil(filter_texture_size / linfo->shadow_render_data.cube_texel_size);
-		linfo->filter_size = linfo->shadow_render_data.cube_texel_size * ((filter_pixel_size > 1.0f) ? 1.5f : 0.0f);
+		float filter_pixel_size = ceil(filter_texture_size / srd->cube_texel_size);
+		linfo->filter_size = srd->cube_texel_size * ((filter_pixel_size > 1.0f) ? 1.5f : 0.0f);
 
 		/* TODO: OPTI: Filter all faces in one/two draw call */
+		/* TODO: OPTI: Don't do this intermediate step if no filter is needed. */
 		for (linfo->current_shadow_face = 0;
 		     linfo->current_shadow_face < 6;
 		     linfo->current_shadow_face++)
@@ -1120,11 +1118,11 @@ void EEVEE_draw_shadows(EEVEE_ViewLayerData *sldata, EEVEE_PassList *psl)
 
 		/* Adjust constants if concentric samples change. */
 		const float max_filter_size = 7.5f;
-		const float previous_box_filter_size = 9.0f; /* Dunno why but that works. */
+		const float magic = 4.5f; /* Dunno why but that works. */
 		const int max_sample = 256;
 
 		if (filter_pixel_size > 2.0f) {
-			linfo->filter_size = linfo->shadow_render_data.cube_texel_size * max_filter_size * previous_box_filter_size;
+			linfo->filter_size = srd->cube_texel_size * max_filter_size * magic;
 			filter_pixel_size = max_ff(0.0f, filter_pixel_size - 3.0f);
 			/* Compute number of concentric samples. Depends directly on filter size. */
 			float pix_size_sqr = filter_pixel_size * filter_pixel_size;
@@ -1217,11 +1215,11 @@ void EEVEE_draw_shadows(EEVEE_ViewLayerData *sldata, EEVEE_PassList *psl)
 
 			/* Adjust constants if concentric samples change. */
 			const float max_filter_size = 7.5f;
-			const float previous_box_filter_size = 3.2f; /* Arbitrary: less banding */
+			const float magic = 3.2f; /* Arbitrary: less banding */
 			const int max_sample = 256;
 
 			if (filter_pixel_size > 2.0f) {
-				linfo->filter_size = srd->stored_texel_size * max_filter_size * previous_box_filter_size;
+				linfo->filter_size = srd->stored_texel_size * max_filter_size * magic;
 				filter_pixel_size = max_ff(0.0f, filter_pixel_size - 3.0f);
 				/* Compute number of concentric samples. Depends directly on filter size. */
 				float pix_size_sqr = filter_pixel_size * filter_pixel_size;
diff --git a/source/blender/draw/engines/eevee/eevee_private.h b/source/blender/draw/engines/eevee/eevee_private.h
index 465e0d4d462..7086351b408 100644
--- a/source/blender/draw/engines/eevee/eevee_private.h
+++ b/source/blender/draw/engines/eevee/eevee_private.h
@@ -351,7 +351,7 @@ typedef struct EEVEE_LampsInfo {
 	int update_flag;
 	int shadow_cube_size, shadow_cascade_size, shadow_method;
 	bool shadow_high_bitdepth;
-	int shadow_cube_target_size;
+	int shadow_cube_store_size;
 	int current_shadow_cascade;
 	int current_shadow_face;
 	unsigned int shadow_instance_count;



More information about the Bf-blender-cvs mailing list