[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