diff options
author | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2018-02-22 20:51:20 +0300 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2018-02-23 21:10:02 +0300 |
commit | af061b4dac140c5acea21f69257bfc5c18b3fe1c (patch) | |
tree | b37010940b6f984f866367621912296111c7424b /source/blender | |
parent | a44b08a6c473c0aae9f98dc13f9d000e5ea639bc (diff) |
Eeevee: add temperature grid support, make color grid unpremultiplied.
This matches similar changes done for Cycles.
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/blenloader/intern/readfile.c | 1 | ||||
-rw-r--r-- | source/blender/draw/engines/eevee/eevee_volumes.c | 3 | ||||
-rw-r--r-- | source/blender/gpu/GPU_material.h | 3 | ||||
-rw-r--r-- | source/blender/gpu/intern/gpu_codegen.c | 2 | ||||
-rw-r--r-- | source/blender/gpu/shaders/gpu_shader_material.glsl | 28 | ||||
-rw-r--r-- | source/blender/nodes/shader/nodes/node_shader_attribute.c | 5 |
6 files changed, 37 insertions, 5 deletions
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); |