Fix T83494: Eevee clamp node incorrect when min > max.
In glsl the clamp function has undefined behavior when min > max. For the clamp node this resulted in differences between cycles and eevee. This patch adds the expected implementation for minmax. The old clamp function is still used in cases where we know for certain that the input values are correct (math node clamp option). GPU uses optimized code and silicon in these cases.
This commit is contained in:
parent
ffb6648a97
commit
fe5d2448c6
Notes:
blender-bot
2023-02-13 20:17:04 +01:00
Referenced by issue #83494, GLSL 'clamp' issue?
|
@ -3,6 +3,11 @@ void clamp_value(float value, float min, float max, out float result)
|
|||
result = clamp(value, min, max);
|
||||
}
|
||||
|
||||
void clamp_minmax(float value, float min_allowed, float max_allowed, out float result)
|
||||
{
|
||||
result = min(max(value, min_allowed), max_allowed);
|
||||
}
|
||||
|
||||
void clamp_range(float value, float min, float max, out float result)
|
||||
{
|
||||
result = (max > min) ? clamp(value, min, max) : clamp(value, max, min);
|
||||
|
|
|
@ -46,8 +46,9 @@ static int gpu_shader_clamp(GPUMaterial *mat,
|
|||
GPUNodeStack *in,
|
||||
GPUNodeStack *out)
|
||||
{
|
||||
return (node->custom1 == NODE_CLAMP_MINMAX) ? GPU_stack_link(mat, node, "clamp_value", in, out) :
|
||||
GPU_stack_link(mat, node, "clamp_range", in, out);
|
||||
return (node->custom1 == NODE_CLAMP_MINMAX) ?
|
||||
GPU_stack_link(mat, node, "clamp_minmax", in, out) :
|
||||
GPU_stack_link(mat, node, "clamp_range", in, out);
|
||||
}
|
||||
|
||||
static void sh_node_clamp_expand_in_mf_network(blender::nodes::NodeMFNetworkBuilder &builder)
|
||||
|
|
Loading…
Reference in New Issue