[Bf-blender-cvs] [030db8d028c] new-object-types: Volume: support arbitray number of grids for Eevee shaders

Brecht Van Lommel noreply at git.blender.org
Sun Feb 16 00:24:17 CET 2020


Commit: 030db8d028cfa6d2da68094d2c82e5eee4758212
Author: Brecht Van Lommel
Date:   Sun Feb 9 17:25:11 2020 +0100
Branches: new-object-types
https://developer.blender.org/rB030db8d028cfa6d2da68094d2c82e5eee4758212

Volume: support arbitray number of grids for Eevee shaders

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

M	source/blender/draw/engines/eevee/eevee_materials.c
M	source/blender/draw/engines/eevee/eevee_volumes.c
M	source/blender/draw/intern/DRW_render.h
M	source/blender/draw/intern/draw_manager_data.c
M	source/blender/draw/intern/draw_manager_shader.c
M	source/blender/gpu/GPU_material.h
M	source/blender/gpu/intern/gpu_codegen.c
M	source/blender/gpu/intern/gpu_material.c
M	source/blender/gpu/intern/gpu_node_graph.c
M	source/blender/gpu/intern/gpu_node_graph.h
M	source/blender/gpu/shaders/material/gpu_shader_material_volume_info.glsl
M	source/blender/nodes/shader/nodes/node_shader_attribute.c
M	source/blender/nodes/shader/nodes/node_shader_volume_info.c
M	source/blender/nodes/shader/nodes/node_shader_volume_principled.c

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

diff --git a/source/blender/draw/engines/eevee/eevee_materials.c b/source/blender/draw/engines/eevee/eevee_materials.c
index d7f5b134e6a..247e2f90074 100644
--- a/source/blender/draw/engines/eevee/eevee_materials.c
+++ b/source/blender/draw/engines/eevee/eevee_materials.c
@@ -651,6 +651,7 @@ struct GPUMaterial *EEVEE_material_world_lightprobe_get(struct Scene *scene, Wor
                                       wo,
                                       engine,
                                       options,
+                                      false,
                                       e_data.vert_background_shader_str,
                                       NULL,
                                       e_data.frag_shader_lib,
@@ -671,6 +672,7 @@ struct GPUMaterial *EEVEE_material_world_background_get(struct Scene *scene, Wor
                                       wo,
                                       engine,
                                       options,
+                                      false,
                                       e_data.vert_background_shader_str,
                                       NULL,
                                       e_data.frag_shader_lib,
@@ -694,6 +696,7 @@ struct GPUMaterial *EEVEE_material_world_volume_get(struct Scene *scene, World *
                                      wo,
                                      engine,
                                      options,
+                                     true,
                                      e_data.vert_volume_shader_str,
                                      e_data.geom_volume_shader_str,
                                      e_data.volume_shader_lib,
@@ -728,6 +731,7 @@ struct GPUMaterial *EEVEE_material_mesh_get(struct Scene *scene,
                                         ma,
                                         engine,
                                         options,
+                                        false,
                                         e_data.vert_shader_str,
                                         NULL,
                                         e_data.frag_shader_lib,
@@ -755,6 +759,7 @@ struct GPUMaterial *EEVEE_material_mesh_volume_get(struct Scene *scene, Material
                                         ma,
                                         engine,
                                         options,
+                                        true,
                                         e_data.vert_volume_shader_str,
                                         e_data.geom_volume_shader_str,
                                         e_data.volume_shader_lib,
@@ -791,6 +796,7 @@ struct GPUMaterial *EEVEE_material_mesh_depth_get(struct Scene *scene,
                                         ma,
                                         engine,
                                         options,
+                                        false,
                                         (is_shadow) ? e_data.vert_shadow_shader_str :
                                                       e_data.vert_shader_str,
                                         NULL,
@@ -820,6 +826,7 @@ struct GPUMaterial *EEVEE_material_hair_get(struct Scene *scene, Material *ma)
                                         ma,
                                         engine,
                                         options,
+                                        false,
                                         e_data.vert_shader_str,
                                         NULL,
                                         e_data.frag_shader_lib,
@@ -1633,7 +1640,7 @@ void EEVEE_materials_cache_populate(EEVEE_Data *vedata,
      * to know if the material has a "volume nodetree".
      */
     bool use_volume_material = (gpumat_array[0] &&
-                                GPU_material_use_domain_volume(gpumat_array[0]));
+                                GPU_material_has_volume_output(gpumat_array[0]));
 
     if (ob->type == OB_HAIR) {
       /* Hair object. */
@@ -1668,7 +1675,7 @@ void EEVEE_materials_cache_populate(EEVEE_Data *vedata,
           /* Do not render surface if we are rendering a volume object
            * and do not have a surface closure. */
           if (use_volume_material &&
-              (gpumat_array[i] && !GPU_material_use_domain_surface(gpumat_array[i]))) {
+              (gpumat_array[i] && !GPU_material_has_surface_output(gpumat_array[i]))) {
             continue;
           }
 
diff --git a/source/blender/draw/engines/eevee/eevee_volumes.c b/source/blender/draw/engines/eevee/eevee_volumes.c
index 56699f1c562..814d0b17b09 100644
--- a/source/blender/draw/engines/eevee/eevee_volumes.c
+++ b/source/blender/draw/engines/eevee/eevee_volumes.c
@@ -354,7 +354,7 @@ void EEVEE_volumes_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
       !LOOK_DEV_STUDIO_LIGHT_ENABLED(draw_ctx->v3d)) {
     struct GPUMaterial *mat = EEVEE_material_world_volume_get(scene, wo);
 
-    if (GPU_material_use_domain_volume(mat)) {
+    if (GPU_material_has_volume_output(mat)) {
       grp = DRW_shgroup_material_create(mat, psl->volumetric_world_ps);
     }
 
@@ -368,9 +368,12 @@ void EEVEE_volumes_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
       DRW_shgroup_uniform_block(grp, "shadow_block", sldata->shadow_ubo);
 
       /* Fix principle volumetric not working with world materials. */
-      DRW_shgroup_uniform_texture(grp, "sampdensity", e_data.dummy_density);
-      DRW_shgroup_uniform_texture(grp, "sampflame", e_data.dummy_flame);
-      DRW_shgroup_uniform_vec2_copy(grp, "unftemperature", (float[2]){0.0f, 1.0f});
+      ListBase textures = GPU_material_textures(mat);
+      for (GPUMaterialTexture *tex = textures.first; tex; tex = tex->next) {
+        if (tex->volume_grid) {
+          DRW_shgroup_uniform_texture(grp, tex->shadername, e_data.dummy_density);
+        }
+      }
 
       DRW_shgroup_call_procedural_triangles(grp, NULL, common_data->vol_tex_size[2]);
 
@@ -392,8 +395,6 @@ void EEVEE_volumes_cache_object_add(EEVEE_ViewLayerData *sldata,
                                     Scene *scene,
                                     Object *ob)
 {
-  static const float white[3] = {1.0f, 1.0f, 1.0f};
-
   struct ModifierData *md = NULL;
   Material *ma = BKE_object_material_get(ob, 1);
 
@@ -438,40 +439,40 @@ void EEVEE_volumes_cache_object_add(EEVEE_ViewLayerData *sldata,
 
   static const float zero_transform[4][4] = {{0.0f, 0.0f}};
 
+  ListBase textures = GPU_material_textures(mat);
+
   /* Volume Object */
   if (ob->type == OB_VOLUME) {
-    // TODO: check what the BASE_FROM_DUPLI test is for, do we need it too?
     Volume *volume = ob->data;
     BKE_volume_load(volume, G.main);
 
-    VolumeGrid *volume_density = BKE_volume_grid_find(volume, "density");
-    if (volume_density == NULL) {
-      return;
-    }
-    DRWVolumeGrid *density = DRW_volume_batch_cache_get_grid(volume, volume_density);
-    if (density == NULL) {
-      return;
-    }
+    /* TODO: ensure we are culling volumes out of view. */
+    bool have_transform = false;
 
-    // TODO: ensure we are culling volumes out of view
-
-    // TODO: shaders assumes all textures to have the same bounding box.
-    // to solve this each texture would need its own loc + size transform.
-    // DRWVolumeGrid *temperature = DRW_volume_batch_cache_get_temperature(volume);
+    for (GPUMaterialTexture *tex = textures.first; tex; tex = tex->next) {
+      if (tex->volume_grid == NULL) {
+        continue;
+      }
 
-    // TODO: why a texture reference? probably there is no way to dynamically update it.
-    DRW_shgroup_uniform_texture_ref(grp, "sampdensity", &density->texture);
-    DRW_shgroup_uniform_texture_ref(grp, "sampcolor", &e_data.dummy_color);
-    DRW_shgroup_uniform_texture_ref(grp, "sampflame", &e_data.dummy_flame);
+      VolumeGrid *volume_grid = BKE_volume_grid_find(volume, tex->volume_grid);
+      DRWVolumeGrid *drw_grid = (volume_grid) ?
+                                    DRW_volume_batch_cache_get_grid(volume, volume_grid) :
+                                    NULL;
 
-    DRW_shgroup_uniform_vec3(grp, "volumeColor", white, 1);
+      DRW_shgroup_uniform_texture(
+          grp, tex->shadername, (drw_grid) ? drw_grid->texture : e_data.dummy_density);
 
-    /* Output is such that 0..1 maps to 0..1000K */
-    const float flame_ignition = 1.5f;  // TODO: user setting?
-    DRW_shgroup_uniform_vec2(grp, "unftemperature", &flame_ignition, 1);
+      /* Volume dimensions for texture sampling. */
+      if (!have_transform && drw_grid) {
+        /* TODO: support different transform per grid. */
+        DRW_shgroup_uniform_mat4(grp, "volumeObjectToLocal", drw_grid->object_to_texture);
+        have_transform = true;
+      }
+    }
 
-    /* Compute transform. */
-    DRW_shgroup_uniform_mat4(grp, "volumeObjectToLocal", density->object_to_texture);
+    if (!have_transform) {
+      return;
+    }
   }
   /* Smoke Simulation */
   else if (((ob->base_flag & BASE_FROM_DUPLI) == 0) &&
@@ -504,22 +505,39 @@ void EEVEE_volumes_cache_object_add(EEVEE_ViewLayerData *sldata,
       BLI_addtail(&e_data.smoke_domains, BLI_genericNodeN(mmd));
     }
 
-    DRW_shgroup_uniform_texture_ref(
-        grp, "sampdensity", mds->tex_density ? &mds->tex_density : &e_data.dummy_density);
-    DRW_shgroup_uniform_texture_ref(
-        grp, "sampcolor", mds->tex_color ? &mds->tex_color : &e_data.dummy_color);
-    DRW_shgroup_uniform_texture_ref(
-        grp, "sampflame", mds->tex_flame ? &mds->tex_flame : &e_data.dummy_flame);
+    for (GPUMaterialTexture *tex = textures.first; tex; tex = tex->next) {
+      if (tex->volume_grid == NULL) {
+        continue;
+      }
 
-    /* Constant Volume color. */
-    bool use_constant_color = ((mds->active_fields & FLUID_DOMAIN_ACTIVE_COLORS) == 0 &&
-                               (mds->active_fields & FLUID_DOMAIN_ACTIVE_COLOR_SET) != 0);
+      if (STREQ(tex->volume_grid, "density")) {
+        DRW_shgroup_uniform_texture_ref(
+            grp, tex->shadername, mds->tex_density ? &mds->tex_density : &e_data.dummy_density);
+      }
+      else if (STREQ(tex->volume_grid, "color")) {
+        DRW_shgroup_uni

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list