diff options
-rw-r--r-- | source/blender/draw/CMakeLists.txt | 1 | ||||
-rw-r--r-- | source/blender/draw/engines/eevee/eevee_effects.c | 19 | ||||
-rw-r--r-- | source/blender/draw/engines/eevee/eevee_engine.c | 2 | ||||
-rw-r--r-- | source/blender/draw/engines/eevee/eevee_lightprobes.c | 200 | ||||
-rw-r--r-- | source/blender/draw/engines/eevee/eevee_lookdev.c | 3 | ||||
-rw-r--r-- | source/blender/draw/engines/eevee/eevee_materials.c | 2 | ||||
-rw-r--r-- | source/blender/draw/engines/eevee/eevee_private.h | 20 | ||||
-rw-r--r-- | source/blender/draw/engines/eevee/eevee_shaders.c | 306 | ||||
-rw-r--r-- | source/blender/draw/engines/eevee/eevee_temporal_sampling.c | 36 |
9 files changed, 360 insertions, 229 deletions
diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt index be742868cd6..2097fb66c8b 100644 --- a/source/blender/draw/CMakeLists.txt +++ b/source/blender/draw/CMakeLists.txt @@ -105,6 +105,7 @@ set(SRC engines/eevee/eevee_occlusion.c engines/eevee/eevee_render.c engines/eevee/eevee_screen_raytrace.c + engines/eevee/eevee_shaders.c engines/eevee/eevee_subsurface.c engines/eevee/eevee_temporal_sampling.c engines/eevee/eevee_volumes.c diff --git a/source/blender/draw/engines/eevee/eevee_effects.c b/source/blender/draw/engines/eevee/eevee_effects.c index 687d5035ea2..48a73ccef18 100644 --- a/source/blender/draw/engines/eevee/eevee_effects.c +++ b/source/blender/draw/engines/eevee/eevee_effects.c @@ -52,9 +52,6 @@ static struct { struct GPUShader *downsample_sh; struct GPUShader *downsample_cube_sh; - /* Velocity Resolve */ - struct GPUShader *velocity_resolve_sh; - /* Theses are just references, not actually allocated */ struct GPUTexture *depth_src; struct GPUTexture *color_src; @@ -66,25 +63,15 @@ static struct { extern char datatoc_common_uniforms_lib_glsl[]; extern char datatoc_common_view_lib_glsl[]; extern char datatoc_bsdf_common_lib_glsl[]; -extern char datatoc_effect_velocity_resolve_frag_glsl[]; extern char datatoc_effect_minmaxz_frag_glsl[]; extern char datatoc_effect_downsample_frag_glsl[]; extern char datatoc_effect_downsample_cube_frag_glsl[]; extern char datatoc_lightprobe_vert_glsl[]; extern char datatoc_lightprobe_geom_glsl[]; + static void eevee_create_shader_downsample(void) { - char *frag_str = BLI_string_joinN( - datatoc_common_uniforms_lib_glsl, - datatoc_common_view_lib_glsl, - datatoc_bsdf_common_lib_glsl, - datatoc_effect_velocity_resolve_frag_glsl); - - e_data.velocity_resolve_sh = DRW_shader_create_fullscreen(frag_str, NULL); - - MEM_freeN(frag_str); - e_data.downsample_sh = DRW_shader_create_fullscreen(datatoc_effect_downsample_frag_glsl, NULL); e_data.downsample_cube_sh = DRW_shader_create( datatoc_lightprobe_vert_glsl, @@ -377,7 +364,7 @@ void EEVEE_effects_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata) /* This pass compute camera motions to the non moving objects. */ psl->velocity_resolve = DRW_pass_create( "Velocity Resolve", DRW_STATE_WRITE_COLOR); - DRWShadingGroup *grp = DRW_shgroup_create(e_data.velocity_resolve_sh, psl->velocity_resolve); + DRWShadingGroup *grp = DRW_shgroup_create(EEVEE_shaders_velocity_resolve_sh_get(), psl->velocity_resolve); DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", &e_data.depth_src); DRW_shgroup_uniform_block(grp, "common_block", sldata->common_ubo); DRW_shgroup_uniform_mat4(grp, "currPersinv", effects->velocity_curr_persinv); @@ -576,8 +563,6 @@ void EEVEE_draw_effects(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data *vedata) void EEVEE_effects_free(void) { - DRW_SHADER_FREE_SAFE(e_data.velocity_resolve_sh); - DRW_SHADER_FREE_SAFE(e_data.downsample_sh); DRW_SHADER_FREE_SAFE(e_data.downsample_cube_sh); diff --git a/source/blender/draw/engines/eevee/eevee_engine.c b/source/blender/draw/engines/eevee/eevee_engine.c index e9d67b73a0d..aa2cf3fede3 100644 --- a/source/blender/draw/engines/eevee/eevee_engine.c +++ b/source/blender/draw/engines/eevee/eevee_engine.c @@ -436,6 +436,7 @@ static void eevee_render_to_image(void *vedata, RenderEngine *engine, struct Ren static void eevee_engine_free(void) { + EEVEE_shaders_free(); EEVEE_bloom_free(); EEVEE_depth_of_field_free(); EEVEE_effects_free(); @@ -447,7 +448,6 @@ static void eevee_engine_free(void) EEVEE_occlusion_free(); EEVEE_screen_raytrace_free(); EEVEE_subsurface_free(); - EEVEE_temporal_sampling_free(); EEVEE_volumes_free(); } diff --git a/source/blender/draw/engines/eevee/eevee_lightprobes.c b/source/blender/draw/engines/eevee/eevee_lightprobes.c index 37276987f8d..a636eac8b93 100644 --- a/source/blender/draw/engines/eevee/eevee_lightprobes.c +++ b/source/blender/draw/engines/eevee/eevee_lightprobes.c @@ -54,20 +54,7 @@ #include "WM_api.h" #include "WM_types.h" -#define HAMMERSLEY_SIZE 1024 - static struct { - struct GPUShader *probe_default_sh; - struct GPUShader *probe_default_studiolight_sh; - struct GPUShader *probe_filter_glossy_sh; - struct GPUShader *probe_filter_diffuse_sh; - struct GPUShader *probe_filter_visibility_sh; - struct GPUShader *probe_grid_fill_sh; - struct GPUShader *probe_grid_display_sh; - struct GPUShader *probe_planar_display_sh; - struct GPUShader *probe_planar_downsample_sh; - struct GPUShader *probe_cube_display_sh; - struct GPUTexture *hammersley; struct GPUTexture *planar_pool_placeholder; struct GPUTexture *depth_placeholder; @@ -78,31 +65,6 @@ static struct { struct GPUVertFormat *format_probe_display_planar; } e_data = {NULL}; /* Engine data */ -extern char datatoc_background_vert_glsl[]; -extern char datatoc_default_world_frag_glsl[]; -extern char datatoc_lightprobe_filter_glossy_frag_glsl[]; -extern char datatoc_lightprobe_filter_diffuse_frag_glsl[]; -extern char datatoc_lightprobe_filter_visibility_frag_glsl[]; -extern char datatoc_lightprobe_geom_glsl[]; -extern char datatoc_lightprobe_vert_glsl[]; -extern char datatoc_lightprobe_planar_display_frag_glsl[]; -extern char datatoc_lightprobe_planar_display_vert_glsl[]; -extern char datatoc_lightprobe_planar_downsample_frag_glsl[]; -extern char datatoc_lightprobe_planar_downsample_geom_glsl[]; -extern char datatoc_lightprobe_planar_downsample_vert_glsl[]; -extern char datatoc_lightprobe_cube_display_frag_glsl[]; -extern char datatoc_lightprobe_cube_display_vert_glsl[]; -extern char datatoc_lightprobe_grid_display_frag_glsl[]; -extern char datatoc_lightprobe_grid_display_vert_glsl[]; -extern char datatoc_lightprobe_grid_fill_frag_glsl[]; -extern char datatoc_irradiance_lib_glsl[]; -extern char datatoc_lightprobe_lib_glsl[]; -extern char datatoc_octahedron_lib_glsl[]; -extern char datatoc_bsdf_common_lib_glsl[]; -extern char datatoc_common_uniforms_lib_glsl[]; -extern char datatoc_common_view_lib_glsl[]; -extern char datatoc_bsdf_sampling_lib_glsl[]; - extern GlobalsUboStorage ts; /* *********** FUNCTIONS *********** */ @@ -185,121 +147,6 @@ static void planar_pool_ensure_alloc(EEVEE_Data *vedata, int num_planar_ref) } } -static void lightprobe_shaders_init(void) -{ - const char *filter_defines = "#define HAMMERSLEY_SIZE " STRINGIFY(HAMMERSLEY_SIZE) "\n" -#if defined(IRRADIANCE_SH_L2) - "#define IRRADIANCE_SH_L2\n" -#elif defined(IRRADIANCE_CUBEMAP) - "#define IRRADIANCE_CUBEMAP\n" -#elif defined(IRRADIANCE_HL2) - "#define IRRADIANCE_HL2\n" -#endif - "#define NOISE_SIZE 64\n"; - - char *shader_str = NULL; - char *vert_str = NULL; - - shader_str = BLI_string_joinN( - datatoc_common_view_lib_glsl, - datatoc_common_uniforms_lib_glsl, - datatoc_bsdf_common_lib_glsl, - datatoc_bsdf_sampling_lib_glsl, - datatoc_lightprobe_filter_glossy_frag_glsl); - - e_data.probe_filter_glossy_sh = DRW_shader_create( - datatoc_lightprobe_vert_glsl, datatoc_lightprobe_geom_glsl, shader_str, filter_defines); - - e_data.probe_default_sh = DRW_shader_create( - datatoc_background_vert_glsl, NULL, datatoc_default_world_frag_glsl, NULL); - - e_data.probe_default_studiolight_sh = DRW_shader_create( - datatoc_background_vert_glsl, NULL, datatoc_default_world_frag_glsl, "#define LOOKDEV\n"); - - MEM_freeN(shader_str); - - shader_str = BLI_string_joinN( - datatoc_common_view_lib_glsl, - datatoc_common_uniforms_lib_glsl, - datatoc_bsdf_common_lib_glsl, - datatoc_bsdf_sampling_lib_glsl, - datatoc_lightprobe_filter_diffuse_frag_glsl); - - e_data.probe_filter_diffuse_sh = DRW_shader_create_fullscreen(shader_str, filter_defines); - - MEM_freeN(shader_str); - - shader_str = BLI_string_joinN( - datatoc_common_view_lib_glsl, - datatoc_common_uniforms_lib_glsl, - datatoc_bsdf_common_lib_glsl, - datatoc_bsdf_sampling_lib_glsl, - datatoc_lightprobe_filter_visibility_frag_glsl); - - e_data.probe_filter_visibility_sh = DRW_shader_create_fullscreen(shader_str, filter_defines); - - MEM_freeN(shader_str); - - shader_str = BLI_string_joinN( - datatoc_octahedron_lib_glsl, - datatoc_common_view_lib_glsl, - datatoc_common_uniforms_lib_glsl, - datatoc_bsdf_common_lib_glsl, - datatoc_irradiance_lib_glsl, - datatoc_lightprobe_lib_glsl, - datatoc_lightprobe_grid_display_frag_glsl); - - vert_str = BLI_string_joinN( - datatoc_common_view_lib_glsl, - datatoc_lightprobe_grid_display_vert_glsl); - - e_data.probe_grid_display_sh = DRW_shader_create(vert_str, NULL, shader_str, filter_defines); - - MEM_freeN(vert_str); - MEM_freeN(shader_str); - - e_data.probe_grid_fill_sh = DRW_shader_create_fullscreen( - datatoc_lightprobe_grid_fill_frag_glsl, filter_defines); - - shader_str = BLI_string_joinN( - datatoc_octahedron_lib_glsl, - datatoc_common_view_lib_glsl, - datatoc_common_uniforms_lib_glsl, - datatoc_bsdf_common_lib_glsl, - datatoc_lightprobe_lib_glsl, - datatoc_lightprobe_cube_display_frag_glsl); - - vert_str = BLI_string_joinN( - datatoc_common_view_lib_glsl, - datatoc_lightprobe_cube_display_vert_glsl); - - e_data.probe_cube_display_sh = DRW_shader_create(vert_str, NULL, shader_str, SHADER_DEFINES); - - MEM_freeN(vert_str); - MEM_freeN(shader_str); - - vert_str = BLI_string_joinN( - datatoc_common_view_lib_glsl, - datatoc_lightprobe_planar_display_vert_glsl); - - shader_str = BLI_string_joinN( - datatoc_common_view_lib_glsl, - datatoc_lightprobe_planar_display_frag_glsl); - - e_data.probe_planar_display_sh = DRW_shader_create(vert_str, NULL, shader_str, NULL); - - MEM_freeN(vert_str); - MEM_freeN(shader_str); - - e_data.probe_planar_downsample_sh = DRW_shader_create( - datatoc_lightprobe_planar_downsample_vert_glsl, - datatoc_lightprobe_planar_downsample_geom_glsl, - datatoc_lightprobe_planar_downsample_frag_glsl, - NULL); - - e_data.hammersley = create_hammersley_sample_texture(HAMMERSLEY_SIZE); -} - void EEVEE_lightprobes_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata) { EEVEE_CommonUniformBuffer *common_data = &sldata->common_data; @@ -308,8 +155,9 @@ void EEVEE_lightprobes_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata) const DRWContextState *draw_ctx = DRW_context_state_get(); const Scene *scene_eval = DEG_get_evaluated_scene(draw_ctx->depsgraph); - if (!e_data.probe_filter_glossy_sh) { - lightprobe_shaders_init(); + if (!e_data.hammersley) { + EEVEE_shaders_lightprobe_shaders_init(); + e_data.hammersley = create_hammersley_sample_texture(HAMMERSLEY_SIZE); } /* Use fallback if we don't have gpu texture allocated an we cannot restore them. */ @@ -367,7 +215,9 @@ void EEVEE_lightbake_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, { psl->probe_glossy_compute = DRW_pass_create("LightProbe Glossy Compute", DRW_STATE_WRITE_COLOR); - DRWShadingGroup *grp = DRW_shgroup_create(e_data.probe_filter_glossy_sh, psl->probe_glossy_compute); + DRWShadingGroup *grp = DRW_shgroup_create( + EEVEE_shaders_probe_filter_glossy_sh_get(), psl->probe_glossy_compute); + DRW_shgroup_uniform_float(grp, "intensityFac", &pinfo->intensity_fac, 1); DRW_shgroup_uniform_float(grp, "sampleCount", &pinfo->samples_len, 1); DRW_shgroup_uniform_float(grp, "invSampleCount", &pinfo->samples_len_inv, 1); @@ -390,7 +240,8 @@ void EEVEE_lightbake_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, { psl->probe_diffuse_compute = DRW_pass_create("LightProbe Diffuse Compute", DRW_STATE_WRITE_COLOR); - DRWShadingGroup *grp = DRW_shgroup_create(e_data.probe_filter_diffuse_sh, psl->probe_diffuse_compute); + DRWShadingGroup *grp = DRW_shgroup_create( + EEVEE_shaders_probe_filter_diffuse_sh_get(), psl->probe_diffuse_compute); #ifdef IRRADIANCE_SH_L2 DRW_shgroup_uniform_int(grp, "probeSize", &pinfo->shres, 1); #else @@ -411,7 +262,7 @@ void EEVEE_lightbake_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, { psl->probe_visibility_compute = DRW_pass_create("LightProbe Visibility Compute", DRW_STATE_WRITE_COLOR); - DRWShadingGroup *grp = DRW_shgroup_create(e_data.probe_filter_visibility_sh, psl->probe_visibility_compute); + DRWShadingGroup *grp = DRW_shgroup_create(EEVEE_shaders_probe_filter_visibility_sh_get(), psl->probe_visibility_compute); DRW_shgroup_uniform_int(grp, "outputSize", &pinfo->shres, 1); DRW_shgroup_uniform_float(grp, "visibilityRange", &pinfo->visibility_range, 1); DRW_shgroup_uniform_float(grp, "visibilityBlur", &pinfo->visibility_blur, 1); @@ -431,7 +282,9 @@ void EEVEE_lightbake_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, { psl->probe_grid_fill = DRW_pass_create("LightProbe Grid Floodfill", DRW_STATE_WRITE_COLOR); - DRWShadingGroup *grp = DRW_shgroup_create(e_data.probe_grid_fill_sh, psl->probe_grid_fill); + DRWShadingGroup *grp = DRW_shgroup_create( + EEVEE_shaders_probe_grid_fill_sh_get(), psl->probe_grid_fill); + DRW_shgroup_uniform_texture_ref(grp, "irradianceGrid", &light_cache->grid_tx.tex); struct GPUBatch *geom = DRW_cache_fullscreen_quad_get(); @@ -466,7 +319,7 @@ void EEVEE_lightprobes_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedat float *col = ts.colorBackground; /* LookDev */ - EEVEE_lookdev_cache_init(vedata, &grp, e_data.probe_default_studiolight_sh, psl->probe_background, wo, pinfo); + EEVEE_lookdev_cache_init(vedata, &grp, psl->probe_background, wo, pinfo); /* END */ if (!grp && wo) { col = &wo->horr; @@ -499,7 +352,7 @@ void EEVEE_lightprobes_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedat /* Fallback if shader fails or if not using nodetree. */ if (grp == NULL) { - grp = DRW_shgroup_create(e_data.probe_default_sh, psl->probe_background); + grp = DRW_shgroup_create(EEVEE_shaders_probe_default_sh_get(), psl->probe_background); DRW_shgroup_uniform_vec3(grp, "color", col, 1); DRW_shgroup_uniform_float(grp, "backgroundAlpha", &stl->g_data->background_alpha, 1); DRW_shgroup_call_add(grp, geom, NULL); @@ -513,8 +366,9 @@ void EEVEE_lightprobes_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedat /* Cube Display */ if (scene_eval->eevee.flag & SCE_EEVEE_SHOW_CUBEMAPS && lcache->cube_len > 1) { int cube_len = lcache->cube_len - 1; /* don't count the world. */ - DRWShadingGroup *grp = DRW_shgroup_empty_tri_batch_create(e_data.probe_cube_display_sh, - psl->probe_display, cube_len * 2); + DRWShadingGroup *grp = DRW_shgroup_empty_tri_batch_create( + EEVEE_shaders_probe_cube_display_sh_get(), psl->probe_display, cube_len * 2); + DRW_shgroup_uniform_texture_ref(grp, "probeCubes", &lcache->cube_tx.tex); DRW_shgroup_uniform_block(grp, "probe_block", sldata->probe_ubo); DRW_shgroup_uniform_block(grp, "common_block", sldata->common_ubo); @@ -529,7 +383,9 @@ void EEVEE_lightprobes_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedat if (scene_eval->eevee.flag & SCE_EEVEE_SHOW_IRRADIANCE) { EEVEE_LightGrid *egrid = lcache->grid_data + 1; for (int p = 1; p < lcache->grid_len; ++p, egrid++) { - DRWShadingGroup *shgrp = DRW_shgroup_create(e_data.probe_grid_display_sh, psl->probe_display); + DRWShadingGroup *shgrp = DRW_shgroup_create( + EEVEE_shaders_probe_grid_display_sh_get(), psl->probe_display); + DRW_shgroup_uniform_int(shgrp, "offset", &egrid->offset, 1); DRW_shgroup_uniform_ivec3(shgrp, "grid_resolution", egrid->resolution, 1); DRW_shgroup_uniform_vec3(shgrp, "corner", egrid->corner, 1); @@ -556,7 +412,7 @@ void EEVEE_lightprobes_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedat }); DRWShadingGroup *grp = DRW_shgroup_instance_create( - e_data.probe_planar_display_sh, + EEVEE_shaders_probe_planar_display_sh_get(), psl->probe_display, DRW_cache_quad_get(), e_data.format_probe_display_planar); @@ -570,7 +426,9 @@ void EEVEE_lightprobes_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedat { psl->probe_planar_downsample_ps = DRW_pass_create("LightProbe Planar Downsample", DRW_STATE_WRITE_COLOR); - DRWShadingGroup *grp = DRW_shgroup_create(e_data.probe_planar_downsample_sh, psl->probe_planar_downsample_ps); + DRWShadingGroup *grp = DRW_shgroup_create( + EEVEE_shaders_probe_planar_downsample_sh_get(), psl->probe_planar_downsample_ps); + DRW_shgroup_uniform_texture_ref(grp, "source", &txl->planar_pool); DRW_shgroup_uniform_float(grp, "fireflyFactor", &sldata->common_data.ssr_firefly_fac, 1); DRW_shgroup_call_instances_add(grp, DRW_cache_fullscreen_quad_get(), NULL, (uint *)&pinfo->num_planar); @@ -1374,16 +1232,6 @@ void EEVEE_lightprobes_free(void) { MEM_SAFE_FREE(e_data.format_probe_display_cube); MEM_SAFE_FREE(e_data.format_probe_display_planar); - DRW_SHADER_FREE_SAFE(e_data.probe_default_sh); - DRW_SHADER_FREE_SAFE(e_data.probe_default_studiolight_sh); - DRW_SHADER_FREE_SAFE(e_data.probe_filter_glossy_sh); - DRW_SHADER_FREE_SAFE(e_data.probe_filter_diffuse_sh); - DRW_SHADER_FREE_SAFE(e_data.probe_filter_visibility_sh); - DRW_SHADER_FREE_SAFE(e_data.probe_grid_fill_sh); - DRW_SHADER_FREE_SAFE(e_data.probe_grid_display_sh); - DRW_SHADER_FREE_SAFE(e_data.probe_planar_display_sh); - DRW_SHADER_FREE_SAFE(e_data.probe_planar_downsample_sh); - DRW_SHADER_FREE_SAFE(e_data.probe_cube_display_sh); DRW_TEXTURE_FREE_SAFE(e_data.hammersley); DRW_TEXTURE_FREE_SAFE(e_data.planar_pool_placeholder); DRW_TEXTURE_FREE_SAFE(e_data.depth_placeholder); diff --git a/source/blender/draw/engines/eevee/eevee_lookdev.c b/source/blender/draw/engines/eevee/eevee_lookdev.c index 49cf468711e..dc3af553890 100644 --- a/source/blender/draw/engines/eevee/eevee_lookdev.c +++ b/source/blender/draw/engines/eevee/eevee_lookdev.c @@ -54,7 +54,7 @@ static void eevee_lookdev_lightcache_delete(EEVEE_Data *vedata) } void EEVEE_lookdev_cache_init( - EEVEE_Data *vedata, DRWShadingGroup **grp, GPUShader *shader, DRWPass *pass, + EEVEE_Data *vedata, DRWShadingGroup **grp, DRWPass *pass, World *UNUSED(world), EEVEE_LightProbesInfo *pinfo) { EEVEE_StorageList *stl = vedata->stl; @@ -64,6 +64,7 @@ void EEVEE_lookdev_cache_init( if (LOOK_DEV_STUDIO_LIGHT_ENABLED(v3d)) { StudioLight *sl = BKE_studiolight_find(v3d->shading.studio_light, STUDIOLIGHT_ORIENTATIONS_MATERIAL_MODE); if (sl && (sl->flag & STUDIOLIGHT_ORIENTATION_WORLD)) { + GPUShader *shader = EEVEE_shaders_default_studiolight_sh_get(); struct GPUBatch *geom = DRW_cache_fullscreen_quad_get(); GPUTexture *tex = NULL; diff --git a/source/blender/draw/engines/eevee/eevee_materials.c b/source/blender/draw/engines/eevee/eevee_materials.c index 78d5231a793..d7d9649ad63 100644 --- a/source/blender/draw/engines/eevee/eevee_materials.c +++ b/source/blender/draw/engines/eevee/eevee_materials.c @@ -969,7 +969,7 @@ void EEVEE_materials_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata) float *col = ts.colorBackground; /* LookDev */ - EEVEE_lookdev_cache_init(vedata, &grp, e_data.default_studiolight_background, psl->background_pass, wo, NULL); + EEVEE_lookdev_cache_init(vedata, &grp, psl->background_pass, wo, NULL); /* END */ if (!grp && wo) { diff --git a/source/blender/draw/engines/eevee/eevee_private.h b/source/blender/draw/engines/eevee/eevee_private.h index 5a87f782151..451b1013103 100644 --- a/source/blender/draw/engines/eevee/eevee_private.h +++ b/source/blender/draw/engines/eevee/eevee_private.h @@ -52,6 +52,7 @@ extern struct DrawEngineType draw_engine_eevee_type; // #define IRRADIANCE_SH_L2 // #define IRRADIANCE_CUBEMAP #define IRRADIANCE_HL2 +#define HAMMERSLEY_SIZE 1024 #if defined(IRRADIANCE_SH_L2) # define SHADER_IRRADIANCE "#define IRRADIANCE_SH_L2\n" @@ -871,6 +872,22 @@ void EEVEE_draw_shadows(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata); void EEVEE_lights_free(void); +/* eevee_shaders.c */ +void EEVEE_shaders_lightprobe_shaders_init(void); +struct GPUShader *EEVEE_shaders_probe_filter_glossy_sh_get(void); +struct GPUShader *EEVEE_shaders_probe_default_sh_get(void); +struct GPUShader *EEVEE_shaders_probe_filter_diffuse_sh_get(void); +struct GPUShader *EEVEE_shaders_probe_filter_visibility_sh_get(void); +struct GPUShader *EEVEE_shaders_probe_grid_fill_sh_get(void); +struct GPUShader *EEVEE_shaders_probe_planar_downsample_sh_get(void); +struct GPUShader *EEVEE_shaders_default_studiolight_sh_get(void); +struct GPUShader *EEVEE_shaders_probe_cube_display_sh_get(void); +struct GPUShader *EEVEE_shaders_probe_grid_display_sh_get(void); +struct GPUShader *EEVEE_shaders_probe_planar_display_sh_get(void); +struct GPUShader *EEVEE_shaders_velocity_resolve_sh_get(void); +struct GPUShader *EEVEE_shaders_taa_resolve_sh_get(EEVEE_EffectsFlag enabled_effects); +void EEVEE_shaders_free(void); + /* eevee_lightprobes.c */ bool EEVEE_lightprobes_obj_visibility_cb(bool vis_in, void *user_data); void EEVEE_lightprobes_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata); @@ -958,7 +975,6 @@ void EEVEE_temporal_sampling_matrices_calc( EEVEE_EffectsInfo *effects, float viewmat[4][4], float persmat[4][4], const double ht_point[2]); void EEVEE_temporal_sampling_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata); void EEVEE_temporal_sampling_draw(EEVEE_Data *vedata); -void EEVEE_temporal_sampling_free(void); /* eevee_volumes.c */ int EEVEE_volumes_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata); @@ -987,7 +1003,7 @@ void EEVEE_render_draw(EEVEE_Data *vedata, struct RenderEngine *engine, struct R void EEVEE_render_update_passes(struct RenderEngine *engine, struct Scene *scene, struct ViewLayer *view_layer); /** eevee_lookdev.c */ -void EEVEE_lookdev_cache_init(EEVEE_Data *vedata, DRWShadingGroup **grp, GPUShader *shader, DRWPass *pass, struct World *world, EEVEE_LightProbesInfo *pinfo); +void EEVEE_lookdev_cache_init(EEVEE_Data *vedata, DRWShadingGroup **grp, DRWPass *pass, struct World *world, EEVEE_LightProbesInfo *pinfo); void EEVEE_lookdev_draw_background(EEVEE_Data *vedata); /** eevee_engine.c */ diff --git a/source/blender/draw/engines/eevee/eevee_shaders.c b/source/blender/draw/engines/eevee/eevee_shaders.c new file mode 100644 index 00000000000..cf75130b2ce --- /dev/null +++ b/source/blender/draw/engines/eevee/eevee_shaders.c @@ -0,0 +1,306 @@ +/* + * Copyright 2016, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor(s): Blender Institute + * + */ + +/** \file eevee_shaders.c + * \ingroup draw_engine + */ + +#include "DRW_render.h" + +#include "BLI_string_utils.h" + +#include "MEM_guardedalloc.h" + +#include "GPU_shader.h" + +#include "eevee_private.h" + +const char *filter_defines = "#define HAMMERSLEY_SIZE " STRINGIFY(HAMMERSLEY_SIZE) "\n" +#if defined(IRRADIANCE_SH_L2) + "#define IRRADIANCE_SH_L2\n" +#elif defined(IRRADIANCE_CUBEMAP) + "#define IRRADIANCE_CUBEMAP\n" +#elif defined(IRRADIANCE_HL2) + "#define IRRADIANCE_HL2\n" +#endif + "#define NOISE_SIZE 64\n"; + +static struct { + /* Probes */ + struct GPUShader *probe_default_sh; + struct GPUShader *probe_default_studiolight_sh; + struct GPUShader *probe_grid_display_sh; + struct GPUShader *probe_cube_display_sh; + struct GPUShader *probe_planar_display_sh; + struct GPUShader *probe_filter_glossy_sh; + struct GPUShader *probe_filter_diffuse_sh; + struct GPUShader *probe_filter_visibility_sh; + struct GPUShader *probe_grid_fill_sh; + struct GPUShader *probe_planar_downsample_sh; + + /* Velocity Resolve */ + struct GPUShader *velocity_resolve_sh; + + /* Temporal Anti Aliasing */ + struct GPUShader *taa_resolve_sh; + struct GPUShader *taa_resolve_reproject_sh; + +} e_data = {NULL}; /* Engine data */ + +extern char datatoc_bsdf_common_lib_glsl[]; +extern char datatoc_bsdf_sampling_lib_glsl[]; +extern char datatoc_common_uniforms_lib_glsl[]; +extern char datatoc_common_view_lib_glsl[]; + +extern char datatoc_background_vert_glsl[]; +extern char datatoc_default_world_frag_glsl[]; +extern char datatoc_lightprobe_geom_glsl[]; +extern char datatoc_lightprobe_vert_glsl[]; +extern char datatoc_lightprobe_cube_display_frag_glsl[]; +extern char datatoc_lightprobe_cube_display_vert_glsl[]; +extern char datatoc_lightprobe_filter_diffuse_frag_glsl[]; +extern char datatoc_lightprobe_filter_glossy_frag_glsl[]; +extern char datatoc_lightprobe_filter_visibility_frag_glsl[]; +extern char datatoc_lightprobe_grid_display_frag_glsl[]; +extern char datatoc_lightprobe_grid_display_vert_glsl[]; +extern char datatoc_lightprobe_grid_fill_frag_glsl[]; +extern char datatoc_lightprobe_planar_display_frag_glsl[]; +extern char datatoc_lightprobe_planar_display_vert_glsl[]; +extern char datatoc_lightprobe_planar_downsample_frag_glsl[]; +extern char datatoc_lightprobe_planar_downsample_geom_glsl[]; +extern char datatoc_lightprobe_planar_downsample_vert_glsl[]; +extern char datatoc_irradiance_lib_glsl[]; +extern char datatoc_lightprobe_lib_glsl[]; +extern char datatoc_octahedron_lib_glsl[]; + +/* Velocity Resolve */ +extern char datatoc_effect_velocity_resolve_frag_glsl[]; + +/* Temporal Sampling */ +extern char datatoc_effect_temporal_aa_glsl[]; + +extern GlobalsUboStorage ts; + +/* *********** FUNCTIONS *********** */ + +void EEVEE_shaders_lightprobe_shaders_init(void) +{ + char *shader_str = NULL; + + shader_str = BLI_string_joinN( + datatoc_common_view_lib_glsl, + datatoc_common_uniforms_lib_glsl, + datatoc_bsdf_common_lib_glsl, + datatoc_bsdf_sampling_lib_glsl, + datatoc_lightprobe_filter_glossy_frag_glsl); + + e_data.probe_filter_glossy_sh = DRW_shader_create( + datatoc_lightprobe_vert_glsl, datatoc_lightprobe_geom_glsl, shader_str, filter_defines); + + e_data.probe_default_sh = DRW_shader_create( + datatoc_background_vert_glsl, NULL, datatoc_default_world_frag_glsl, NULL); + + MEM_freeN(shader_str); + + shader_str = BLI_string_joinN( + datatoc_common_view_lib_glsl, + datatoc_common_uniforms_lib_glsl, + datatoc_bsdf_common_lib_glsl, + datatoc_bsdf_sampling_lib_glsl, + datatoc_lightprobe_filter_diffuse_frag_glsl); + + e_data.probe_filter_diffuse_sh = DRW_shader_create_fullscreen(shader_str, filter_defines); + + MEM_freeN(shader_str); + + shader_str = BLI_string_joinN( + datatoc_common_view_lib_glsl, + datatoc_common_uniforms_lib_glsl, + datatoc_bsdf_common_lib_glsl, + datatoc_bsdf_sampling_lib_glsl, + datatoc_lightprobe_filter_visibility_frag_glsl); + + e_data.probe_filter_visibility_sh = DRW_shader_create_fullscreen(shader_str, filter_defines); + + MEM_freeN(shader_str); + + e_data.probe_grid_fill_sh = DRW_shader_create_fullscreen( + datatoc_lightprobe_grid_fill_frag_glsl, filter_defines); + + e_data.probe_planar_downsample_sh = DRW_shader_create( + datatoc_lightprobe_planar_downsample_vert_glsl, + datatoc_lightprobe_planar_downsample_geom_glsl, + datatoc_lightprobe_planar_downsample_frag_glsl, + NULL); +} + +GPUShader *EEVEE_shaders_probe_filter_glossy_sh_get(void) { + return e_data.probe_filter_glossy_sh; +} + +GPUShader *EEVEE_shaders_probe_default_sh_get(void) { + return e_data.probe_default_sh; +} + +GPUShader *EEVEE_shaders_probe_filter_diffuse_sh_get(void) { + return e_data.probe_filter_diffuse_sh; +} + +GPUShader *EEVEE_shaders_probe_filter_visibility_sh_get(void) { + return e_data.probe_filter_visibility_sh; +} + +GPUShader *EEVEE_shaders_probe_grid_fill_sh_get(void) { + return e_data.probe_grid_fill_sh; +} + +GPUShader *EEVEE_shaders_probe_planar_downsample_sh_get(void) { + return e_data.probe_planar_downsample_sh; +} + +GPUShader *EEVEE_shaders_default_studiolight_sh_get(void) +{ + if (e_data.probe_default_studiolight_sh == NULL) { + e_data.probe_default_studiolight_sh = DRW_shader_create( + datatoc_background_vert_glsl, NULL, datatoc_default_world_frag_glsl, "#define LOOKDEV\n"); + } + return e_data.probe_default_studiolight_sh; +} + +GPUShader *EEVEE_shaders_probe_cube_display_sh_get(void) +{ + if (e_data.probe_cube_display_sh == NULL) { + char *shader_str = BLI_string_joinN( + datatoc_octahedron_lib_glsl, + datatoc_common_view_lib_glsl, + datatoc_common_uniforms_lib_glsl, + datatoc_bsdf_common_lib_glsl, + datatoc_lightprobe_lib_glsl, + datatoc_lightprobe_cube_display_frag_glsl); + + char *vert_str = BLI_string_joinN( + datatoc_common_view_lib_glsl, + datatoc_lightprobe_cube_display_vert_glsl); + + e_data.probe_cube_display_sh = DRW_shader_create(vert_str, NULL, shader_str, SHADER_DEFINES); + + MEM_freeN(vert_str); + MEM_freeN(shader_str); + } + return e_data.probe_cube_display_sh; +} + + GPUShader *EEVEE_shaders_probe_grid_display_sh_get(void) +{ + if (e_data.probe_grid_display_sh == NULL ) { + char *shader_str = BLI_string_joinN( + datatoc_octahedron_lib_glsl, + datatoc_common_view_lib_glsl, + datatoc_common_uniforms_lib_glsl, + datatoc_bsdf_common_lib_glsl, + datatoc_irradiance_lib_glsl, + datatoc_lightprobe_lib_glsl, + datatoc_lightprobe_grid_display_frag_glsl); + + char *vert_str = BLI_string_joinN( + datatoc_common_view_lib_glsl, + datatoc_lightprobe_grid_display_vert_glsl); + + e_data.probe_grid_display_sh = DRW_shader_create(vert_str, NULL, shader_str, filter_defines); + + MEM_freeN(vert_str); + MEM_freeN(shader_str); + } + return e_data.probe_grid_display_sh; +} + + GPUShader *EEVEE_shaders_probe_planar_display_sh_get(void) +{ + if (e_data.probe_planar_display_sh == NULL) { + char *vert_str = BLI_string_joinN( + datatoc_common_view_lib_glsl, + datatoc_lightprobe_planar_display_vert_glsl); + + char *shader_str = BLI_string_joinN( + datatoc_common_view_lib_glsl, + datatoc_lightprobe_planar_display_frag_glsl); + + e_data.probe_planar_display_sh = DRW_shader_create(vert_str, NULL, shader_str, NULL); + + MEM_freeN(vert_str); + MEM_freeN(shader_str); + } + return e_data.probe_planar_display_sh; +} + +GPUShader *EEVEE_shaders_velocity_resolve_sh_get(void) +{ + if (e_data.velocity_resolve_sh == NULL) { + char *frag_str = BLI_string_joinN( + datatoc_common_uniforms_lib_glsl, + datatoc_common_view_lib_glsl, + datatoc_bsdf_common_lib_glsl, + datatoc_effect_velocity_resolve_frag_glsl); + + e_data.velocity_resolve_sh = DRW_shader_create_fullscreen(frag_str, NULL); + + MEM_freeN(frag_str); + } + return e_data.velocity_resolve_sh; +} + +GPUShader *EEVEE_shaders_taa_resolve_sh_get(EEVEE_EffectsFlag enabled_effects) +{ + GPUShader *sh = NULL; + char *frag_str = BLI_string_joinN( + datatoc_common_uniforms_lib_glsl, + datatoc_common_view_lib_glsl, + datatoc_bsdf_common_lib_glsl, + datatoc_effect_temporal_aa_glsl); + + if (enabled_effects & EFFECT_TAA_REPROJECT) { + sh = e_data.taa_resolve_reproject_sh = DRW_shader_create_fullscreen(frag_str, "#define USE_REPROJECTION\n"); + } + else { + sh = e_data.taa_resolve_sh = DRW_shader_create_fullscreen(frag_str, NULL); + } + + MEM_freeN(frag_str); + + return sh; +} + +void EEVEE_shaders_free(void) +{ + DRW_SHADER_FREE_SAFE(e_data.probe_default_sh); + DRW_SHADER_FREE_SAFE(e_data.probe_filter_glossy_sh); + DRW_SHADER_FREE_SAFE(e_data.probe_filter_diffuse_sh); + DRW_SHADER_FREE_SAFE(e_data.probe_filter_visibility_sh); + DRW_SHADER_FREE_SAFE(e_data.probe_grid_fill_sh); + DRW_SHADER_FREE_SAFE(e_data.probe_planar_downsample_sh); + DRW_SHADER_FREE_SAFE(e_data.probe_default_studiolight_sh); + DRW_SHADER_FREE_SAFE(e_data.probe_grid_display_sh); + DRW_SHADER_FREE_SAFE(e_data.probe_cube_display_sh); + DRW_SHADER_FREE_SAFE(e_data.probe_planar_display_sh); + DRW_SHADER_FREE_SAFE(e_data.velocity_resolve_sh); + DRW_SHADER_FREE_SAFE(e_data.taa_resolve_sh); + DRW_SHADER_FREE_SAFE(e_data.taa_resolve_reproject_sh); +} diff --git a/source/blender/draw/engines/eevee/eevee_temporal_sampling.c b/source/blender/draw/engines/eevee/eevee_temporal_sampling.c index 6216b28329b..deac0b89b10 100644 --- a/source/blender/draw/engines/eevee/eevee_temporal_sampling.c +++ b/source/blender/draw/engines/eevee/eevee_temporal_sampling.c @@ -40,32 +40,14 @@ #define FILTER_CDF_TABLE_SIZE 512 static struct { - /* Temporal Anti Aliasing */ - struct GPUShader *taa_resolve_sh; - struct GPUShader *taa_resolve_reproject_sh; - /* Pixel filter table: Only blackman-harris for now. */ + bool inited; float inverted_cdf[FILTER_CDF_TABLE_SIZE]; -} e_data = {NULL}; /* Engine data */ +} e_data = {false}; /* Engine data */ extern char datatoc_common_uniforms_lib_glsl[]; extern char datatoc_common_view_lib_glsl[]; extern char datatoc_bsdf_common_lib_glsl[]; -extern char datatoc_effect_temporal_aa_glsl[]; - -static void eevee_create_shader_temporal_sampling(void) -{ - char *frag_str = BLI_string_joinN( - datatoc_common_uniforms_lib_glsl, - datatoc_common_view_lib_glsl, - datatoc_bsdf_common_lib_glsl, - datatoc_effect_temporal_aa_glsl); - - e_data.taa_resolve_sh = DRW_shader_create_fullscreen(frag_str, NULL); - e_data.taa_resolve_reproject_sh = DRW_shader_create_fullscreen(frag_str, "#define USE_REPROJECTION\n"); - - MEM_freeN(frag_str); -} static float UNUSED_FUNCTION(filter_box)(float UNUSED(x)) { @@ -149,6 +131,7 @@ static void eevee_create_cdf_table_temporal_sampling(void) } MEM_freeN(cdf_table); + e_data.inited = true; } void EEVEE_temporal_sampling_matrices_calc( @@ -187,8 +170,7 @@ int EEVEE_temporal_sampling_init(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data EEVEE_EffectsInfo *effects = stl->effects; int repro_flag = 0; - if (!e_data.taa_resolve_sh) { - eevee_create_shader_temporal_sampling(); + if (!e_data.inited) { eevee_create_cdf_table_temporal_sampling(); } @@ -290,9 +272,7 @@ void EEVEE_temporal_sampling_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data EEVEE_EffectsInfo *effects = stl->effects; if ((effects->enabled_effects & (EFFECT_TAA | EFFECT_TAA_REPROJECT)) != 0) { - struct GPUShader *sh = (effects->enabled_effects & EFFECT_TAA_REPROJECT) - ? e_data.taa_resolve_reproject_sh - : e_data.taa_resolve_sh; + struct GPUShader *sh = EEVEE_shaders_taa_resolve_sh_get(effects->enabled_effects); psl->taa_resolve = DRW_pass_create("Temporal AA Resolve", DRW_STATE_WRITE_COLOR); DRWShadingGroup *grp = DRW_shgroup_create(sh, psl->taa_resolve); @@ -378,9 +358,3 @@ void EEVEE_temporal_sampling_draw(EEVEE_Data *vedata) } } } - -void EEVEE_temporal_sampling_free(void) -{ - DRW_SHADER_FREE_SAFE(e_data.taa_resolve_sh); - DRW_SHADER_FREE_SAFE(e_data.taa_resolve_reproject_sh); -} |