[Bf-blender-cvs] [af061b4dac1] blender2.8: Eeevee: add temperature grid support, make color grid unpremultiplied.

Brecht Van Lommel noreply at git.blender.org
Fri Feb 23 19:12:16 CET 2018


Commit: af061b4dac140c5acea21f69257bfc5c18b3fe1c
Author: Brecht Van Lommel
Date:   Thu Feb 22 18:51:20 2018 +0100
Branches: blender2.8
https://developer.blender.org/rBaf061b4dac140c5acea21f69257bfc5c18b3fe1c

Eeevee: add temperature grid support, make color grid unpremultiplied.

This matches similar changes done for Cycles.

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

M	source/blender/blenloader/intern/readfile.c
M	source/blender/draw/engines/eevee/eevee_volumes.c
M	source/blender/gpu/GPU_material.h
M	source/blender/gpu/intern/gpu_codegen.c
M	source/blender/gpu/shaders/gpu_shader_material.glsl
M	source/blender/nodes/shader/nodes/node_shader_attribute.c

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

diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index 38149ae94ae..d96be6a9f55 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -5287,6 +5287,7 @@ static void direct_link_modifiers(FileData *fd, ListBase *lb)
 				smd->domain->shadow = NULL;
 				smd->domain->tex = NULL;
 				smd->domain->tex_shadow = NULL;
+				smd->domain->tex_flame = NULL;
 				smd->domain->tex_wt = NULL;
 				smd->domain->coba = newdataadr(fd, smd->domain->coba);
 				
diff --git a/source/blender/draw/engines/eevee/eevee_volumes.c b/source/blender/draw/engines/eevee/eevee_volumes.c
index 2c5b9072837..0a1b0f7a52b 100644
--- a/source/blender/draw/engines/eevee/eevee_volumes.c
+++ b/source/blender/draw/engines/eevee/eevee_volumes.c
@@ -506,6 +506,9 @@ void EEVEE_volumes_cache_object_add(EEVEE_ViewLayerData *sldata, EEVEE_Data *ved
 		if (sds->tex_flame != NULL) {
 			DRW_shgroup_uniform_buffer(grp, "sampflame", &sds->tex_flame);
 		}
+
+		/* Output is such that 0..1 maps to 0..1000K */
+		DRW_shgroup_uniform_vec2(grp, "unftemperature", &sds->flame_ignition, 1);
 	}
 }
 
diff --git a/source/blender/gpu/GPU_material.h b/source/blender/gpu/GPU_material.h
index e2f40ff5c54..8f1ee7ccc59 100644
--- a/source/blender/gpu/GPU_material.h
+++ b/source/blender/gpu/GPU_material.h
@@ -110,7 +110,8 @@ typedef enum GPUBuiltin {
 	GPU_INVERSE_LOC_TO_VIEW_MATRIX = (1 << 14),
 	GPU_OBJECT_INFO =           (1 << 15),
 	GPU_VOLUME_DENSITY =        (1 << 16),
-	GPU_VOLUME_FLAME =          (1 << 17)
+	GPU_VOLUME_FLAME =          (1 << 17),
+	GPU_VOLUME_TEMPERATURE =    (1 << 18)
 } GPUBuiltin;
 
 typedef enum GPUOpenGLBuiltin {
diff --git a/source/blender/gpu/intern/gpu_codegen.c b/source/blender/gpu/intern/gpu_codegen.c
index 9e4daa2a036..ce75d944747 100644
--- a/source/blender/gpu/intern/gpu_codegen.c
+++ b/source/blender/gpu/intern/gpu_codegen.c
@@ -427,6 +427,8 @@ const char *GPU_builtin_name(GPUBuiltin builtin)
 		return "sampdensity";
 	else if (builtin == GPU_VOLUME_FLAME)
 		return "sampflame";
+	else if (builtin == GPU_VOLUME_TEMPERATURE)
+		return "unftemperature";
 	else
 		return "";
 }
diff --git a/source/blender/gpu/shaders/gpu_shader_material.glsl b/source/blender/gpu/shaders/gpu_shader_material.glsl
index 7acd9aa1fd5..71333149634 100644
--- a/source/blender/gpu/shaders/gpu_shader_material.glsl
+++ b/source/blender/gpu/shaders/gpu_shader_material.glsl
@@ -3153,7 +3153,13 @@ void node_attribute_volume_color(sampler3D tex, out vec4 outcol, out vec3 outvec
 #else
 	vec3 cos = vec3(0.0);
 #endif
-	outvec = texture(tex, cos).rgb;
+
+	vec4 value = texture(tex, cos).rgba;
+	/* Density is premultiplied for interpolation, divide it out here. */
+	if (value.a > 0.0)
+		value.rgb /= value.a;
+
+	outvec = value.rgb;
 	outcol = vec4(outvec, 1.0);
 	outf = dot(vec3(1.0 / 3.0), outvec);
 }
@@ -3165,9 +3171,23 @@ void node_attribute_volume_flame(sampler3D tex, out vec4 outcol, out vec3 outvec
 #else
 	vec3 cos = vec3(0.0);
 #endif
-	outvec = texture(tex, cos).rrr;
-	outcol = vec4(outvec, 1.0);
-	outf = dot(vec3(1.0 / 3.0), outvec);
+	outf = texture(tex, cos).r;
+	outvec = vec3(outf, outf, outf);
+	outcol = vec4(outf, outf, outf, 1.0);
+}
+
+void node_attribute_volume_temperature(sampler3D tex, vec2 temperature, out vec4 outcol, out vec3 outvec, out float outf)
+{
+#if defined(EEVEE_ENGINE) && defined(MESH_SHADER) && defined(VOLUMETRICS)
+	vec3 cos = volumeObjectLocalCoord;
+#else
+	vec3 cos = vec3(0.0);
+#endif
+	float flame = texture(tex, cos).r;
+
+	outf = (flame > 0.01) ? temperature.x + flame * (temperature.y - temperature.x): 0.0;
+	outvec = vec3(outf, outf, outf);
+	outcol = vec4(outf, outf, outf, 1.0);
 }
 
 void node_attribute(vec3 attr, out vec4 outcol, out vec3 outvec, out float outf)
diff --git a/source/blender/nodes/shader/nodes/node_shader_attribute.c b/source/blender/nodes/shader/nodes/node_shader_attribute.c
index 5f3699e52eb..0ea1348df05 100644
--- a/source/blender/nodes/shader/nodes/node_shader_attribute.c
+++ b/source/blender/nodes/shader/nodes/node_shader_attribute.c
@@ -59,6 +59,11 @@ static int node_shader_gpu_attribute(GPUMaterial *mat, bNode *node, bNodeExecDat
 		return GPU_stack_link(mat, node, "node_attribute_volume_flame", in, out,
 		                      GPU_builtin(GPU_VOLUME_FLAME));
 	}
+	else if (strcmp(attr->name, "temperature") == 0) {
+		return GPU_stack_link(mat, node, "node_attribute_volume_temperature", in, out,
+		                      GPU_builtin(GPU_VOLUME_FLAME),
+		                      GPU_builtin(GPU_VOLUME_TEMPERATURE));
+	}
 	else {
 		GPUNodeLink *cd_attr = GPU_attribute(CD_AUTO_FROM_NAME, attr->name);
 		return GPU_stack_link(mat, node, "node_attribute", in, out, cd_attr);



More information about the Bf-blender-cvs mailing list