diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2020-01-27 21:48:31 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2020-01-27 21:52:20 +0300 |
commit | 507a331f0182dd5458e823f705de644613a890b2 (patch) | |
tree | 3f901c24804e7df51e759271d8eb62f6f2d1e28e /source/blender/gpu/shaders/material | |
parent | 0366c46ec64e42135953aad1de41c6976947e7a4 (diff) |
Fix T67552 EEVEE: Vector Curves node clamps maximum input value at 1.0
Diffstat (limited to 'source/blender/gpu/shaders/material')
-rw-r--r-- | source/blender/gpu/shaders/material/gpu_shader_material_vector_curves.glsl | 37 |
1 files changed, 35 insertions, 2 deletions
diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_vector_curves.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_vector_curves.glsl index 35d2e903cf4..63e97e66c90 100644 --- a/source/blender/gpu/shaders/material/gpu_shader_material_vector_curves.glsl +++ b/source/blender/gpu/shaders/material/gpu_shader_material_vector_curves.glsl @@ -1,8 +1,41 @@ -void curves_vec(float fac, vec3 vec, sampler1DArray curvemap, float layer, out vec3 outvec) +/* ext is vec4(in_x, in_dy, out_x, out_dy). */ +float curve_extrapolate(float x, float y, vec4 ext) { - vec4 co = vec4(vec * 0.5 + 0.5, layer); + if (x < 0.0) { + return y + x * ext.y; + } + else if (x > 1.0) { + return y + (x - 1.0) * ext.w; + } + else { + return y; + } +} + +#define RANGE_RESCALE(x, min, range) ((x - min) * range) + +void curves_vec(float fac, + vec3 vec, + sampler1DArray curvemap, + float layer, + vec3 range, + vec4 ext_x, + vec4 ext_y, + vec4 ext_z, + out vec3 outvec) +{ + vec4 co = vec4(vec, layer); + + vec3 xyz_min = vec3(ext_x.x, ext_y.x, ext_z.x); + co.xyz = RANGE_RESCALE(co.xyz, xyz_min, range); + outvec.x = texture(curvemap, co.xw).x; outvec.y = texture(curvemap, co.yw).y; outvec.z = texture(curvemap, co.zw).z; + + outvec.x = curve_extrapolate(co.x, outvec.r, ext_x); + outvec.y = curve_extrapolate(co.y, outvec.g, ext_y); + outvec.z = curve_extrapolate(co.z, outvec.b, ext_z); + outvec = mix(vec, outvec, fac); } |