Commit: 65b01014b99ce7c6de67046ed7b8ae244fdb51c3
Author: Clément Foucault
Date: Mon Jul 3 16:38:14 2017 +0200
Branches: blender2.8
https://developer.blender.org/rB65b01014b99ce7c6de67046ed7b8ae244fdb51c3
Eevee: Initial implementation of Volumetrics.
===================================================================
M release/scripts/startup/bl_ui/properties_render.py
M release/scripts/startup/bl_ui/properties_render_layer.py
M source/blender/draw/CMakeLists.txt
M source/blender/draw/engines/eevee/eevee_effects.c
M source/blender/draw/engines/eevee/eevee_engine.c
M source/blender/draw/engines/eevee/eevee_materials.c
M source/blender/draw/engines/eevee/eevee_private.h
M source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl
A source/blender/draw/engines/eevee/shaders/volumetric_frag.glsl
M source/blender/makesrna/intern/rna_scene.c
===================================================================
diff --git a/release/scripts/startup/bl_ui/properties_render.py
b/release/scripts/startup/bl_ui/properties_render.py
index bd599bc0cb4..86d454c3254 100644
--- a/release/scripts/startup/bl_ui/properties_render.py
+++ b/release/scripts/startup/bl_ui/properties_render.py
@@ -631,6 +631,7 @@ class
RENDER_PT_eevee_poststack_settings(RenderButtonsPanel, Panel):
props = scene.layer_properties['BLENDER_EEVEE']
col = layout.column()
+ col.prop(props, "volumetric_enable")
col.prop(props, "gtao_enable")
col.prop(props, "motion_blur_enable")
col.prop(props, "dof_enable")
diff --git a/release/scripts/startup/bl_ui/properties_render_layer.py
b/release/scripts/startup/bl_ui/properties_render_layer.py
index 4de48f00b04..9e563fc6236 100644
--- a/release/scripts/startup/bl_ui/properties_render_layer.py
+++ b/release/scripts/startup/bl_ui/properties_render_layer.py
@@ -167,6 +167,7 @@ class
RENDERLAYER_PT_eevee_poststack_settings(RenderLayerButtonsPanel, Panel):
layer_props = layer.engine_overrides['BLENDER_EEVEE']
col = layout.column()
+ col.template_override_property(layer_props, scene_props,
"volumetric_enable")
col.template_override_property(layer_props, scene_props, "gtao_enable")
col.template_override_property(layer_props, scene_props,
"motion_blur_enable")
col.template_override_property(layer_props, scene_props, "dof_enable")
diff --git a/source/blender/draw/CMakeLists.txt
b/source/blender/draw/CMakeLists.txt
index 765e6a2fda2..4b760f68705 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -157,6 +157,7 @@ data_to_c_simple(engines/eevee/shaders/irradiance_lib.glsl
SRC)
data_to_c_simple(engines/eevee/shaders/octahedron_lib.glsl SRC)
data_to_c_simple(engines/eevee/shaders/bsdf_sampling_lib.glsl SRC)
data_to_c_simple(engines/eevee/shaders/ltc_lib.glsl SRC)
+data_to_c_simple(engines/eevee/shaders/volumetric_frag.glsl SRC)
data_to_c_simple(modes/shaders/common_globals_lib.glsl SRC)
data_to_c_simple(modes/shaders/edit_mesh_overlay_frag.glsl SRC)
diff --git a/source/blender/draw/engines/eevee/eevee_effects.c
b/source/blender/draw/engines/eevee/eevee_effects.c
index 4191c21eea1..96b168cdeee 100644
--- a/source/blender/draw/engines/eevee/eevee_effects.c
+++ b/source/blender/draw/engines/eevee/eevee_effects.c
@@ -38,6 +38,8 @@
#include "BKE_animsys.h"
#include "BKE_screen.h"
+#include "BLI_dynstr.h"
+
#include "eevee_private.h"
#include "GPU_texture.h"
@@ -45,11 +47,6 @@ typedef struct EEVEE_LightProbeData {
short probe_id, shadow_id;
} EEVEE_LightProbeData;
-/* TODO Option */
-#define ENABLE_EFFECT_MOTION_BLUR 1
-#define ENABLE_EFFECT_BLOOM 1
-#define ENABLE_EFFECT_DOF 1
-
static struct {
/* Downsample Depth */
struct GPUShader *minmaxz_downlevel_sh;
@@ -70,7 +67,10 @@ static struct {
struct GPUShader *dof_scatter_sh;
struct GPUShader *dof_resolve_sh;
- struct GPUTexture *minmmaxz_depth_src;
+ /* Volumetric */
+ struct GPUShader *volumetric_upsample_sh;
+
+ struct GPUTexture *depth_src;
} e_data = {NULL}; /* Engine data */
extern char datatoc_effect_minmaxz_frag_glsl[];
@@ -80,6 +80,7 @@ extern char datatoc_effect_dof_vert_glsl[];
extern char datatoc_effect_dof_geom_glsl[];
extern char datatoc_effect_dof_frag_glsl[];
extern char datatoc_tonemap_frag_glsl[];
+extern char datatoc_volumetric_frag_glsl[];
static void eevee_motion_blur_camera_get_matrix_at_time(
Scene *scene, ARegion *ar, RegionView3D *rv3d, View3D *v3d, Object
*camera, float time, float r_mat[4][4])
@@ -151,6 +152,8 @@ void EEVEE_effects_init(EEVEE_Data *vedata)
/* Shaders */
if (!e_data.motion_blur_sh) {
+ e_data.volumetric_upsample_sh =
DRW_shader_create_fullscreen(datatoc_volumetric_frag_glsl, "#define
STEP_UPSAMPLE\n");
+
e_data.minmaxz_downlevel_sh =
DRW_shader_create_fullscreen(datatoc_effect_minmaxz_frag_glsl, NULL);
e_data.minmaxz_downdepth_sh =
DRW_shader_create_fullscreen(datatoc_effect_minmaxz_frag_glsl, "#define
INPUT_DEPTH\n");
e_data.minmaxz_copydepth_sh =
DRW_shader_create_fullscreen(datatoc_effect_minmaxz_frag_glsl, "#define
INPUT_DEPTH\n"
@@ -190,7 +193,6 @@ void EEVEE_effects_init(EEVEE_Data *vedata)
int enabled_effects = 0;
-#if ENABLE_EFFECT_MOTION_BLUR
if (BKE_collection_engine_property_value_get_bool(props,
"motion_blur_enable")) {
/* Update Motion Blur Matrices */
if (rv3d->persp == RV3D_CAMOB && v3d->camera) {
@@ -221,9 +223,7 @@ void EEVEE_effects_init(EEVEE_Data *vedata)
}
}
}
-#endif /* ENABLE_EFFECT_MOTION_BLUR */
-#if ENABLE_EFFECT_BLOOM
if (BKE_collection_engine_property_value_get_bool(props,
"bloom_enable")) {
/* Bloom */
int blitsize[2], texsize[2];
@@ -294,9 +294,7 @@ void EEVEE_effects_init(EEVEE_Data *vedata)
enabled_effects |= EFFECT_BLOOM;
}
-#endif /* ENABLE_EFFECT_BLOOM */
-#if ENABLE_EFFECT_DOF
if (BKE_collection_engine_property_value_get_bool(props, "dof_enable"))
{
/* Depth Of Field */
if (rv3d->persp == RV3D_CAMOB && v3d->camera) {
@@ -375,7 +373,6 @@ void EEVEE_effects_init(EEVEE_Data *vedata)
enabled_effects |= EFFECT_DOF;
}
}
-#endif /* ENABLE_EFFECT_DOF */
effects->enabled_effects = enabled_effects;
@@ -404,6 +401,16 @@ void EEVEE_effects_init(EEVEE_Data *vedata)
(int)viewport_size[0] / 2, (int)viewport_size[1] /
2,
&tex, 1);
+ if (BKE_collection_engine_property_value_get_bool(props,
"volumetric_enable")) {
+ /* MinMax Pyramid */
+ DRWFboTexture tex_vol = {&stl->g_data->volumetric,
DRW_TEX_RGBA_16, DRW_TEX_MIPMAP | DRW_TEX_FILTER | DRW_TEX_TEMP};
+
+ DRW_framebuffer_init(&fbl->volumetric_fb,
&draw_engine_eevee_type,
+ (int)viewport_size[0] / 2,
(int)viewport_size[1] / 2,
+ &tex_vol, 1);
+
+ effects->enabled_effects |= EFFECT_VOLUMETRIC;
+ }
}
static DRWShadingGroup *eevee_create_bloom_pass(const char *name,
EEVEE_EffectsInfo *effects, struct GPUShader *sh, DRWPass **pass, bool upsample)
@@ -424,7 +431,7 @@ static DRWShadingGroup *eevee_create_bloom_pass(const char
*name, EEVEE_EffectsI
return grp;
}
-void EEVEE_effects_cache_init(EEVEE_Data *vedata)
+void EEVEE_effects_cache_init(EEVEE_SceneLayerData *sldata, EEVEE_Data *vedata)
{
EEVEE_PassList *psl = vedata->psl;
EEVEE_StorageList *stl = vedata->stl;
@@ -435,6 +442,29 @@ void EEVEE_effects_cache_init(EEVEE_Data *vedata)
struct Gwn_Batch *quad = DRW_cache_fullscreen_quad_get();
{
+ struct GPUShader *sh = EEVEE_material_world_volume_get(NULL,
NULL);
+ psl->volumetric_integrate_ps = DRW_pass_create("Volumetric
Integration", DRW_STATE_WRITE_COLOR);
+ DRWShadingGroup *grp = DRW_shgroup_create(sh,
psl->volumetric_integrate_ps);
+ DRW_shgroup_uniform_buffer(grp, "depthFull", &e_data.depth_src);
+ DRW_shgroup_uniform_buffer(grp, "shadowCubes",
&sldata->shadow_depth_cube_pool);
+ DRW_shgroup_uniform_buffer(grp, "irradianceGrid",
&sldata->irradiance_pool);
+ DRW_shgroup_uniform_block(grp, "light_block",
sldata->light_ubo);
+ DRW_shgroup_uniform_block(grp, "grid_block", sldata->grid_ubo);
+ DRW_shgroup_uniform_block(grp, "shadow_block",
sldata->shadow_ubo);
+ DRW_shgroup_uniform_int(grp, "light_count",
&sldata->lamps->num_light, 1);
+ DRW_shgroup_uniform_int(grp, "grid_count",
&sldata->probes->num_render_grid, 1);
+ DRW_shgroup_uniform_texture(grp, "utilTex",
EEVEE_materials_get_util_tex());
+ DRW_shgroup_uniform_vec4(grp, "viewvecs[0]", (float
*)stl->g_data->viewvecs, 2);
+ DRW_shgroup_call_add(grp, quad, NULL);
+
+ psl->volumetric_resolve_ps = DRW_pass_create("Volumetric
Resolve", DRW_STATE_WRITE_COLOR | DRW_STATE_TRANSMISSION);
+ grp = DRW_shgroup_create(e_data.volumetric_upsample_sh,
psl->volumetric_resolve_ps);
+ DRW_shgroup_uniform_buffer(grp, "depthFull", &e_data.depth_src);
+ DRW_shgroup_uniform_buffer(grp, "volumetricBuffer",
&stl->g_data->volumetric);
+ DRW_shgroup_call_add(grp, quad, NULL);
+ }
+
+ {
psl->minmaxz_downlevel = DRW_pass_create("HiZ Down Level",
DRW_STATE_WRITE_COLOR);
DRWShadingGroup *grp =
DRW_shgroup_create(e_data.minmaxz_downlevel_sh, psl->minmaxz_downlevel);
DRW_shgroup_uniform_buffer(grp, "depthBuffer",
&stl->g_data->minmaxz);
@@ -442,12 +472,12 @@ void EEVEE_effects_cache_init(EEVEE_Data *vedata)
psl->minmaxz_downdepth = DRW_pass_create("HiZ Down Depth",
DRW_STATE_WRITE_COLOR);
grp = DRW_shgroup_create(e_data.minmaxz_downdepth_sh,
psl->minmaxz_downdepth);
- DRW_shgroup_uniform_buffer(grp, "depthBuffer",
&e_data.minmmaxz_depth_src);
+ DRW_shgroup_uniform_buffer(grp, "depthBuffer",
&e_data.depth_src);
DRW_shgroup_call_add(grp, quad, NULL);
psl->minmaxz_copydepth = DRW_pass_create("HiZ Copy Depth",
DRW_STATE_WRITE_COLOR);
grp = DRW_shgroup_create(e_data.minmaxz_copydepth_sh,
psl->minmaxz_copydepth);
- DRW_shgroup_uniform_buffer(grp, "depthBuffer",
&e_data.minmmaxz_depth_src);
+ DRW_shgroup_uniform_buffer(grp, "depthBuffer",
&e_data.depth_src);
DRW_shgroup_call_add(grp, quad, NULL);
}
@@ -574,7 +604,7 @@ void EEVEE_create_minmax_buffer(EEVEE_Data *vedata,
GPUTexture *depth_src)
EEVEE_FramebufferList *fbl = vedata->fbl;
EEVEE_StorageList *stl = vedata->stl;
- e_data.minmmaxz_depth_src = depth_src;
+ e_data.depth_src = depth_src;
/* Copy depth buffer to minmax texture top level */
DRW_framebuffer_texture_attach(fbl->minmaxz_fb, stl->g_data->minmaxz,
0, 0);
@@ -586,6 +616,33 @@ void EEVEE_create_minmax_buffer(EEVEE_Data *vedata,
GPUTexture *depth_src)
DRW_framebuffer_recursive_downsample(fbl->minmaxz_fb,
stl->g_data->minmaxz, 6, &minmax_downsample_cb, vedata);
}
+void EEVEE_effects_do_volumetrics(EEVEE_Data *vedata)
+{
+ EEVEE_PassList *psl = vedata->psl;
+ EEVEE_FramebufferList *fbl = vedata->fbl;
+ EEVEE_StorageList *stl = vedata->stl;
+ EEVEE_EffectsInfo *effects = stl->effects;
+
+ if ((effects->enabled_effects & EFFECT_VOLUMETRIC) != 0) {
+ DefaultTextureList *dtxl = DRW_viewport_texture_list_get();
+
+ e_data.depth_src = dtxl->depth;
+
+ /* Compute volumetric integration at halfres. */
+ DRW_framebuffer_texture_attach(fbl->volumetric_fb,
stl->g_data->volumetric, 0, 0);
+ DRW_framebuffer_bind(fbl->volumetric_fb);
+ DRW_dra
@@ Diff output truncated at 10240 characters. @@
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs