[Bf-blender-cvs] [de0c3f563d7] temp-eeveelightcache: Eevee: LightCache: Add back world baking support.
Clément Foucault
noreply at git.blender.org
Fri Jun 22 17:46:12 CEST 2018
Commit: de0c3f563d7ba9458f8e5bfc52faf38adcf5b4ad
Author: Clément Foucault
Date: Mon Jun 18 19:22:13 2018 +0200
Branches: temp-eeveelightcache
https://developer.blender.org/rBde0c3f563d7ba9458f8e5bfc52faf38adcf5b4ad
Eevee: LightCache: Add back world baking support.
===================================================================
M source/blender/draw/engines/eevee/eevee_data.c
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_lights.c
M source/blender/draw/engines/eevee/eevee_private.h
M source/blender/editors/render/render_shading.c
===================================================================
diff --git a/source/blender/draw/engines/eevee/eevee_data.c b/source/blender/draw/engines/eevee/eevee_data.c
index 96372c0dc30..f055ab143d7 100644
--- a/source/blender/draw/engines/eevee/eevee_data.c
+++ b/source/blender/draw/engines/eevee/eevee_data.c
@@ -60,10 +60,6 @@ static void eevee_view_layer_data_free(void *storage)
DRW_UBO_FREE_SAFE(sldata->planar_ubo);
DRW_UBO_FREE_SAFE(sldata->common_ubo);
DRW_UBO_FREE_SAFE(sldata->clip_ubo);
- GPU_FRAMEBUFFER_FREE_SAFE(sldata->probe_filter_fb);
- for (int i = 0; i < 6; ++i) {
- GPU_FRAMEBUFFER_FREE_SAFE(sldata->probe_face_fb[i]);
- }
}
EEVEE_ViewLayerData *EEVEE_view_layer_data_get(void)
diff --git a/source/blender/draw/engines/eevee/eevee_lightcache.c b/source/blender/draw/engines/eevee/eevee_lightcache.c
index da477602839..34b01694be4 100644
--- a/source/blender/draw/engines/eevee/eevee_lightcache.c
+++ b/source/blender/draw/engines/eevee/eevee_lightcache.c
@@ -100,6 +100,7 @@ typedef struct EEVEE_LightBake {
/* Irradiance grid */
int irr_cube_res; /* Target cubemap at MIP 0. */
+ int irr_size[3]; /* Size of the irradiance texture. */
int total_irr_samples; /* Total for all grids */
int bounce_curr, bounce_count; /* The current light bounce being evaluated. */
float vis_range, vis_blur; /* Sample Visibility compression and bluring. */
@@ -126,35 +127,52 @@ typedef struct EEVEE_LightBake {
/** \name Light Cache
* \{ */
+static void irradiance_pool_size_get(int visibility_size, int total_samples, int r_size[3])
+{
+ /* Compute how many irradiance samples we can store per visibility sample. */
+ int irr_per_vis = (visibility_size / IRRADIANCE_SAMPLE_SIZE_X) *
+ (visibility_size / IRRADIANCE_SAMPLE_SIZE_Y);
+
+ /* The irradiance itself take one layer, hence the +1 */
+ int layer_ct = MIN2(irr_per_vis + 1, IRRADIANCE_MAX_POOL_LAYER);
+
+ int texel_ct = (int)ceilf((float)total_samples / (float)(layer_ct - 1));
+ r_size[0] = visibility_size * max_ii(1, min_ii(texel_ct, (IRRADIANCE_MAX_POOL_SIZE / visibility_size)));
+ r_size[1] = visibility_size * max_ii(1, (texel_ct / (IRRADIANCE_MAX_POOL_SIZE / visibility_size)));
+ r_size[2] = layer_ct;
+}
+
static bool EEVEE_lightcache_validate(
const EEVEE_LightCache *light_cache,
- const SceneEEVEE *UNUSED(eevee),
- const int UNUSED(cube_count),
- const int UNUSED(irr_samples))
+ const int cube_count,
+ const int cube_res,
+ const int irr_size[3])
{
if (light_cache) {
- /* TODO if settings and probe count matches... */
- return true;
+ /* See if we need the same amount of texture space. */
+ if ((irr_size[0] == GPU_texture_width(light_cache->grid_tx)) &&
+ (irr_size[1] == GPU_texture_height(light_cache->grid_tx)) &&
+ (irr_size[2] == GPU_texture_layers(light_cache->grid_tx)))
+ {
+ if ((cube_res == GPU_texture_width(light_cache->cube_tx)) &&
+ (cube_count == GPU_texture_layers(light_cache->cube_tx))) {
+ return true;
+ }
+ }
}
return false;
}
EEVEE_LightCache *EEVEE_lightcache_create(
- const SceneEEVEE *UNUSED(eevee),
- const int UNUSED(cube_count),
- const int UNUSED(irr_samples))
+ const int cube_count,
+ const int cube_size,
+ const int irr_size[3])
{
EEVEE_LightCache *light_cache = MEM_callocN(sizeof(EEVEE_LightCache), "EEVEE_LightCache");
- float rgba[4] = {1.0f, 0.0f, 0.0f, 1.0f};
- light_cache->grid_tx = DRW_texture_create_2D_array(1, 1, 1, IRRADIANCE_FORMAT, DRW_TEX_FILTER, rgba);
- light_cache->cube_tx = DRW_texture_create_2D_array(1, 1, 1, GPU_RGBA8, DRW_TEX_FILTER, rgba);
-
- // int irr_size[3];
- // irradiance_pool_size_get(lbake->vis_res, lbake->total_irr_samples, irr_size);
-
- // 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(lbake->ref_cube_res, lbake->ref_cube_res, lcache->cube_count, GPU_RGBA8, DRW_TEX_FILTER, NULL);
+ 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;
return light_cache;
}
@@ -191,6 +209,9 @@ void *EEVEE_lightbake_job_data_alloc(struct Main *bmain, struct ViewLayer *view_
DEG_graph_relations_update(lbake->depsgraph, bmain, scene, view_layer);
+ int frame = 0; /* TODO make it user param. */
+ DEG_evaluate_on_framechange(lbake->bmain, lbake->depsgraph, frame);
+
return lbake;
}
@@ -206,21 +227,6 @@ void EEVEE_lightbake_job_data_free(void *custom_data)
MEM_freeN(lbake);
}
-static void irradiance_pool_size_get(int visibility_size, int total_samples, int r_size[3])
-{
- /* Compute how many irradiance samples we can store per visibility sample. */
- int irr_per_vis = (visibility_size / IRRADIANCE_SAMPLE_SIZE_X) *
- (visibility_size / IRRADIANCE_SAMPLE_SIZE_Y);
-
- /* The irradiance itself take one layer, hence the +1 */
- int layer_ct = MIN2(irr_per_vis + 1, IRRADIANCE_MAX_POOL_LAYER);
-
- int texel_ct = (int)ceilf((float)total_samples / (float)(layer_ct - 1));
- r_size[0] = visibility_size * max_ii(1, min_ii(texel_ct, (IRRADIANCE_MAX_POOL_SIZE / visibility_size)));
- r_size[1] = visibility_size * max_ii(1, (texel_ct / (IRRADIANCE_MAX_POOL_SIZE / visibility_size)));
- r_size[2] = layer_ct;
-}
-
static void eevee_lightbake_create_resources(EEVEE_LightBake *lbake)
{
Scene *scene_eval = DEG_get_evaluated_scene(lbake->depsgraph);
@@ -231,8 +237,7 @@ static void eevee_lightbake_create_resources(EEVEE_LightBake *lbake)
lbake->vis_res = eevee->gi_visibility_resolution;
lbake->rt_res = eevee->gi_cubemap_resolution;
- //lbake->ref_cube_res = octahedral_from_cubemap();
- lbake->ref_cube_res = lbake->rt_res;
+ lbake->ref_cube_res = OCTAHEDRAL_SIZE_FROM_CUBESIZE(lbake->rt_res);
lbake->cube_prb = MEM_callocN(sizeof(LightProbe *) * lbake->cube_count, "EEVEE Cube visgroup ptr");
lbake->grid_prb = MEM_callocN(sizeof(LightProbe *) * lbake->grid_count, "EEVEE Grid visgroup ptr");
@@ -248,24 +253,31 @@ static void eevee_lightbake_create_resources(EEVEE_LightBake *lbake)
});
}
- int irr_size[3];
- irradiance_pool_size_get(lbake->vis_res, lbake->total_irr_samples, irr_size);
+ GPU_framebuffer_ensure_config(&lbake->store_fb, {
+ GPU_ATTACHMENT_NONE,
+ GPU_ATTACHMENT_NONE
+ });
+
+ irradiance_pool_size_get(lbake->vis_res, lbake->total_irr_samples, lbake->irr_size);
- lbake->grid_prev = DRW_texture_create_2D_array(irr_size[0], irr_size[1], irr_size[2], IRRADIANCE_FORMAT, DRW_TEX_FILTER, NULL);
+ lbake->grid_prev = DRW_texture_create_2D_array(lbake->irr_size[0], lbake->irr_size[1], lbake->irr_size[2],
+ IRRADIANCE_FORMAT, DRW_TEX_FILTER, NULL);
/* Ensure Light Cache is ready to accept new data. If not recreate one.
* WARNING: All the following must be threadsafe. It's currently protected
* by the DRW mutex. */
EEVEE_LightCache *lcache = scene_orig->eevee.light_cache;
- SceneEEVEE *sce_eevee = &scene_orig->eevee;
- if (lcache != NULL && !EEVEE_lightcache_validate(lcache, sce_eevee, lbake->cube_count, lbake->total_irr_samples)) {
+ /* TODO validate irradiance and reflection cache independantly... */
+ if (lcache != NULL &&
+ !EEVEE_lightcache_validate(lcache, lbake->cube_count, lbake->ref_cube_res, lbake->irr_size))
+ {
EEVEE_lightcache_free(lcache);
scene_orig->eevee.light_cache = lcache = NULL;
}
if (lcache == NULL) {
- lcache = EEVEE_lightcache_create(sce_eevee, lbake->cube_count, lbake->total_irr_samples);
+ lcache = EEVEE_lightcache_create(lbake->cube_count, lbake->ref_cube_res, lbake->irr_size);
scene_orig->eevee.light_cache = lcache;
}
@@ -287,6 +299,7 @@ static void eevee_lightbake_delete_resources(EEVEE_LightBake *lbake)
DRW_TEXTURE_FREE_SAFE(lbake->rt_depth);
DRW_TEXTURE_FREE_SAFE(lbake->rt_color);
DRW_TEXTURE_FREE_SAFE(lbake->grid_prev);
+ GPU_FRAMEBUFFER_FREE_SAFE(lbake->store_fb);
for (int i = 0; i < 6; ++i) {
GPU_FRAMEBUFFER_FREE_SAFE(lbake->rt_fb[i]);
}
@@ -331,20 +344,47 @@ static void eevee_lightbake_context_disable(EEVEE_LightBake *lbake)
}
}
-static void eevee_lightbake_render_world(void *ved, void *UNUSED(user_data))
+static void eevee_lightbake_render_world(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;
+ 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;
+ scene_eval->eevee.taa_samples = 1;
+
+ stl->g_data = MEM_callocN(sizeof(*stl->g_data), __func__);
+ stl->g_data->background_alpha = 1.0f;
+
+ /* XXX TODO remove this. This is in order to make the init functions work. */
+ DRWMatrixState dummy_mats = {{{{0}}}};
+ DRW_viewport_matrix_override_set_all(&dummy_mats);
+
+ if (sldata->common_ubo == NULL) {
+ sldata->common_ubo = DRW_uniformbuffer_create(sizeof(sldata->common_data), &sldata->common_data);
+ }
+ if (sldata->clip_ubo == NULL) {
+ sldata->clip_ubo = DRW_uniformbuffer_create(sizeof(sldata->clip_data), &sldata->clip_data);
+ }
+ EEVEE_effects_init(sldata, vedata, NULL);
EEVEE_materials_init(sldata, stl, fbl);
EEVEE_lights_init(sldata);
EEVEE_lightprobes_init(sldata, vedata);
+ EEVEE_effects_cache_init(sldata, vedata);
+ EEVEE_lightbake_cache_init(sldata, vedata, lbake->rt_color, lbake->rt_depth);
EEVEE_lightprobes_cache_init(sldata, vedata);
- EEVEE_lightprobes_refresh_world(sldata, vedata);
+ EEVEE_lightprobes_cache_finish(sldata, vedata);
+
+ DRW_render_instance_buffer_finish();
+
+ EEVEE_lightbake_render_world(sldata, vedata, lbake->rt_fb);
+ EEVEE_lightbake_
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list