Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorClément Foucault <foucault.clem@gmail.com>2017-07-04 16:28:17 +0300
committerClément Foucault <foucault.clem@gmail.com>2017-07-05 19:20:19 +0300
commitd5448eac6caf05fb5e8db5128960304a88d33710 (patch)
treea5ec56855987ae910edf0127a2704f0e3e896c22 /source
parented4e62997ee86ffb337c5aee582379d5fd1628e9 (diff)
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.
Diffstat (limited to 'source')
-rw-r--r--source/blender/draw/engines/eevee/eevee_effects.c61
-rw-r--r--source/blender/draw/engines/eevee/eevee_materials.c3
-rw-r--r--source/blender/draw/engines/eevee/eevee_private.h2
-rw-r--r--source/blender/draw/engines/eevee/shaders/volumetric_frag.glsl19
4 files changed, 69 insertions, 16 deletions
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;