[Bf-blender-cvs] [8713dd16213] temp-eeveelightcache: Eevee: LightCache: More work...
Clément Foucault
noreply at git.blender.org
Fri Jun 22 17:46:15 CEST 2018
Commit: 8713dd16213eca90f63a200cd01cfb6028308fa3
Author: Clément Foucault
Date: Tue Jun 19 16:35:07 2018 +0200
Branches: temp-eeveelightcache
https://developer.blender.org/rB8713dd16213eca90f63a200cd01cfb6028308fa3
Eevee: LightCache: More work...
===================================================================
M source/blender/draw/engines/eevee/eevee_lightcache.c
M source/blender/draw/engines/eevee/eevee_lightcache.h
M source/blender/draw/engines/eevee/eevee_lightprobes.c
M source/blender/draw/engines/eevee/eevee_materials.c
M source/blender/draw/engines/eevee/eevee_private.h
M source/blender/draw/intern/draw_manager.c
===================================================================
diff --git a/source/blender/draw/engines/eevee/eevee_lightcache.c b/source/blender/draw/engines/eevee/eevee_lightcache.c
index 34b01694be4..7c7b5d7b43c 100644
--- a/source/blender/draw/engines/eevee/eevee_lightcache.c
+++ b/source/blender/draw/engines/eevee/eevee_lightcache.c
@@ -164,12 +164,16 @@ static bool EEVEE_lightcache_validate(
}
EEVEE_LightCache *EEVEE_lightcache_create(
+ const int grid_count,
const int cube_count,
const int cube_size,
const int irr_size[3])
{
EEVEE_LightCache *light_cache = MEM_callocN(sizeof(EEVEE_LightCache), "EEVEE_LightCache");
+ light_cache->cube_data = MEM_callocN(sizeof(EEVEE_LightProbe) * cube_count, "EEVEE_LightProbe");
+ light_cache->grid_data = MEM_callocN(sizeof(EEVEE_LightGrid) * grid_count, "EEVEE_LightGrid");
+
light_cache->grid_tx = DRW_texture_create_2D_array(irr_size[0], irr_size[1], irr_size[2], IRRADIANCE_FORMAT, DRW_TEX_FILTER, NULL);
light_cache->cube_tx = DRW_texture_create_2D_array(cube_size, cube_size, cube_count, GPU_R11F_G11F_B10F, DRW_TEX_FILTER | DRW_TEX_MIPMAP, NULL);
light_cache->flag = LIGHTCACHE_UPDATE_WORLD | LIGHTCACHE_UPDATE_CUBE | LIGHTCACHE_UPDATE_GRID;
@@ -277,7 +281,7 @@ static void eevee_lightbake_create_resources(EEVEE_LightBake *lbake)
}
if (lcache == NULL) {
- lcache = EEVEE_lightcache_create(lbake->cube_count, lbake->ref_cube_res, lbake->irr_size);
+ lcache = EEVEE_lightcache_create(lbake->grid_count, lbake->cube_count, lbake->ref_cube_res, lbake->irr_size);
scene_orig->eevee.light_cache = lcache;
}
@@ -344,13 +348,12 @@ static void eevee_lightbake_context_disable(EEVEE_LightBake *lbake)
}
}
-static void eevee_lightbake_render_world(void *ved, void *user_data)
+/* Cache as in draw cache not light cache. */
+static void eevee_lightbake_cache_create(EEVEE_Data *vedata, EEVEE_LightBake *lbake)
{
- EEVEE_Data *vedata = (EEVEE_Data *)ved;
EEVEE_StorageList *stl = vedata->stl;
EEVEE_FramebufferList *fbl = vedata->fbl;
EEVEE_ViewLayerData *sldata = EEVEE_view_layer_data_ensure();
- EEVEE_LightBake *lbake = (EEVEE_LightBake *)user_data;
Scene *scene_eval = DEG_get_evaluated_scene(lbake->depsgraph);
/* Disable all effects BUT high bitdepth shadows. */
scene_eval->eevee.flag &= SCE_EEVEE_SHADOW_HIGH_BITDEPTH;
@@ -376,42 +379,75 @@ static void eevee_lightbake_render_world(void *ved, void *user_data)
EEVEE_lightprobes_init(sldata, vedata);
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_lightprobes_cache_init(sldata, vedata);
+
+ EEVEE_materials_cache_finish(vedata);
EEVEE_lightprobes_cache_finish(sldata, vedata);
DRW_render_instance_buffer_finish();
+}
+static void eevee_lightbake_render_world(void *ved, void *user_data)
+{
+ EEVEE_Data *vedata = (EEVEE_Data *)ved;
+ EEVEE_ViewLayerData *sldata = EEVEE_view_layer_data_ensure();
+ EEVEE_LightBake *lbake = (EEVEE_LightBake *)user_data;
+ Scene *scene_eval = DEG_get_evaluated_scene(lbake->depsgraph);
+ EEVEE_LightCache *lcache = scene_eval->eevee.light_cache;
+
+ /* TODO do this once for the whole bake when we have independant DRWManagers. */
+ eevee_lightbake_cache_create(vedata, lbake);
EEVEE_lightbake_render_world(sldata, vedata, lbake->rt_fb);
- EEVEE_lightbake_filter_glossy(sldata, vedata, lbake->rt_color, lbake->store_fb, 0, 1.0);
- EEVEE_lightbake_filter_diffuse(sldata, vedata, lbake->rt_color, lbake->store_fb, 0, 1.0);
+ EEVEE_lightbake_filter_glossy(sldata, vedata, lbake->rt_color, lbake->store_fb, 0, 1.0f);
+ EEVEE_lightbake_filter_diffuse(sldata, vedata, lbake->rt_color, lbake->store_fb, 0, 1.0f);
+
+ if (lcache->cube_count == 0) {
+ lcache->cube_count = 1;
+ }
+ if (lcache->grid_count == 0) {
+ lcache->grid_count = 1;
+ }
+
+ lcache->flag |= LIGHTCACHE_CUBE_READY | LIGHTCACHE_GRID_READY;
+ lcache->flag &= ~LIGHTCACHE_UPDATE_WORLD;
}
-static void eevee_lightbake_render_probe(void *ved, void *UNUSED(user_data))
+static void eevee_lightbake_render_grid_sample(void *ved, void *user_data)
{
EEVEE_Data *vedata = (EEVEE_Data *)ved;
- EEVEE_StorageList *stl = vedata->stl;
- EEVEE_FramebufferList *fbl = vedata->fbl;
- // EEVEE_LightBake *lbake = user_data;
EEVEE_ViewLayerData *sldata = EEVEE_view_layer_data_ensure();
+ EEVEE_LightBake *lbake = (EEVEE_LightBake *)user_data;
- EEVEE_materials_init(sldata, stl, fbl);
- EEVEE_lights_init(sldata);
- EEVEE_lightprobes_init(sldata, vedata);
+ /* TODO do this once for the whole bake when we have independant DRWManagers. */
+ eevee_lightbake_cache_create(vedata, lbake);
- EEVEE_lightprobes_cache_init(sldata, vedata);
- EEVEE_lights_cache_init(sldata, vedata);
- EEVEE_materials_cache_init(sldata, vedata);
+ /* Compute sample position */
+ /* ... */
- /* Disable specular lighting when rendering probes to avoid feedback loops (looks bad).
- * Disable AO until we find a way to hide really bad discontinuities between cubefaces. */
- // common_data->spec_toggle = false;
- // common_data->ssr_toggle = false;
- // common_data->sss_toggle = false;
- // common_data->ao_settings = 0.0f;
- // common_data->ao_dist = 0.0f;
+ /* Disable specular. */
+ /* ... */
- // EEVEE_lightprobes_refresh_world(sldata, vedata, lbake->rt_fb);
+ EEVEE_lightbake_render_scene(sldata, vedata, lbake->rt_fb, (float[3]){0.0f}, 1.0f, 10.0f);
+ EEVEE_lightbake_filter_diffuse(sldata, vedata, lbake->rt_color, lbake->store_fb, 0, 1.0f);
+ EEVEE_lightbake_filter_visibility(sldata, vedata, lbake->rt_depth, lbake->store_fb, 0, 1.0f, 10.0f, 9.0f, 1.0f, 32);
+}
+
+static void eevee_lightbake_render_probe(void *ved, void *user_data)
+{
+ EEVEE_Data *vedata = (EEVEE_Data *)ved;
+ EEVEE_ViewLayerData *sldata = EEVEE_view_layer_data_ensure();
+ EEVEE_LightBake *lbake = (EEVEE_LightBake *)user_data;
+
+ /* TODO do this once for the whole bake when we have independant DRWManagers. */
+ eevee_lightbake_cache_create(vedata, lbake);
+
+ /* Disable specular. */
+ /* ... */
+
+ 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);
}
static void eevee_lightbake_count_probes(EEVEE_LightBake *lbake)
@@ -478,7 +514,13 @@ void EEVEE_lightbake_update(void *custom_data)
DEG_id_tag_update(&scene->id, DEG_TAG_COPY_ON_WRITE);
}
-void EEVEE_lightbake_job(void *custom_data, short *UNUSED(stop), short *do_update, float *UNUSED(progress))
+static float lightbake_progress_get(EEVEE_LightBake *UNUSED(lbake))
+{
+ /* TODO */
+ return 0.5f;
+}
+
+void EEVEE_lightbake_job(void *custom_data, short *stop, short *do_update, float *progress)
{
EEVEE_LightBake *lbake = (EEVEE_LightBake *)custom_data;
Depsgraph *depsgraph = lbake->depsgraph;
@@ -504,43 +546,44 @@ void EEVEE_lightbake_job(void *custom_data, short *UNUSED(stop), short *do_updat
if (lcache->flag & LIGHTCACHE_UPDATE_WORLD) {
eevee_lightbake_context_enable(lbake);
DRW_custom_pipeline(&draw_engine_eevee_type, depsgraph, eevee_lightbake_render_world, lbake);
+ *progress = lightbake_progress_get(lbake);
*do_update = 1;
eevee_lightbake_context_disable(lbake);
}
-#if 0
/* Render irradiance grids */
lbake->bounce_curr = 0;
+ lbake->bounce_count = 1; /* TODO REMOVE */
while (lbake->bounce_curr < lbake->bounce_count) {
/* Bypass world, start at 1. */
for (int p = 1; p < lbake->grid_count; ++p) {
/* TODO: make DRW manager instanciable (and only lock on drawing) */
- DRW_opengl_context_enable();
-
- /* Create passes */
- /* Iter through objects */
- DRW_opengl_context_disable();
-
- /* Render one cubemap/irradiance sample. */
- if (*stop != 0) {
- return;
+ const int grid_sample_count = 1;
+ for (int s = 0; s < grid_sample_count; ++s) {
+ if (*stop != 0) {
+ break;
+ }
+ eevee_lightbake_context_enable(lbake);
+ DRW_custom_pipeline(&draw_engine_eevee_type, depsgraph, eevee_lightbake_render_grid_sample, lbake);
+ *progress = lightbake_progress_get(lbake);
+ *do_update = 1;
+ eevee_lightbake_context_disable(lbake);
}
}
lbake->bounce_curr += 1;
}
/* Render reflections */
- for (prb in cube_probes) {
- /* Ask for lower importance draw manager lock. */
-
- /* Create passes */
- /* Iter through objects */
- /* Render one cubemap/irradiance sample. */
+ for (int s = 0; s < lbake->cube_count; ++s) {
if (*stop != 0) {
- return;
+ break;
}
+ eevee_lightbake_context_enable(lbake);
+ DRW_custom_pipeline(&draw_engine_eevee_type, depsgraph, eevee_lightbake_render_probe, lbake);
+ *progress = lightbake_progress_get(lbake);
+ *do_update = 1;
+ eevee_lightbake_context_disable(lbake);
}
-#endif
eevee_lightbake_delete_resources(lbake);
}
diff --git a/source/blender/draw/engines/eevee/eevee_lightcache.h b/source/blender/draw/engines/eevee/eevee_lightcache.h
index 92abd43633f..d38fe30e456 100644
--- a/source/blender/draw/engines/eevee/eevee_lightcache.h
+++ b/source/blender/draw/engines/eevee/eevee_lightcache.h
@@ -39,7 +39,7 @@ void EEVEE_lightbake_update(void *custom_data);
void EEVEE_lightbake_job(void *custom_data, short *stop, short *do_update, float *progress);
/* Light Cache */
-struct EEVEE_LightCache *EEVEE_lightcache_create(const int cube_count, const int cube_size, const int irr_size[3]);
+struct EEVEE_LightCache *EEVEE_lightcache_create(const int grid_count, const int cube_count, const int cube_size, const int irr_size[3]);
void EEVEE_lightcache_free(struct EEVEE_LightCache *lcache);
#endif /* __EEVEE_LIGHTCACHE_H__ */
\ No newline at end of file
diff --git a/source/blender/draw/engines/eevee/eevee_lightprobes.c b/source/blender/draw/engines/eevee/eevee_lightprobes.c
index 267a7d1364f..9355a57c633 100644
--- a/source/blender/draw/engines/eevee/eevee_lightprobes.c
+++ b/source/blender/draw/engines/eevee/eevee_lightprobes.c
@@ -581,6 +581,7 @@ void EEVEE_lightprobes_cube_data_from_object(Object *ob, EEVEE_LightProbe *eprob
static void eevee_lightprobes_extract_from_cache(EEVEE_LightProbesInfo *pinfo, EEVEE_LightCache *lcache)
{
/* copy the entire cache for now (up to MAX_PROBE) */
+ /* TODO Frutum cull to only add visible p
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list