[Bf-blender-cvs] [d5448eac6ca] blender2.8: Eevee: Volumetrics: Colored Transmittance support.

Clément Foucault noreply at git.blender.org
Wed Jul 5 19:17:44 CEST 2017


Commit: d5448eac6caf05fb5e8db5128960304a88d33710
Author: Clément Foucault
Date:   Tue Jul 4 15:28:17 2017 +0200
Branches: blender2.8
https://developer.blender.org/rBd5448eac6caf05fb5e8db5128960304a88d33710

Eevee: Volumetrics: Colored Transmittance support.

Render the transmittance in another color buffer and apply it separatelly.
It's a bit more slow because the upsample step needs to be done twice.

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

M	source/blender/draw/engines/eevee/eevee_effects.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/volumetric_frag.glsl

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

diff --git a/source/blender/draw/engines/eevee/eevee_effects.c b/source/blender/draw/engines/eevee/eevee_effects.c
index 07e1a7029e9..a816fe8332a 100644
--- a/source/blender/draw/engines/eevee/eevee_effects.c
+++ b/source/blender/draw/engines/eevee/eevee_effects.c
@@ -403,12 +403,25 @@ void EEVEE_effects_init(EEVEE_Data *vedata)
 	                    &tex, 1);
 
 	if (BKE_collection_engine_property_value_get_bool(props, "volumetric_enable")) {
-		/* Integration result */
-		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);
+		/* Integration result buffer(s) */
+		if (false) { /* TODO check and free the framebuffer if config changes */
+			/* Monocromatic transmittance in alpha */
+			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);
+		}
+		else {
+			/* Transmittance is separated, No need for alpha and DRW_TEX_RGB_11_11_10 gives the same vram usage */
+			/* Hint ! Could reuse this for transparency! */
+			DRWFboTexture tex_vol[2] = {{&stl->g_data->volumetric, DRW_TEX_RGB_11_11_10, DRW_TEX_MIPMAP | DRW_TEX_FILTER | DRW_TEX_TEMP},
+			                            {&stl->g_data->volumetric_transmit, DRW_TEX_RGB_11_11_10, 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, 2);
+		}
 
 		World *wo = scene->world;
 		if ((wo != NULL) && (wo->use_nodes) && (wo->nodetree != NULL)) {
@@ -467,11 +480,26 @@ void EEVEE_effects_cache_init(EEVEE_SceneLayerData *sldata, EEVEE_Data *vedata)
 			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);
+			if (false) { /* Monochromatic transmittance */
+				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);
+			}
+			else {
+				psl->volumetric_resolve_transmit_ps = DRW_pass_create("Volumetric Transmittance Resolve", DRW_STATE_WRITE_COLOR | DRW_STATE_MULTIPLY);
+				grp = DRW_shgroup_create(e_data.volumetric_upsample_sh, psl->volumetric_resolve_transmit_ps);
+				DRW_shgroup_uniform_buffer(grp, "depthFull", &e_data.depth_src);
+				DRW_shgroup_uniform_buffer(grp, "volumetricBuffer", &stl->g_data->volumetric_transmit);
+				DRW_shgroup_call_add(grp, quad, NULL);
+
+				psl->volumetric_resolve_ps = DRW_pass_create("Volumetric Resolve", DRW_STATE_WRITE_COLOR | DRW_STATE_ADDITIVE);
+				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);
+			}
 		}
 		else {
 			/* Compilation failled */
@@ -645,16 +673,25 @@ void EEVEE_effects_do_volumetrics(EEVEE_Data *vedata)
 
 		/* Compute volumetric integration at halfres. */
 		DRW_framebuffer_texture_attach(fbl->volumetric_fb, stl->g_data->volumetric, 0, 0);
+		DRW_framebuffer_texture_attach(fbl->volumetric_fb, stl->g_data->volumetric_transmit, 1, 0);
 		DRW_framebuffer_bind(fbl->volumetric_fb);
 		DRW_draw_pass(psl->volumetric_integrate_ps);
 
 		/* Resolve at fullres */
 		DRW_framebuffer_texture_detach(dtxl->depth);
 		DRW_framebuffer_bind(fbl->main);
-		DRW_draw_pass(psl->volumetric_resolve_ps);
+		if (false) {
+			DRW_draw_pass(psl->volumetric_resolve_ps);
+		}
+		else {
+			DRW_draw_pass(psl->volumetric_resolve_transmit_ps);
+			DRW_draw_pass(psl->volumetric_resolve_ps);
+		}
 
 		/* Restore */
 		DRW_framebuffer_texture_attach(fbl->main, dtxl->depth, 0, 0);
+		DRW_framebuffer_texture_detach(stl->g_data->volumetric);
+		DRW_framebuffer_texture_detach(stl->g_data->volumetric_transmit);
 	}
 }
 
diff --git a/source/blender/draw/engines/eevee/eevee_materials.c b/source/blender/draw/engines/eevee/eevee_materials.c
index c35b94e8105..4d8ed30931d 100644
--- a/source/blender/draw/engines/eevee/eevee_materials.c
+++ b/source/blender/draw/engines/eevee/eevee_materials.c
@@ -411,7 +411,8 @@ struct GPUMaterial *EEVEE_material_world_volume_get(struct Scene *scene, World *
 	return GPU_material_from_nodetree(
 	        scene, wo->nodetree, &wo->gpumaterial, engine, options,
 	        datatoc_background_vert_glsl, NULL, e_data.volume_shader_lib,
-	        SHADER_DEFINES "#define VOLUMETRICS\n");
+	        SHADER_DEFINES "#define VOLUMETRICS\n"
+	        "#define COLOR_TRANSMITTANCE\n");
 }
 
 struct GPUMaterial *EEVEE_material_mesh_get(
diff --git a/source/blender/draw/engines/eevee/eevee_private.h b/source/blender/draw/engines/eevee/eevee_private.h
index adfa598b91c..b9cd3adfab2 100644
--- a/source/blender/draw/engines/eevee/eevee_private.h
+++ b/source/blender/draw/engines/eevee/eevee_private.h
@@ -96,6 +96,7 @@ typedef struct EEVEE_PassList {
 	struct DRWPass *minmaxz_copydepth;
 	struct DRWPass *volumetric_integrate_ps;
 	struct DRWPass *volumetric_resolve_ps;
+	struct DRWPass *volumetric_resolve_transmit_ps;
 
 	struct DRWPass *depth_pass;
 	struct DRWPass *depth_pass_cull;
@@ -405,6 +406,7 @@ typedef struct EEVEE_PrivateData {
 	struct GHash *hair_material_hash;
 	struct GPUTexture *minmaxz;
 	struct GPUTexture *volumetric;
+	struct GPUTexture *volumetric_transmit;
 	float background_alpha; /* TODO find a better place for this. */
 	float viewvecs[2][4];
 	/* For planar probes */
diff --git a/source/blender/draw/engines/eevee/shaders/volumetric_frag.glsl b/source/blender/draw/engines/eevee/shaders/volumetric_frag.glsl
index c0a46c93d9c..6cbe37c1c4c 100644
--- a/source/blender/draw/engines/eevee/shaders/volumetric_frag.glsl
+++ b/source/blender/draw/engines/eevee/shaders/volumetric_frag.glsl
@@ -1,8 +1,13 @@
 
-out vec4 FragColor;
-
 #ifdef VOLUMETRICS
 
+#ifdef COLOR_TRANSMITTANCE
+layout(location = 0) out vec4 outScattering;
+layout(location = 1) out vec4 outTransmittance;
+#else
+out vec4 outScatteringTransmittance;
+#endif
+
 uniform sampler2D depthFull;
 
 void participating_media_properties(vec3 wpos, out vec3 extinction, out vec3 scattering, out float anisotropy)
@@ -43,6 +48,7 @@ vec3 light_volume(LightData ld, vec4 l_vector)
 	float power;
 	float dist = max(1e-4, abs(l_vector.w - ld.l_radius));
 	/* TODO : put this out of the shader. */
+	/* TODO : Area lighting ? */
 	/* Removing Area Power. */
 	if (ld.l_type == AREA) {
 		power = 0.0962 * (ld.l_sizex * ld.l_sizey * 4.0f * M_PI);
@@ -185,13 +191,20 @@ void main()
 			break;
 	}
 
+#ifdef COLOR_TRANSMITTANCE
+	outScattering = vec4(scattering, 1.0);
+	outTransmittance = vec4(transmittance, 1.0);
+#else
 	float mono_transmittance = dot(transmittance, vec3(1.0)) / 3.0;
 
-	FragColor = vec4(scattering, mono_transmittance);
+	outScatteringTransmittance = vec4(scattering, mono_transmittance);
+#endif
 }
 
 #else /* STEP_UPSAMPLE */
 
+out vec4 FragColor;
+
 uniform sampler2D depthFull;
 uniform sampler2D volumetricBuffer;




More information about the Bf-blender-cvs mailing list