Commit: b09052002c3bc9ffcf60dd8e2efe0374ca6e550f
Author: Clément Foucault
Date:   Mon Jul 3 22:08:07 2017 +0200
Branches: blender2.8
https://developer.blender.org/rBb09052002c3bc9ffcf60dd8e2efe0374ca6e550f

Eevee: Add support for volumetrics in node tree.

Only volume scatter is implemented for now.

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

M       source/blender/draw/engines/eevee/eevee_effects.c
M       source/blender/draw/engines/eevee/eevee_lightprobes.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/volumetric_frag.glsl
M       source/blender/gpu/shaders/gpu_shader_material.glsl
M       source/blender/nodes/shader/nodes/node_shader_volume_scatter.c

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

diff --git a/source/blender/draw/engines/eevee/eevee_effects.c 
b/source/blender/draw/engines/eevee/eevee_effects.c
index 96b168cdeee..7150cac6add 100644
--- a/source/blender/draw/engines/eevee/eevee_effects.c
+++ b/source/blender/draw/engines/eevee/eevee_effects.c
@@ -32,6 +32,7 @@
 #include "DNA_camera_types.h"
 #include "DNA_screen_types.h"
 #include "DNA_view3d_types.h"
+#include "DNA_world_types.h"
 
 #include "BKE_camera.h"
 #include "BKE_object.h"
@@ -402,14 +403,17 @@ void EEVEE_effects_init(EEVEE_Data *vedata)
                            &tex, 1);
 
        if (BKE_collection_engine_property_value_get_bool(props, 
"volumetric_enable")) {
-               /* MinMax Pyramid */
+               /* 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);
 
-               effects->enabled_effects |= EFFECT_VOLUMETRIC;
+               World *wo = scene->world;
+               if ((wo != NULL) && (wo->use_nodes != NULL) && (wo->nodetree != 
NULL)) {
+                       effects->enabled_effects |= EFFECT_VOLUMETRIC;
+               }
        }
 }
 
@@ -441,27 +445,38 @@ void EEVEE_effects_cache_init(EEVEE_SceneLayerData 
*sldata, 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);
+       if ((effects->enabled_effects & EFFECT_VOLUMETRIC) != 0) {
+               const DRWContextState *draw_ctx = DRW_context_state_get();
+               Scene *scene = draw_ctx->scene;
+               struct World *wo = scene->world; /* Already checked non 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);
+               struct GPUMaterial *mat = 
EEVEE_material_world_volume_get(scene, wo);
+               psl->volumetric_integrate_ps = DRW_pass_create("Volumetric 
Integration", DRW_STATE_WRITE_COLOR);
+               DRWShadingGroup *grp = DRW_shgroup_material_create(mat, 
psl->volumetric_integrate_ps);
+
+               if (grp != NULL) {
+                       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);
+               }
+               else {
+                       /* Compilation failled */
+                       effects->enabled_effects &= ~EFFECT_VOLUMETRIC;
+               }
        }
 
        {
diff --git a/source/blender/draw/engines/eevee/eevee_lightprobes.c 
b/source/blender/draw/engines/eevee/eevee_lightprobes.c
index ee518cc268c..5ae60ff4ef6 100644
--- a/source/blender/draw/engines/eevee/eevee_lightprobes.c
+++ b/source/blender/draw/engines/eevee/eevee_lightprobes.c
@@ -73,7 +73,6 @@ static struct {
 
 extern char datatoc_background_vert_glsl[];
 extern char datatoc_default_world_frag_glsl[];
-extern char datatoc_fullscreen_vert_glsl[];
 extern char datatoc_lightprobe_filter_glossy_frag_glsl[];
 extern char datatoc_lightprobe_filter_diffuse_frag_glsl[];
 extern char datatoc_lightprobe_geom_glsl[];
diff --git a/source/blender/draw/engines/eevee/eevee_materials.c 
b/source/blender/draw/engines/eevee/eevee_materials.c
index f7c28530aef..c35b94e8105 100644
--- a/source/blender/draw/engines/eevee/eevee_materials.c
+++ b/source/blender/draw/engines/eevee/eevee_materials.c
@@ -63,8 +63,8 @@
 /* *********** STATIC *********** */
 static struct {
        char *frag_shader_lib;
+       char *volume_shader_lib;
 
-       struct GPUShader *default_volume_sh;
        struct GPUShader *default_prepass_sh;
        struct GPUShader *default_prepass_clip_sh;
        struct GPUShader *default_lit[VAR_MAT_MAX];
@@ -273,6 +273,12 @@ void EEVEE_materials_init(EEVEE_StorageList *stl)
 
                ds_frag = BLI_dynstr_new();
                BLI_dynstr_append(ds_frag, e_data.frag_shader_lib);
+               BLI_dynstr_append(ds_frag, datatoc_volumetric_frag_glsl);
+               e_data.volume_shader_lib = BLI_dynstr_get_cstring(ds_frag);
+               BLI_dynstr_free(ds_frag);
+
+               ds_frag = BLI_dynstr_new();
+               BLI_dynstr_append(ds_frag, e_data.frag_shader_lib);
                BLI_dynstr_append(ds_frag, datatoc_default_frag_glsl);
                frag_str = BLI_dynstr_get_cstring(ds_frag);
                BLI_dynstr_free(ds_frag);
@@ -290,16 +296,6 @@ void EEVEE_materials_init(EEVEE_StorageList *stl)
 
                MEM_freeN(frag_str);
 
-               ds_frag = BLI_dynstr_new();
-               BLI_dynstr_append(ds_frag, e_data.frag_shader_lib);
-               BLI_dynstr_append(ds_frag, datatoc_volumetric_frag_glsl);
-               frag_str = BLI_dynstr_get_cstring(ds_frag);
-               BLI_dynstr_free(ds_frag);
-
-               e_data.default_volume_sh = 
DRW_shader_create_fullscreen(frag_str, SHADER_DEFINES "#define 
STEP_INTEGRATE\n");
-
-               MEM_freeN(frag_str);
-
                /* Textures */
                const int layers = 3;
                float (*texels)[4] = MEM_mallocN(sizeof(float[4]) * 64 * 64 * 
layers, "utils texels");
@@ -403,9 +399,19 @@ struct GPUMaterial 
*EEVEE_material_world_background_get(struct Scene *scene, Wor
                SHADER_DEFINES "#define WORLD_BACKGROUND\n");
 }
 
-struct GPUShader *EEVEE_material_world_volume_get(struct Scene *UNUSED(scene), 
World *UNUSED(wo))
+struct GPUMaterial *EEVEE_material_world_volume_get(struct Scene *scene, World 
*wo)
 {
-       return e_data.default_volume_sh;
+       const void *engine = &DRW_engine_viewport_eevee_type;
+       int options = VAR_WORLD_VOLUME;
+
+       GPUMaterial *mat = GPU_material_from_nodetree_find(&wo->gpumaterial, 
engine, options);
+       if (mat != NULL) {
+               return mat;
+       }
+       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");
 }
 
 struct GPUMaterial *EEVEE_material_mesh_get(
@@ -785,7 +791,7 @@ void EEVEE_materials_free(void)
                DRW_SHADER_FREE_SAFE(e_data.default_lit[i]);
        }
        MEM_SAFE_FREE(e_data.frag_shader_lib);
-       DRW_SHADER_FREE_SAFE(e_data.default_volume_sh);
+       MEM_SAFE_FREE(e_data.volume_shader_lib);
        DRW_SHADER_FREE_SAFE(e_data.default_prepass_sh);
        DRW_SHADER_FREE_SAFE(e_data.default_prepass_clip_sh);
        DRW_SHADER_FREE_SAFE(e_data.default_background);
diff --git a/source/blender/draw/engines/eevee/eevee_private.h 
b/source/blender/draw/engines/eevee/eevee_private.h
index 727edfb9607..adfa598b91c 100644
--- a/source/blender/draw/engines/eevee/eevee_private.h
+++ b/source/blender/draw/engines/eevee/eevee_private.h
@@ -50,6 +50,7 @@ extern struct DrawEngineType draw_engine_eevee_type;
 enum {
        VAR_WORLD_BACKGROUND,
        VAR_WORLD_PROBE,
+       VAR_WORLD_VOLUME,
 };
 
 /* Material shader variations */
@@ -424,7 +425,7 @@ void EEVEE_materials_cache_populate(EEVEE_Data *vedata, 
EEVEE_SceneLayerData *sl
 void EEVEE_materials_cache_finish(EEVEE_Data *vedata);
 struct GPUMaterial *EEVEE_material_world_lightprobe_get(struct Scene *scene, 
struct World *wo);
 struct GPUMaterial *EEVEE_material_world_background_get(struct Scene *scene, 
struct World *wo);
-struct GPUShader *EEVEE_material_world_volume_get(struct Scene *scene, struct 
World *wo);
+struct GPUMaterial *EEVEE_material_world_volume_get(struct Scene *scene, 
struct World *wo);
 struct GPUMaterial *EEVEE_material_mesh_lightprobe_get(struct Scene *scene, 
Material *ma);
 struct GPUMaterial *EEVEE_material_mesh_get(struct Scene *scene, Material *ma, 
bool use_ao, bool use_bent_normals);
 struct GPUMaterial *EEVEE_material_hair_get(struct Scene *scene, Material *ma, 
bool use_ao, bool use_bent_normals);
diff --git a/source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl 
b/source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl
index 6f255583340..2c72df16135 100644
--- a/source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl
+++ b/source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl
@@ -17,6 +17,44 @@ uniform vec4 viewvecs[2];
 #define cameraPos       ViewMatrixInverse[3].xyz
 
 /* ------- Structures -------- */
+#ifdef VOLUMETRICS
+
+#define NODETREE_EXEC
+
+struct Closure {
+       vec3 absorption;
+       vec3 scatter;
+       vec3 emission;
+       float anisotropy;
+};
+
+#define CLOSURE_DEFAULT Closure(vec3(0.0)

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to