diff options
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; |