Eeevee: add temperature grid support, make color grid unpremultiplied.
This matches similar changes done for Cycles.
This commit is contained in:
parent
a44b08a6c4
commit
af061b4dac
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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 "";
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue