[Bf-blender-cvs] [c8acb6dd6c5] master: Smoke: put density/color in separate textures, fixes for workbench shader

Brecht Van Lommel noreply at git.blender.org
Wed Mar 11 14:48:48 CET 2020


Commit: c8acb6dd6c58c6a85ab18d26f02973437cb2f700
Author: Brecht Van Lommel
Date:   Wed Mar 11 13:56:28 2020 +0100
Branches: master
https://developer.blender.org/rBc8acb6dd6c58c6a85ab18d26f02973437cb2f700

Smoke: put density/color in separate textures, fixes for workbench shader

This is more in line with standard grids and means we don't have to make
many special exceptions in the upcoming change for arbitrary number of volume
grids support in Eevee.

The workbench shader was also changed to fix bugs where squared density was
used, and the smoke color would affect the density so that black smoke would
be invisible. This can change the look of smoke in workbench significantly.

When using the color grid when smoke has a constant color, the color grid
will no longer be premultiplied by the density. If the color is constant
we want to be able not to store a grid at all. This breaks one test for
Cycles and Eevee, but the setup in that test using a color without density
does not make sense. It suffers from artifacts since the unpremultiplied
color grid by itself will not have smooth boundaries.

Differential Revision: https://developer.blender.org/D6951

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

M	intern/mantaflow/extern/manta_fluid_API.h
M	intern/mantaflow/intern/manta_fluid_API.cpp
M	source/blender/blenloader/intern/readfile.c
M	source/blender/draw/engines/eevee/eevee_volumes.c
M	source/blender/draw/engines/workbench/shaders/workbench_volume_frag.glsl
M	source/blender/draw/engines/workbench/workbench_volume.c
M	source/blender/gpu/GPU_material.h
M	source/blender/gpu/GPU_texture.h
M	source/blender/gpu/intern/gpu_codegen.c
M	source/blender/gpu/intern/gpu_draw_smoke.c
M	source/blender/gpu/intern/gpu_texture.c
M	source/blender/gpu/shaders/material/gpu_shader_material_volume_info.glsl
M	source/blender/makesdna/DNA_fluid_types.h
M	source/blender/makesrna/intern/rna_fluid.c
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/intern/mantaflow/extern/manta_fluid_API.h b/intern/mantaflow/extern/manta_fluid_API.h
index 5ed94d99edd..48d42504994 100644
--- a/intern/mantaflow/extern/manta_fluid_API.h
+++ b/intern/mantaflow/extern/manta_fluid_API.h
@@ -132,14 +132,14 @@ void manta_smoke_turbulence_export(struct MANTA *smoke,
                                    float **tcw2);
 void manta_smoke_get_rgba(struct MANTA *smoke, float *data, int sequential);
 void manta_smoke_turbulence_get_rgba(struct MANTA *smoke, float *data, int sequential);
-void manta_smoke_get_rgba_from_density(struct MANTA *smoke,
-                                       float color[3],
-                                       float *data,
-                                       int sequential);
-void manta_smoke_turbulence_get_rgba_from_density(struct MANTA *smoke,
-                                                  float color[3],
-                                                  float *data,
-                                                  int sequential);
+void manta_smoke_get_rgba_fixed_color(struct MANTA *smoke,
+                                      float color[3],
+                                      float *data,
+                                      int sequential);
+void manta_smoke_turbulence_get_rgba_fixed_color(struct MANTA *smoke,
+                                                 float color[3],
+                                                 float *data,
+                                                 int sequential);
 void manta_smoke_ensure_heat(struct MANTA *smoke, struct FluidModifierData *mmd);
 void manta_smoke_ensure_fire(struct MANTA *smoke, struct FluidModifierData *mmd);
 void manta_smoke_ensure_colors(struct MANTA *smoke, struct FluidModifierData *mmd);
diff --git a/intern/mantaflow/intern/manta_fluid_API.cpp b/intern/mantaflow/intern/manta_fluid_API.cpp
index 7e3e4520485..89c69bebc51 100644
--- a/intern/mantaflow/intern/manta_fluid_API.cpp
+++ b/intern/mantaflow/intern/manta_fluid_API.cpp
@@ -455,14 +455,9 @@ static void get_rgba(
 
   for (i = 0; i < total_cells; i++) {
     float alpha = a[i];
-    if (alpha) {
-      data[i * m] = r[i];
-      data[i * m + i_g] = g[i];
-      data[i * m + i_b] = b[i];
-    }
-    else {
-      data[i * m] = data[i * m + i_g] = data[i * m + i_b] = 0.0f;
-    }
+    data[i * m] = r[i] * alpha;
+    data[i * m + i_g] = g[i] * alpha;
+    data[i * m + i_b] = b[i] * alpha;
     data[i * m + i_a] = alpha;
   }
 }
@@ -489,8 +484,7 @@ void manta_smoke_turbulence_get_rgba(MANTA *smoke, float *data, int sequential)
            sequential);
 }
 
-static void get_rgba_from_density(
-    float color[3], float *a, int total_cells, float *data, int sequential)
+static void get_rgba_fixed_color(float color[3], int total_cells, float *data, int sequential)
 {
   int i;
   int m = 4, i_g = 1, i_b = 2, i_a = 3;
@@ -502,31 +496,24 @@ static void get_rgba_from_density(
   }
 
   for (i = 0; i < total_cells; i++) {
-    float alpha = a[i];
-    if (alpha) {
-      data[i * m] = color[0] * alpha;
-      data[i * m + i_g] = color[1] * alpha;
-      data[i * m + i_b] = color[2] * alpha;
-    }
-    else {
-      data[i * m] = data[i * m + i_g] = data[i * m + i_b] = 0.0f;
-    }
-    data[i * m + i_a] = alpha;
+    data[i * m] = color[0];
+    data[i * m + i_g] = color[1];
+    data[i * m + i_b] = color[2];
+    data[i * m + i_a] = 1.0f;
   }
 }
 
-void manta_smoke_get_rgba_from_density(MANTA *smoke, float color[3], float *data, int sequential)
+void manta_smoke_get_rgba_fixed_color(MANTA *smoke, float color[3], float *data, int sequential)
 {
-  get_rgba_from_density(color, smoke->getDensity(), smoke->getTotalCells(), data, sequential);
+  get_rgba_fixed_color(color, smoke->getTotalCells(), data, sequential);
 }
 
-void manta_smoke_turbulence_get_rgba_from_density(MANTA *smoke,
-                                                  float color[3],
-                                                  float *data,
-                                                  int sequential)
+void manta_smoke_turbulence_get_rgba_fixed_color(MANTA *smoke,
+                                                 float color[3],
+                                                 float *data,
+                                                 int sequential)
 {
-  get_rgba_from_density(
-      color, smoke->getDensityHigh(), smoke->getTotalCellsHigh(), data, sequential);
+  get_rgba_fixed_color(color, smoke->getTotalCellsHigh(), data, sequential);
 }
 
 void manta_smoke_ensure_heat(MANTA *smoke, struct FluidModifierData *mmd)
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index d3f41945553..f73dc9a5466 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -5439,7 +5439,8 @@ static void direct_link_modifiers(FileData *fd, ListBase *lb, Object *ob)
 
         mmd->domain->fluid = NULL;
         mmd->domain->fluid_mutex = BLI_rw_mutex_alloc();
-        mmd->domain->tex = NULL;
+        mmd->domain->tex_density = NULL;
+        mmd->domain->tex_color = NULL;
         mmd->domain->tex_shadow = NULL;
         mmd->domain->tex_flame = NULL;
         mmd->domain->tex_flame_coba = NULL;
diff --git a/source/blender/draw/engines/eevee/eevee_volumes.c b/source/blender/draw/engines/eevee/eevee_volumes.c
index d11e93bbc3f..dcb8b04fbcd 100644
--- a/source/blender/draw/engines/eevee/eevee_volumes.c
+++ b/source/blender/draw/engines/eevee/eevee_volumes.c
@@ -141,10 +141,10 @@ static void eevee_create_shader_volumes(void)
   e_data.volumetric_accum_sh = DRW_shader_create_fullscreen(datatoc_volumetric_accum_frag_glsl,
                                                             NULL);
 
-  float color[4] = {1.0f, 1.0f, 1.0f, 1.0f};
-  e_data.dummy_density = DRW_texture_create_3d(1, 1, 1, GPU_RGBA8, DRW_TEX_WRAP, color);
+  const float density[4] = {1.0f, 1.0f, 1.0f, 1.0f};
+  e_data.dummy_density = DRW_texture_create_3d(1, 1, 1, GPU_RGBA8, DRW_TEX_WRAP, density);
 
-  float flame = 0.0f;
+  const float flame = 0.0f;
   e_data.dummy_flame = DRW_texture_create_3d(1, 1, 1, GPU_R8, DRW_TEX_WRAP, &flame);
 }
 
@@ -368,6 +368,7 @@ void EEVEE_volumes_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
 
       /* Fix principle volumetric not working with world materials. */
       DRW_shgroup_uniform_texture(grp, "sampdensity", e_data.dummy_density);
+      DRW_shgroup_uniform_texture(grp, "sampcolor", 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});
 
@@ -477,7 +478,9 @@ void EEVEE_volumes_cache_object_add(EEVEE_ViewLayerData *sldata,
     }
 
     DRW_shgroup_uniform_texture_ref(
-        grp, "sampdensity", mds->tex ? &mds->tex : &e_data.dummy_density);
+        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_density);
     DRW_shgroup_uniform_texture_ref(
         grp, "sampflame", mds->tex_flame ? &mds->tex_flame : &e_data.dummy_flame);
 
@@ -493,6 +496,7 @@ void EEVEE_volumes_cache_object_add(EEVEE_ViewLayerData *sldata,
   }
   else {
     DRW_shgroup_uniform_texture(grp, "sampdensity", e_data.dummy_density);
+    DRW_shgroup_uniform_texture(grp, "sampcolor", e_data.dummy_density);
     DRW_shgroup_uniform_texture(grp, "sampflame", e_data.dummy_flame);
     DRW_shgroup_uniform_vec3(grp, "volumeColor", white, 1);
     DRW_shgroup_uniform_vec2(grp, "unftemperature", (float[2]){0.0f, 1.0f}, 1);
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_volume_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_volume_frag.glsl
index c38d8fe06bc..585e48ae7ec 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_volume_frag.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_volume_frag.glsl
@@ -134,8 +134,9 @@ void volume_properties(vec3 ls_pos, out vec3 scattering, out float extinction)
   float shadows = sample_volume_texture(shadowTexture, co).r;
   vec4 density = sample_volume_texture(densityTexture, co); /* rgb: color, a: density */
 
-  scattering = density.rgb * (density.a * densityScale) * activeColor;
+  scattering = density.rgb * densityScale;
   extinction = max(1e-4, dot(scattering, vec3(0.33333)));
+  scattering *= activeColor;
 
   /* Scale shadows in log space and clamp them to avoid completely black shadows. */
   scattering *= exp(clamp(log(shadows) * densityScale * 0.1, -2.5, 0.0)) * M_PI;
diff --git a/source/blender/draw/engines/workbench/workbench_volume.c b/source/blender/draw/engines/workbench/workbench_volume.c
index 2f7296fb40f..2c61e894e8c 100644
--- a/source/blender/draw/engines/workbench/workbench_volume.c
+++ b/source/blender/draw/engines/workbench/workbench_volume.c
@@ -146,7 +146,8 @@ void workbench_volume_cache_populate(WORKBENCH_Data *vedata,
     GPU_create_smoke(mmd, 1);
   }
 
-  if ((!mds->use_coba && mds->tex == NULL) || (mds->use_coba && mds->tex_field == NULL)) {
+  if ((!mds->use_coba && (mds->tex_density == NULL && mds->tex_color == NULL)) ||
+      (mds->use_coba && mds->tex_field == NULL)) {
     return;
   }
 
@@ -201,7 +202,8 @@ void workbench_volume_cache_populate(WORKBENCH_Data *vedata,
     static float white[3] = {1.0f, 1.0f, 1.0f};
     bool use_constant_color = ((mds->active_fields & FLUID_DOMAIN_ACTIVE_COLORS) == 0 &&
                                (mds->active_fields & FLUID_DOMAIN_ACTIVE_COLOR_SET) != 0);
-    DRW_shgroup_uniform_texture(grp, "densityTexture", mds->tex);
+    DRW_shgroup_uniform_texture(
+        grp, "densityTexture", (mds->tex_color) ? mds->tex_color : mds->tex_density);
     DRW_shgroup_uniform_texture(grp, "shadowTexture", mds->tex_shadow);
     DRW_shgroup_uniform_texture(
         grp, "flameTexture", (mds->tex_flame) ? mds->tex_flame : e_data.dummy_tex);
diff --git a/source/blender/gpu/GPU_material.h b/source/blender/gpu/GPU_material.h
index 37fe30bc96b..7107748e62a 100644
--- a/source/blender/gpu/GPU_material.h
+++ b/source/blender/gpu/GPU_material.h
@@ -99,11 +99,12 @@ type

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list