[Bf-blender-cvs] [eea22dd5ef0] blender2.8: Workbench: Smoke: Fix display

Clément Foucault noreply at git.blender.org
Mon Oct 8 17:20:20 CEST 2018


Commit: eea22dd5ef0aaf58066bbff460315c8867741920
Author: Clément Foucault
Date:   Mon Oct 8 11:25:24 2018 +0200
Branches: blender2.8
https://developer.blender.org/rBeea22dd5ef0aaf58066bbff460315c8867741920

Workbench: Smoke: Fix display

Includes the following fixes
- Fix smoke texture creation: data was interpreted as Byte instead of Floats.
- Fix Velocity texture not being free after draw: also was causing crashes.
- Fix display_thickness not being copied during COW.
- Fix Blending and general volume rendering algorithm.
- Add Volume Shadowing support.

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

M	source/blender/blenkernel/intern/smoke.c
M	source/blender/draw/engines/workbench/shaders/workbench_volume_frag.glsl
M	source/blender/draw/engines/workbench/shaders/workbench_volume_vert.glsl
M	source/blender/draw/engines/workbench/workbench_volume.c
M	source/blender/draw/modes/object_mode.c
M	source/blender/gpu/intern/gpu_draw.c

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

diff --git a/source/blender/blenkernel/intern/smoke.c b/source/blender/blenkernel/intern/smoke.c
index b3f1cbf6a1f..4f41a551454 100644
--- a/source/blender/blenkernel/intern/smoke.c
+++ b/source/blender/blenkernel/intern/smoke.c
@@ -664,6 +664,7 @@ void smokeModifier_copy(const struct SmokeModifierData *smd, struct SmokeModifie
 		tsds->data_depth = sds->data_depth;
 		tsds->cache_file_format = sds->cache_file_format;
 
+		tsds->display_thickness = sds->display_thickness;
 		tsds->slice_method = sds->slice_method;
 		tsds->axis_slice_method = sds->axis_slice_method;
 		tsds->slice_per_voxel = sds->slice_per_voxel;
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 1f14e506dcf..fb3fcd2a4b6 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_volume_frag.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_volume_frag.glsl
@@ -3,9 +3,11 @@ uniform mat4 ProjectionMatrix;
 uniform mat4 ModelMatrixInverse;
 uniform mat4 ModelViewMatrixInverse;
 uniform mat4 ModelMatrix;
+uniform vec3 OrcoTexCoFactors[2];
 
 uniform sampler2D depthBuffer;
 uniform sampler3D densityTexture;
+uniform sampler3D shadowTexture;
 
 uniform int samplesLen = 256;
 uniform float stepLength; /* Step length in local space. */
@@ -62,15 +64,23 @@ float line_unit_box_intersect_dist(vec3 lineorigin, vec3 linedirection)
 
 void volume_properties(vec3 ls_pos, out vec3 scattering, out float extinction)
 {
-	scattering = vec3(0.0);
-	extinction = 1e-8;
-
-	vec4 density = texture(densityTexture, ls_pos * 0.5 + 0.5);
-	density.rgb /= density.a;
-	density *= densityScale;
+	vec3 co = ls_pos * 0.5 + 0.5;
+	float shadows = texture(shadowTexture, co).r;
+	vec4 density = texture(densityTexture, co); /* rgb: color, a: density */
+	density.a *= densityScale;
+
+	scattering = density.rgb * density.a;
+	extinction = max(1e-4, dot(scattering, vec3(0.33333)));
+	scattering *= shadows * M_PI;
+}
 
-	scattering = density.rgb;
-	extinction = max(1e-8, density.a);
+void eval_volume_step(inout vec3 Lscat, float extinction, float step_len, out float Tr)
+{
+	Lscat *= phase_function_isotropic();
+	/* Evaluate Scattering */
+	Tr = exp(-extinction * step_len);
+	/* integrate along the current step segment */
+	Lscat = (Lscat - Lscat * Tr) / extinction;
 }
 
 #define P(x) ((x + 0.5) * (1.0 / 16.0))
@@ -96,18 +106,15 @@ vec4 volume_integration(
 		vec3 ls_pos = ray_ori + ray_dir * ray_len;
 
 		vec3 Lscat;
-		float s_extinction;
+		float s_extinction, Tr;
 		volume_properties(ls_pos, Lscat, s_extinction);
-		/* Evaluate Scattering */
-		float Tr = exp(-s_extinction * step_len);
-		/* integrate along the current step segment */
-		Lscat = (Lscat - Lscat * Tr) / s_extinction;
+		eval_volume_step(Lscat, s_extinction, step_len, Tr);
 		/* accumulate and also take into account the transmittance from previous steps */
 		final_scattering += final_transmittance * Lscat;
 		final_transmittance *= Tr;
 	}
 
-	return vec4(final_scattering, 1.0 - final_transmittance);
+	return vec4(final_scattering, final_transmittance);
 }
 
 void main()
@@ -134,15 +141,11 @@ void main()
 	step_len = 1.0 / step_len;
 
 	vec3 Lscat;
-	float s_extinction;
+	float s_extinction, Tr;
 	volume_properties(localPos, Lscat, s_extinction);
-	/* Evaluate Scattering */
-	float Tr = exp(-s_extinction * step_len);
-	/* integrate along the current step segment */
-	Lscat = (Lscat - Lscat * Tr) / s_extinction;
-
-	fragColor = vec4(Lscat, 1.0 - Tr);
+	eval_volume_step(Lscat, s_extinction, step_len, Tr);
 
+	fragColor = vec4(Lscat, Tr);
 #else
 	vec2 screen_uv = gl_FragCoord.xy / vec2(textureSize(depthBuffer, 0).xy);
 	bool is_persp = ProjectionMatrix[3][3] == 0.0;
@@ -156,10 +159,13 @@ void main()
 	vec3 vs_ray_dir = (is_persp) ? (vs_ray_end - vs_ray_ori) : vec3(0.0, 0.0, -1.0);
 	vs_ray_dir /= abs(vs_ray_dir.z);
 
-	vec3 ls_ray_dir = mat3(ModelViewMatrixInverse) * vs_ray_dir;
+	vec3 ls_ray_dir = mat3(ModelViewMatrixInverse) * vs_ray_dir * OrcoTexCoFactors[1] * 2.0;
 	vec3 ls_ray_ori = (ModelViewMatrixInverse * vec4(vs_ray_ori, 1.0)).xyz;
 	vec3 ls_ray_end = (ModelViewMatrixInverse * vec4(vs_ray_end, 1.0)).xyz;
 
+	ls_ray_ori = (OrcoTexCoFactors[0] + ls_ray_ori * OrcoTexCoFactors[1]) * 2.0 - 1.0;
+	ls_ray_end = (OrcoTexCoFactors[0] + ls_ray_end * OrcoTexCoFactors[1]) * 2.0 - 1.0;
+
 	/* TODO: Align rays to volume center so that it mimics old behaviour of slicing the volume. */
 
 	float dist = line_unit_box_intersect_dist(ls_ray_ori, ls_ray_dir);
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_volume_vert.glsl b/source/blender/draw/engines/workbench/shaders/workbench_volume_vert.glsl
index 90a22d9d02f..7ce21c3d5ca 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_volume_vert.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_volume_vert.glsl
@@ -1,5 +1,6 @@
 
 uniform mat4 ModelViewProjectionMatrix;
+uniform vec3 OrcoTexCoFactors[2];
 uniform float slicePosition;
 uniform int sliceAxis; /* -1 is no slice, 0 is X, 1 is Y, 2 is Z. */
 
@@ -23,9 +24,10 @@ void main()
 	else {
 		localPos = vec3(pos.xy, slicePosition * 2.0 - 1.0);
 	}
-
-	gl_Position = ModelViewProjectionMatrix * vec4(localPos, 1.0);
+	vec3 final_pos = localPos;
 #else
-	gl_Position = ModelViewProjectionMatrix * vec4(pos, 1.0);
+	vec3 final_pos = pos;
 #endif
+	final_pos = ((final_pos * 0.5 + 0.5) - OrcoTexCoFactors[0]) / OrcoTexCoFactors[1];
+	gl_Position = ModelViewProjectionMatrix * vec4(final_pos, 1.0);
 }
diff --git a/source/blender/draw/engines/workbench/workbench_volume.c b/source/blender/draw/engines/workbench/workbench_volume.c
index ea4152486af..e6563b3113b 100644
--- a/source/blender/draw/engines/workbench/workbench_volume.c
+++ b/source/blender/draw/engines/workbench/workbench_volume.c
@@ -61,7 +61,7 @@ void workbench_volume_engine_free(void)
 
 void workbench_volume_cache_init(WORKBENCH_Data *vedata)
 {
-	vedata->psl->volume_pass = DRW_pass_create("Volumes", DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_PREMUL | DRW_STATE_CULL_FRONT);
+	vedata->psl->volume_pass = DRW_pass_create("Volumes", DRW_STATE_WRITE_COLOR | DRW_STATE_TRANSMISSION | DRW_STATE_CULL_FRONT);
 }
 
 void workbench_volume_cache_populate(WORKBENCH_Data *vedata, Scene *scene, Object *ob, ModifierData *md)
@@ -101,6 +101,7 @@ void workbench_volume_cache_populate(WORKBENCH_Data *vedata, Scene *scene, Objec
 
 		DRWShadingGroup *grp = DRW_shgroup_create(e_data.volume_slice_sh, vedata->psl->volume_pass);
 		DRW_shgroup_uniform_texture(grp, "densityTexture", sds->tex);
+		DRW_shgroup_uniform_texture(grp, "shadowTexture", sds->tex_shadow);
 		DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", &dtxl->depth);
 		DRW_shgroup_uniform_float_copy(grp, "densityScale", 10.0f * sds->display_thickness);
 		DRW_shgroup_uniform_float_copy(grp, "slicePosition", sds->slice_depth);
@@ -120,6 +121,7 @@ void workbench_volume_cache_populate(WORKBENCH_Data *vedata, Scene *scene, Objec
 		DRW_shgroup_uniform_vec4(grp, "viewvecs[0]", (float *)wpd->viewvecs, 3);
 		DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", &dtxl->depth);
 		DRW_shgroup_uniform_texture(grp, "densityTexture", sds->tex);
+		DRW_shgroup_uniform_texture(grp, "shadowTexture", sds->tex_shadow);
 		DRW_shgroup_uniform_float_copy(grp, "densityScale", 10.0f * sds->display_thickness);
 		DRW_shgroup_uniform_int_copy(grp, "samplesLen", max_slices);
 		/* TODO FIXME : This step size is in object space but the ray itself
diff --git a/source/blender/draw/modes/object_mode.c b/source/blender/draw/modes/object_mode.c
index 9bf5263bacf..2901a718d59 100644
--- a/source/blender/draw/modes/object_mode.c
+++ b/source/blender/draw/modes/object_mode.c
@@ -2040,7 +2040,7 @@ static void volumes_free_smoke_textures(void)
 	 * all viewport in a redraw at least. */
 	for (LinkData *link = e_data.smoke_domains.first; link; link = link->next) {
 		SmokeModifierData *smd = (SmokeModifierData *)link->data;
-		GPU_free_smoke(smd);
+		GPU_free_smoke_velocity(smd);
 	}
 	BLI_freelistN(&e_data.smoke_domains);
 }
diff --git a/source/blender/gpu/intern/gpu_draw.c b/source/blender/gpu/intern/gpu_draw.c
index 7902c5296aa..594a2d6d740 100644
--- a/source/blender/gpu/intern/gpu_draw.c
+++ b/source/blender/gpu/intern/gpu_draw.c
@@ -915,9 +915,10 @@ void GPU_create_smoke(SmokeModifierData *smd, int highres)
 			}
 			/* density only */
 			else {
-				sds->tex = GPU_texture_create_3D(
-				        sds->res[0], sds->res[1], sds->res[2],
-				        GPU_R8, smoke_get_density(sds->fluid), NULL);
+				sds->tex = GPU_texture_create_nD(
+				        sds->res[0], sds->res[1], sds->res[2], 3,
+				        smoke_get_density(sds->fluid),
+				        GPU_R8, GPU_DATA_FLOAT, 0, true, NULL);
 
 				/* Swizzle the RGBA components to read the Red channel so
 				 * that the shader stay the same for colored and non color
@@ -931,10 +932,11 @@ void GPU_create_smoke(SmokeModifierData *smd, int highres)
 			}
 			sds->tex_flame = (
 			        smoke_has_fuel(sds->fluid) ?
-			        GPU_texture_create_3D(
-			                sds->res[0], sds->res[1], sds->res[2],
-			                GPU_R8, smoke_get_flame(sds->fluid), NULL) :
-			        NULL);
+			                GPU_texture_create_nD(
+			                              sds->res[0], sds->res[1], sds->res[2], 3,
+			                              smoke_get_flame(sds->fluid),
+			                              GPU_R8, GPU_DATA_FLOAT, 0, true, NULL) :
+			                NULL);
 		}
 		else if (!sds->tex && highres) {
 			/* rgba texture for color + density */
@@ -946,9 +948,10 @@ void GPU_create_smoke(SmokeModifierData *smd, int highres)
 			}
 			/* density only */
 			else {
-				sds->tex = GPU_texture_create_3D(
-				        sds->res_wt[0], sds->res_wt[1], sds->res_wt[2],
-				        GPU_R8, smoke_turbulence_get_density(sds->wt), NULL);
+				sds->tex = GPU_texture_create_nD(
+				        sds->res_wt[0], sds->res_wt[1], sds->res_wt[2], 3,
+				        smoke_turbulence_get_density(sds->wt),
+				        GPU_R8, GPU_DATA_FLOAT, 0, true, NULL);
 
 				/* Swizzle the RGBA components to read the Red channel so
 				 * that the shader stay the same for colored and non color
@@ -962,15 

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list