[Bf-blender-cvs] [65fa5a19261] blender2.8: Eevee: Optimize Color Ramp node for common cases.

Clément Foucault noreply at git.blender.org
Sat Nov 17 18:43:28 CET 2018


Commit: 65fa5a19261d90a7fe29ebbcaa80dab56ca373df
Author: Clément Foucault
Date:   Sat Nov 17 18:20:10 2018 +0100
Branches: blender2.8
https://developer.blender.org/rB65fa5a19261d90a7fe29ebbcaa80dab56ca373df

Eevee: Optimize Color Ramp node for common cases.

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

M	source/blender/gpu/shaders/gpu_shader_material.glsl
M	source/blender/nodes/shader/nodes/node_shader_valToRgb.c

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

diff --git a/source/blender/gpu/shaders/gpu_shader_material.glsl b/source/blender/gpu/shaders/gpu_shader_material.glsl
index 0d54f7fa69d..6c7c8f24f51 100644
--- a/source/blender/gpu/shaders/gpu_shader_material.glsl
+++ b/source/blender/gpu/shaders/gpu_shader_material.glsl
@@ -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));
diff --git a/source/blender/nodes/shader/nodes/node_shader_valToRgb.c b/source/blender/nodes/shader/nodes/node_shader_valToRgb.c
index 4f4462f20bb..1a1d5658d97 100644
--- a/source/blender/nodes/shader/nodes/node_shader_valToRgb.c
+++ b/source/blender/nodes/shader/nodes/node_shader_valToRgb.c
@@ -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);



More information about the Bf-blender-cvs mailing list