[Bf-blender-cvs] [873acfb124f] temp-eeveelightcache: Eevee: LightCache: Finish basic cache support.

Clément Foucault noreply at git.blender.org
Fri Jun 22 17:46:25 CEST 2018


Commit: 873acfb124f43246e74b8a41f123c9987dfbfc5f
Author: Clément Foucault
Date:   Wed Jun 20 15:30:58 2018 +0200
Branches: temp-eeveelightcache
https://developer.blender.org/rB873acfb124f43246e74b8a41f123c9987dfbfc5f

Eevee: LightCache: Finish basic cache support.

Still missing: Multi bounce support.

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

M	source/blender/draw/engines/eevee/eevee_engine.c
M	source/blender/draw/engines/eevee/eevee_lightcache.c
M	source/blender/draw/engines/eevee/eevee_private.h
M	source/blender/draw/engines/eevee/eevee_render.c
M	source/blender/draw/engines/eevee/shaders/lit_surface_frag.glsl
M	source/blender/draw/intern/draw_manager.c

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

diff --git a/source/blender/draw/engines/eevee/eevee_engine.c b/source/blender/draw/engines/eevee/eevee_engine.c
index cecc76ec96a..24d2934cf91 100644
--- a/source/blender/draw/engines/eevee/eevee_engine.c
+++ b/source/blender/draw/engines/eevee/eevee_engine.c
@@ -123,7 +123,7 @@ static void eevee_cache_init(void *vedata)
 	EEVEE_volumes_cache_init(sldata, vedata);
 }
 
-static void eevee_cache_populate(void *vedata, Object *ob)
+void EEVEE_cache_populate(void *vedata, Object *ob)
 {
 	EEVEE_ViewLayerData *sldata = EEVEE_view_layer_data_ensure();
 
@@ -440,7 +440,7 @@ DrawEngineType draw_engine_eevee_type = {
 	&eevee_engine_init,
 	&eevee_engine_free,
 	&eevee_cache_init,
-	&eevee_cache_populate,
+	&EEVEE_cache_populate,
 	&eevee_cache_finish,
 	&eevee_draw_background,
 	NULL, /* Everything is drawn in the background pass (see comment on function) */
diff --git a/source/blender/draw/engines/eevee/eevee_lightcache.c b/source/blender/draw/engines/eevee/eevee_lightcache.c
index dac79c413e5..5a7fe9aa22d 100644
--- a/source/blender/draw/engines/eevee/eevee_lightcache.c
+++ b/source/blender/draw/engines/eevee/eevee_lightcache.c
@@ -114,6 +114,7 @@ typedef struct EEVEE_LightBake {
 	/* Reflection probe */
 	EEVEE_LightProbe *cube;          /* Current probe being rendered (UBO data). */
 	int ref_cube_res;                /* Target cubemap at MIP 0. */
+	int cube_offset;                 /* Index of the current cube. */
 	float probemat[6][4][4];         /* ViewProjection matrix for each cube face. */
 	float texel_size, padding_size;  /* Texel and padding size for the final octahedral map. */
 	float roughness;                 /* Roughness level of the current mipmap. */
@@ -432,13 +433,19 @@ static void eevee_lightbake_cache_create(EEVEE_Data *vedata, EEVEE_LightBake *lb
 
 	EEVEE_effects_cache_init(sldata, vedata);
 	EEVEE_materials_cache_init(sldata, vedata);
-	EEVEE_lightbake_cache_init(sldata, vedata, lbake->rt_color, lbake->rt_depth);
+	EEVEE_lights_cache_init(sldata, vedata);
 	EEVEE_lightprobes_cache_init(sldata, vedata);
 
+	EEVEE_lightbake_cache_init(sldata, vedata, lbake->rt_color, lbake->rt_depth);
+
+	DRW_render_object_iter(vedata, NULL, lbake->depsgraph, EEVEE_render_cache);
+
 	EEVEE_materials_cache_finish(vedata);
+	EEVEE_lights_cache_finish(sldata);
 	EEVEE_lightprobes_cache_finish(sldata, vedata);
 
 	DRW_render_instance_buffer_finish();
+	DRW_hair_update();
 }
 
 static void eevee_lightbake_render_world(void *ved, void *user_data)
@@ -467,6 +474,22 @@ static void eevee_lightbake_render_world(void *ved, void *user_data)
 	lcache->flag &= ~LIGHTCACHE_UPDATE_WORLD;
 }
 
+static void cell_id_to_grid_loc(EEVEE_LightGrid *egrid, int cell_idx, int r_local_cell[3])
+{
+	/* Keep in sync with lightprobe_grid_display_vert */
+	r_local_cell[2] = cell_idx % egrid->resolution[2];
+	r_local_cell[1] = (cell_idx / egrid->resolution[2]) % egrid->resolution[1];
+	r_local_cell[0] = cell_idx / (egrid->resolution[2] * egrid->resolution[1]);
+}
+
+static void grid_loc_to_world_loc(EEVEE_LightGrid *egrid, int local_cell[3], float r_pos[3])
+{
+	copy_v3_v3(r_pos, egrid->corner);
+	madd_v3_v3fl(r_pos, egrid->increment_x, local_cell[0]);
+	madd_v3_v3fl(r_pos, egrid->increment_y, local_cell[1]);
+	madd_v3_v3fl(r_pos, egrid->increment_z, local_cell[2]);
+}
+
 static void eevee_lightbake_render_grid_sample(void *ved, void *user_data)
 {
 	EEVEE_Data *vedata = (EEVEE_Data *)ved;
@@ -480,17 +503,17 @@ static void eevee_lightbake_render_grid_sample(void *ved, void *user_data)
 	eevee_lightbake_cache_create(vedata, lbake);
 
 	/* Compute sample position */
+	int grid_loc[3];
 	float pos[3];
-	copy_v3_v3(pos, egrid->corner);
-	madd_v3_v3fl(pos, egrid->increment_x, lbake->grid_sample % prb->grid_resolution_x);
-	madd_v3_v3fl(pos, egrid->increment_y, lbake->grid_sample / prb->grid_resolution_x);
-	madd_v3_v3fl(pos, egrid->increment_z, lbake->grid_sample / (prb->grid_resolution_x * prb->grid_resolution_y));
+	cell_id_to_grid_loc(egrid, lbake->grid_sample, grid_loc);
+	grid_loc_to_world_loc(egrid, grid_loc, pos);
 
 	/* Disable specular lighting when rendering probes to avoid feedback loops (looks bad). */
 	common_data->spec_toggle = false;
 	common_data->prb_num_planar = 0;
 	common_data->prb_num_render_cube = 0;
 	common_data->prb_num_render_grid = 0;
+	egrid->level_bias = 1.0f; /* No bias */
 	DRW_uniformbuffer_update(sldata->common_ubo, &sldata->common_data);
 
 	int sample_offset = egrid->offset + lbake->grid_sample;
@@ -507,6 +530,8 @@ static void eevee_lightbake_render_probe(void *ved, void *user_data)
 	EEVEE_ViewLayerData *sldata = EEVEE_view_layer_data_ensure();
 	EEVEE_CommonUniformBuffer *common_data = &sldata->common_data;
 	EEVEE_LightBake *lbake = (EEVEE_LightBake *)user_data;
+	EEVEE_LightProbe *eprobe = lbake->cube;
+	LightProbe *prb = *lbake->probe;
 
 	/* TODO do this once for the whole bake when we have independant DRWManagers. */
 	eevee_lightbake_cache_create(vedata, lbake);
@@ -517,8 +542,8 @@ static void eevee_lightbake_render_probe(void *ved, void *user_data)
 	common_data->prb_num_render_cube = 0;
 	DRW_uniformbuffer_update(sldata->common_ubo, &sldata->common_data);
 
-	EEVEE_lightbake_render_scene(sldata, vedata, lbake->rt_fb, (float[3]){0.0f}, 1.0f, 10.0f);
-	EEVEE_lightbake_filter_glossy(sldata, vedata, lbake->rt_color, lbake->store_fb, 0, 1.0);
+	EEVEE_lightbake_render_scene(sldata, vedata, lbake->rt_fb, eprobe->position, prb->clipsta, prb->clipend);
+	EEVEE_lightbake_filter_glossy(sldata, vedata, lbake->rt_color, lbake->store_fb, lbake->cube_offset, prb->intensity);
 }
 
 static void eevee_lightbake_gather_probes(EEVEE_LightBake *lbake)
@@ -603,8 +628,7 @@ void EEVEE_lightbake_job(void *custom_data, short *stop, short *do_update, float
 	}
 
 	/* Render irradiance grids */
-	lbake->bounce_curr = 0;
-	while (lbake->bounce_curr < lbake->bounce_count) {
+	for (lbake->bounce_curr = 0; lbake->bounce_curr < lbake->bounce_count; ++lbake->bounce_curr) {
 		lcache->grid_count = 1; /* TODO Remove */
 		/* Bypass world, start at 1. */
 		lbake->probe = lbake->grid_prb + 1;
@@ -620,7 +644,6 @@ void EEVEE_lightbake_job(void *custom_data, short *stop, short *do_update, float
 			}
 			lcache->grid_count += 1;
 		}
-		lbake->bounce_curr += 1;
 	}
 
 	/* Render reflections */
@@ -629,7 +652,7 @@ void EEVEE_lightbake_job(void *custom_data, short *stop, short *do_update, float
 		/* Bypass world, start at 1. */
 		lbake->probe = lbake->cube_prb + 1;
 		lbake->cube = lcache->cube_data + 1;
-		for (int p = 1; p < lbake->cube_count; ++p, lbake->probe++, lbake->grid++) {
+		for (lbake->cube_offset = 1; lbake->cube_offset < lbake->cube_count; ++lbake->cube_offset, lbake->probe++, lbake->cube++) {
 			lightbake_do_sample(lbake, eevee_lightbake_render_probe);
 			lcache->cube_count += 1;
 		}
diff --git a/source/blender/draw/engines/eevee/eevee_private.h b/source/blender/draw/engines/eevee/eevee_private.h
index 591a44e5544..d487a38d388 100644
--- a/source/blender/draw/engines/eevee/eevee_private.h
+++ b/source/blender/draw/engines/eevee/eevee_private.h
@@ -987,6 +987,9 @@ void EEVEE_render_update_passes(struct RenderEngine *engine, struct Scene *scene
 void EEVEE_lookdev_cache_init(EEVEE_Data *vedata, DRWShadingGroup **grp, GPUShader *shader, DRWPass *pass, struct World *world, EEVEE_LightProbesInfo *pinfo);
 void EEVEE_lookdev_draw_background(EEVEE_Data *vedata);
 
+/** eevee_engine.c */
+void EEVEE_cache_populate(void *vedata, Object *ob);
+
 /* Shadow Matrix */
 static const float texcomat[4][4] = { /* From NDC to TexCo */
 	{0.5f, 0.0f, 0.0f, 0.0f},
diff --git a/source/blender/draw/engines/eevee/eevee_render.c b/source/blender/draw/engines/eevee/eevee_render.c
index d24551976f9..935c667d261 100644
--- a/source/blender/draw/engines/eevee/eevee_render.c
+++ b/source/blender/draw/engines/eevee/eevee_render.c
@@ -134,17 +134,20 @@ void EEVEE_render_init(EEVEE_Data *ved, RenderEngine *engine, struct Depsgraph *
 	EEVEE_volumes_cache_init(sldata, vedata);
 }
 
+/* Used by light cache. in this case engine is NULL. */
 void EEVEE_render_cache(
         void *vedata, struct Object *ob,
         struct RenderEngine *engine, struct Depsgraph *UNUSED(depsgraph))
 {
 	EEVEE_ViewLayerData *sldata = EEVEE_view_layer_data_ensure();
-
-	char info[42];
-	BLI_snprintf(info, sizeof(info), "Syncing %s", ob->id.name + 2);
-	RE_engine_update_stats(engine, NULL, info);
 	bool cast_shadow = false;
 
+	if (engine) {
+		char info[42];
+		BLI_snprintf(info, sizeof(info), "Syncing %s", ob->id.name + 2);
+		RE_engine_update_stats(engine, NULL, info);
+	}
+
 	if (ob->base_flag & BASE_VISIBLED) {
 		EEVEE_hair_cache_populate(vedata, sldata, ob, &cast_shadow);
 	}
diff --git a/source/blender/draw/engines/eevee/shaders/lit_surface_frag.glsl b/source/blender/draw/engines/eevee/shaders/lit_surface_frag.glsl
index 644b449c03e..db1357cf884 100644
--- a/source/blender/draw/engines/eevee/shaders/lit_surface_frag.glsl
+++ b/source/blender/draw/engines/eevee/shaders/lit_surface_frag.glsl
@@ -404,7 +404,7 @@ void CLOSURE_NAME(
 		spec_occlu = 1.0;
 	}
 
-	out_spec += spec_accum.rgb * ssr_spec * spec_occlu * float(specToggle);
+	out_spec += spec_accum.rgb * ssr_spec * spec_occlu;
 #endif
 
 #ifdef CLOSURE_REFRACTION
@@ -419,7 +419,12 @@ void CLOSURE_NAME(
 	vec2 C_brdf_lut = texture(utilTex, vec3(C_uv, 1.0)).rg;
 	vec3 C_fresnel = F_ibl(vec3(0.04), brdf_lut) * specular_occlusion(NV, final_ao, C_roughness);
 
-	out_spec += C_spec_accum.rgb * C_fresnel * float(specToggle) * C_intensity;
+	out_spec += C_spec_accum.rgb * C_fresnel * C_intensity;
+#endif
+
+#ifdef CLOSURE_GLOSSY
+	/* Global toggle for lightprobe baking. */
+	out_spec *= float(specToggle);
 #endif
 
 	/* ---------------------------------------------------------------- */
diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c
index a9879ce4b14..cc145f3a91d 100644
--- a/source/blender/draw/intern/draw_manager.c
+++ b/source/blender/draw/intern/draw_manager.c
@@ -1612,6 +1612,8 @@ void DRW_custom_pipeline(
 
 	drw_viewport_var_init();
 
+	DRW_hair_init();
+
 	ViewportEngineData *data = drw_viewport_engine_data_ensure(draw_engine_type);
 
 	/* Execute the callback */



More information about the Bf-blender-cvs mailing list