[Bf-blender-cvs] [f9688d8] master: Fix T42391: HSV correction shader node gives negative values

Sergey Sharybin noreply at git.blender.org
Fri Oct 31 14:57:43 CET 2014


Commit: f9688d88ff528e94e0ac059c6fc41a163fb0f6be
Author: Sergey Sharybin
Date:   Fri Oct 31 14:42:48 2014 +0100
Branches: master
https://developer.blender.org/rBf9688d88ff528e94e0ac059c6fc41a163fb0f6be

Fix T42391: HSV correction shader node gives negative values

This mainly happens when over-saturating already saturated color.
After some discussion with Campbell and loads of tests we decided
to clamp the result RGB color. As an alternative we might want to
clamp corrected HSV values instead, but that would lead to some
larger changes in the render results.

TODO: The same is to be done for compositor nodes.

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

M	intern/cycles/kernel/shaders/node_hsv.osl
M	intern/cycles/kernel/svm/svm_hsv.h

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

diff --git a/intern/cycles/kernel/shaders/node_hsv.osl b/intern/cycles/kernel/shaders/node_hsv.osl
index 4722bde..5f4300e 100644
--- a/intern/cycles/kernel/shaders/node_hsv.osl
+++ b/intern/cycles/kernel/shaders/node_hsv.osl
@@ -35,6 +35,11 @@ shader node_hsv(
 
 	Color = hsv_to_rgb(Color);
 
+	// Clamp color to prevent negative values cauzed by oversaturation.
+	Color[0] = max(Color[0], 0.0);
+	Color[1] = max(Color[1], 0.0);
+	Color[2] = max(Color[2], 0.0);
+
 	ColorOut = mix(ColorIn, Color, Fac);
 }
 
diff --git a/intern/cycles/kernel/svm/svm_hsv.h b/intern/cycles/kernel/svm/svm_hsv.h
index 11dfc4f..a02d853 100644
--- a/intern/cycles/kernel/svm/svm_hsv.h
+++ b/intern/cycles/kernel/svm/svm_hsv.h
@@ -46,6 +46,11 @@ ccl_device void svm_node_hsv(KernelGlobals *kg, ShaderData *sd, float *stack, ui
 	color.y = fac*color.y + (1.0f - fac)*in_color.y;
 	color.z = fac*color.z + (1.0f - fac)*in_color.z;
 
+	/* Clamp color to prevent negative values cauzed by oversaturation. */
+	color.x = max(color.x, 0.0f);
+	color.y = max(color.y, 0.0f);
+	color.z = max(color.z, 0.0f);
+
 	if (stack_valid(out_color_offset))
 		stack_store_float3(stack, out_color_offset, color);
 }




More information about the Bf-blender-cvs mailing list