Eevee: Optimize Color Ramp node for common cases.

This commit is contained in:
Clément Foucault 2018-11-17 18:20:10 +01:00
parent 68b670698f
commit 65fa5a1926
2 changed files with 33 additions and 0 deletions

View File

@ -802,6 +802,19 @@ void mix_linear(float fac, vec4 col1, vec4 col2, out vec4 outcol)
outcol = col1 + fac * (2.0 * (col2 - vec4(0.5)));
}
void valtorgb_opti_constant(float fac, float edge, vec4 color1, vec4 color2, out vec4 outcol, out float outalpha)
{
outcol = (fac > edge) ? color2 : color1;
outalpha = outcol.a;
}
void valtorgb_opti_linear(float fac, vec2 mulbias, vec4 color1, vec4 color2, out vec4 outcol, out float outalpha)
{
fac = clamp(fac * mulbias.x + mulbias.y, 0.0, 1.0);
outcol = mix(color1, color2, fac);
outalpha = outcol.a;
}
void valtorgb(float fac, sampler1DArray colormap, float layer, out vec4 outcol, out float outalpha)
{
outcol = texture(colormap, vec2(fac, layer));

View File

@ -69,6 +69,26 @@ static int gpu_shader_valtorgb(GPUMaterial *mat, bNode *node, bNodeExecData *UNU
float *array, layer;
int size;
/* Common / easy case optimisation. */
if ((coba->tot <= 2) && (coba->color_mode == COLBAND_BLEND_RGB)) {
float mul_bias[2];
switch (coba->ipotype) {
case COLBAND_INTERP_LINEAR:
mul_bias[0] = 1.0f / (coba->data[1].pos - coba->data[0].pos);
mul_bias[1] = -mul_bias[0] * coba->data[0].pos;
return GPU_stack_link(mat, node, "valtorgb_opti_linear", in, out, GPU_uniform(mul_bias),
GPU_uniform(&coba->data[0].r),
GPU_uniform(&coba->data[1].r));
case COLBAND_INTERP_CONSTANT:
mul_bias[1] = max_ff(coba->data[0].pos, coba->data[1].pos);
return GPU_stack_link(mat, node, "valtorgb_opti_constant", in, out, GPU_uniform(&mul_bias[1]),
GPU_uniform(&coba->data[0].r),
GPU_uniform(&coba->data[1].r));
default:
break;
}
}
BKE_colorband_evaluate_table_rgba(coba, &array, &size);
GPUNodeLink *tex = GPU_color_band(mat, size, array, &layer);