[Bf-blender-cvs] [66d8f82b832] blender2.8: Eevee: Overhaul the volumetric system.

Clément Foucault noreply at git.blender.org
Fri Oct 27 23:28:34 CEST 2017


Commit: 66d8f82b832b58cba3273c0a4196fae6db0e1efd
Author: Clément Foucault
Date:   Tue Oct 24 14:49:00 2017 +0200
Branches: blender2.8
https://developer.blender.org/rB66d8f82b832b58cba3273c0a4196fae6db0e1efd

Eevee: Overhaul the volumetric system.

The system now uses several 3D textures in order to decouple every steps of the volumetric rendering.

See https://www.ea.com/frostbite/news/physically-based-unified-volumetric-rendering-in-frostbite for more details.

On the technical side, instead of using a compute shader to populate the 3D textures we use layered rendering with a geometry shader to render 1 fullscreen triangle per 3D texture slice.

===================================================================

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
M	source/blender/draw/engines/eevee/shaders/bsdf_direct_lib.glsl
M	source/blender/draw/engines/eevee/shaders/lamps_lib.glsl
M	source/blender/draw/engines/eevee/shaders/volumetric_frag.glsl
A	source/blender/draw/engines/eevee/shaders/volumetric_geom.glsl
A	source/blender/draw/engines/eevee/shaders/volumetric_integration_frag.glsl
A	source/blender/draw/engines/eevee/shaders/volumetric_lib.glsl
A	source/blender/draw/engines/eevee/shaders/volumetric_resolve_frag.glsl
A	source/blender/draw/engines/eevee/shaders/volumetric_scatter_frag.glsl
A	source/blender/draw/engines/eevee/shaders/volumetric_vert.glsl
M	source/blender/draw/intern/DRW_render.h
M	source/blender/draw/intern/draw_manager.c
M	source/blender/makesrna/intern/rna_layer.c

===================================================================

diff --git a/release/scripts/startup/bl_ui/properties_render.py b/release/scripts/startup/bl_ui/properties_render.py
index 6ce11bf7c4d..6be6bea5a52 100644
--- a/release/scripts/startup/bl_ui/properties_render.py
+++ b/release/scripts/startup/bl_ui/properties_render.py
@@ -747,6 +747,7 @@ class RENDER_PT_eevee_volumetric(RenderButtonsPanel, Panel):
         col = layout.column()
         col.prop(props, "volumetric_start")
         col.prop(props, "volumetric_end")
+        col.prop(props, "volumetric_tile_size")
         col.prop(props, "volumetric_samples")
         col.prop(props, "volumetric_sample_distribution")
         col.prop(props, "volumetric_lights")
diff --git a/release/scripts/startup/bl_ui/properties_render_layer.py b/release/scripts/startup/bl_ui/properties_render_layer.py
index fa80d8dfd45..270902ea54a 100644
--- a/release/scripts/startup/bl_ui/properties_render_layer.py
+++ b/release/scripts/startup/bl_ui/properties_render_layer.py
@@ -308,6 +308,7 @@ class RENDERLAYER_PT_eevee_volumetric(RenderLayerButtonsPanel, Panel):
         col = layout.column()
         col.template_override_property(layer_props, scene_props, "volumetric_start")
         col.template_override_property(layer_props, scene_props, "volumetric_end")
+        col.template_override_property(layer_props, scene_props, "volumetric_tile_size")
         col.template_override_property(layer_props, scene_props, "volumetric_samples")
         col.template_override_property(layer_props, scene_props, "volumetric_sample_distribution")
         col.template_override_property(layer_props, scene_props, "volumetric_lights")
diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index 64edd76c257..265993e8114 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -168,7 +168,13 @@ data_to_c_simple(engines/eevee/shaders/bsdf_sampling_lib.glsl SRC)
 data_to_c_simple(engines/eevee/shaders/raytrace_lib.glsl SRC)
 data_to_c_simple(engines/eevee/shaders/ltc_lib.glsl SRC)
 data_to_c_simple(engines/eevee/shaders/ssr_lib.glsl SRC)
+data_to_c_simple(engines/eevee/shaders/volumetric_lib.glsl SRC)
 data_to_c_simple(engines/eevee/shaders/volumetric_frag.glsl SRC)
+data_to_c_simple(engines/eevee/shaders/volumetric_geom.glsl SRC)
+data_to_c_simple(engines/eevee/shaders/volumetric_vert.glsl SRC)
+data_to_c_simple(engines/eevee/shaders/volumetric_resolve_frag.glsl SRC)
+data_to_c_simple(engines/eevee/shaders/volumetric_scatter_frag.glsl SRC)
+data_to_c_simple(engines/eevee/shaders/volumetric_integration_frag.glsl SRC)
 
 data_to_c_simple(modes/shaders/common_globals_lib.glsl SRC)
 data_to_c_simple(modes/shaders/common_fxaa_lib.glsl SRC)
diff --git a/source/blender/draw/engines/eevee/eevee_effects.c b/source/blender/draw/engines/eevee/eevee_effects.c
index 5f61ed66386..2306dbbab0a 100644
--- a/source/blender/draw/engines/eevee/eevee_effects.c
+++ b/source/blender/draw/engines/eevee/eevee_effects.c
@@ -40,6 +40,8 @@
 #include "BKE_animsys.h"
 #include "BKE_screen.h"
 
+#include "ED_screen.h"
+
 #include "DEG_depsgraph.h"
 
 #include "BLI_dynstr.h"
@@ -50,12 +52,6 @@
 #include "GPU_framebuffer.h"
 #include "GPU_texture.h"
 
-#define SHADER_DEFINES \
-	"#define EEVEE_ENGINE\n" \
-	"#define MAX_PROBE " STRINGIFY(MAX_PROBE) "\n" \
-	"#define MAX_GRID " STRINGIFY(MAX_GRID) "\n" \
-	"#define MAX_PLANAR " STRINGIFY(MAX_PLANAR) "\n"
-
 typedef struct EEVEE_LightProbeData {
 	short probe_id, shadow_id;
 } EEVEE_LightProbeData;
@@ -69,6 +65,9 @@ enum {
 };
 
 static struct {
+	char *volumetric_common_lib;
+	char *volumetric_common_lamps_lib;
+
 	/* Downsample Depth */
 	struct GPUShader *minz_downlevel_sh;
 	struct GPUShader *maxz_downlevel_sh;
@@ -94,7 +93,9 @@ static struct {
 	struct GPUShader *dof_resolve_sh;
 
 	/* Volumetric */
-	struct GPUShader *volumetric_upsample_sh;
+	struct GPUShader *volumetric_scatter_sh;
+	struct GPUShader *volumetric_integration_sh;
+	struct GPUShader *volumetric_resolve_sh;
 
 	/* Screen Space Reflection */
 	struct GPUShader *ssr_sh[SSR_MAX_SHADER];
@@ -120,6 +121,7 @@ static struct {
 
 extern char datatoc_ambient_occlusion_lib_glsl[];
 extern char datatoc_bsdf_common_lib_glsl[];
+extern char datatoc_bsdf_direct_lib_glsl[];
 extern char datatoc_bsdf_sampling_lib_glsl[];
 extern char datatoc_octahedron_lib_glsl[];
 extern char datatoc_effect_temporal_aa_glsl[];
@@ -133,12 +135,21 @@ extern char datatoc_effect_dof_frag_glsl[];
 extern char datatoc_effect_downsample_frag_glsl[];
 extern char datatoc_effect_downsample_cube_frag_glsl[];
 extern char datatoc_effect_gtao_frag_glsl[];
+extern char datatoc_irradiance_lib_glsl[];
+extern char datatoc_lamps_lib_glsl[];
 extern char datatoc_lightprobe_lib_glsl[];
 extern char datatoc_lightprobe_vert_glsl[];
 extern char datatoc_lightprobe_geom_glsl[];
 extern char datatoc_raytrace_lib_glsl[];
 extern char datatoc_tonemap_frag_glsl[];
 extern char datatoc_volumetric_frag_glsl[];
+extern char datatoc_volumetric_geom_glsl[];
+extern char datatoc_volumetric_vert_glsl[];
+extern char datatoc_volumetric_resolve_frag_glsl[];
+extern char datatoc_volumetric_scatter_frag_glsl[];
+extern char datatoc_volumetric_integration_frag_glsl[];
+extern char datatoc_volumetric_lib_glsl[];
+extern char datatoc_gpu_shader_fullscreen_vert_glsl[];
 
 static void eevee_motion_blur_camera_get_matrix_at_time(
         const bContext *C, Scene *scene, ARegion *ar, RegionView3D *rv3d, View3D *v3d, Object *camera, float time, float r_mat[4][4])
@@ -273,7 +284,36 @@ void EEVEE_effects_init(EEVEE_SceneLayerData *sldata, EEVEE_Data *vedata)
 		                                              datatoc_lightprobe_geom_glsl,
 		                                              datatoc_effect_downsample_cube_frag_glsl, NULL);
 
-		e_data.volumetric_upsample_sh = DRW_shader_create_fullscreen(datatoc_volumetric_frag_glsl, "#define STEP_UPSAMPLE\n");
+		ds_frag = BLI_dynstr_new();
+		BLI_dynstr_append(ds_frag, datatoc_bsdf_common_lib_glsl);
+		BLI_dynstr_append(ds_frag, datatoc_volumetric_lib_glsl);
+		e_data.volumetric_common_lib = BLI_dynstr_get_cstring(ds_frag);
+		BLI_dynstr_free(ds_frag);
+
+		ds_frag = BLI_dynstr_new();
+		BLI_dynstr_append(ds_frag, datatoc_bsdf_common_lib_glsl);
+		BLI_dynstr_append(ds_frag, datatoc_bsdf_direct_lib_glsl);
+		BLI_dynstr_append(ds_frag, datatoc_irradiance_lib_glsl);
+		BLI_dynstr_append(ds_frag, datatoc_octahedron_lib_glsl);
+		BLI_dynstr_append(ds_frag, datatoc_lamps_lib_glsl);
+		BLI_dynstr_append(ds_frag, datatoc_volumetric_lib_glsl);
+		e_data.volumetric_common_lamps_lib = BLI_dynstr_get_cstring(ds_frag);
+		BLI_dynstr_free(ds_frag);
+
+		e_data.volumetric_scatter_sh = DRW_shader_create_with_lib(datatoc_volumetric_vert_glsl,
+		                                                          datatoc_volumetric_geom_glsl,
+		                                                          datatoc_volumetric_scatter_frag_glsl,
+	                                                              e_data.volumetric_common_lamps_lib,
+	                                                              SHADER_DEFINES
+	                                                              "#define VOLUMETRICS\n"
+	                                                              "#define VOLUME_SHADOW\n");
+		e_data.volumetric_integration_sh = DRW_shader_create_with_lib(datatoc_volumetric_vert_glsl,
+		                                                              datatoc_volumetric_geom_glsl,
+		                                                              datatoc_volumetric_integration_frag_glsl,
+		                                                              e_data.volumetric_common_lib, NULL);
+		e_data.volumetric_resolve_sh = DRW_shader_create_with_lib(datatoc_gpu_shader_fullscreen_vert_glsl, NULL,
+		                                                          datatoc_volumetric_resolve_frag_glsl,
+		                                                          e_data.volumetric_common_lib, NULL);
 
 		e_data.minz_downlevel_sh = DRW_shader_create_fullscreen(datatoc_effect_minmaxz_frag_glsl, "#define MIN_PASS\n");
 		e_data.maxz_downlevel_sh = DRW_shader_create_fullscreen(datatoc_effect_minmaxz_frag_glsl, "#define MAX_PASS\n");
@@ -594,9 +634,182 @@ void EEVEE_effects_init(EEVEE_SceneLayerData *sldata, EEVEE_Data *vedata)
 		DRW_FRAMEBUFFER_FREE_SAFE(fbl->depth_double_buffer_fb);
 	}
 
-
 	effects->enabled_effects = enabled_effects;
 
+	if (BKE_collection_engine_property_value_get_bool(props, "volumetric_enable")) {
+
+		effects->enabled_effects |= EFFECT_VOLUMETRIC;
+
+		if (sldata->volumetrics == NULL) {
+			sldata->volumetrics = MEM_callocN(sizeof(EEVEE_VolumetricsInfo), "EEVEE_VolumetricsInfo");
+		}
+
+		EEVEE_VolumetricsInfo *volumetrics = sldata->volumetrics;
+
+		int tile_size = BKE_collection_engine_property_value_get_int(props, "volumetric_tile_size");
+
+		/* Find Froxel Texture resolution. */
+		int froxel_tex_size[3];
+
+		froxel_tex_size[0] = (int)ceilf(fmaxf(1.0f, viewport_size[0] / (float)tile_size));
+		froxel_tex_size[1] = (int)ceilf(fmaxf(1.0f, viewport_size[1] / (float)tile_size));
+		froxel_tex_size[2] = max_ii(BKE_collection_engine_property_value_get_int(props, "volumetric_samples"), 1);
+
+		volumetrics->volume_coord_scale[0] = viewport_size[0] / (float)(tile_size * froxel_tex_size[0]);
+		volumetrics->volume_coord_scale[1] = viewport_size[1] / (float)(tile_size * froxel_tex_size[1]);
+
+		/* TODO compute snap to maxZBuffer for clustered rendering */
+
+		if ((volumetrics->froxel_tex_size[0] != froxel_tex_size[0]) ||
+		    (volumetrics->froxel_tex_size[1] != froxel_tex_size[1]) ||
+		    (volumetrics->froxel_tex_size[2] != froxel_tex_size[2]))
+		{
+			DRW_TEXTURE_FREE_SAFE(txl->volume_prop_scattering);
+			DRW_TEXTURE_FREE_SAFE(txl->volume_prop_extinction);
+			DRW_TEXTURE_FREE_SAFE(txl->volume_prop_emission);
+			DRW_TEXTURE_FREE_SAFE(txl->volume_prop_phase);
+			DRW_TEXTURE_FREE_SAFE(txl->volume_scatter);
+			DRW_TEXTURE_FREE_SAFE(txl->volume_transmittance);
+			DRW_TEXTURE_FREE_SAFE(txl->volume_scatter_history);
+			DRW_TEXTURE_FREE_SAFE(txl->volume_transmittance_history);
+			DRW_FRAMEBUFFER_FREE_SAFE(fbl->volumetric_fb);
+			DRW_FRAMEBUFFER_FREE_SAFE(fbl->volumetric_scat_fb);
+			DRW_FR

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list