diff options
author | Campbell Barton <ideasman42@gmail.com> | 2020-01-28 08:15:38 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2020-01-28 08:15:38 +0300 |
commit | 051d2240655290140343c0e88e886eea0ba70e24 (patch) | |
tree | 3544a8e8f203df0ebfa1d8d5d852420eb8e61ff5 /source/blender/gpu/shaders/material | |
parent | ddda73b98a9c0a45e4fec667ba4021cec456d030 (diff) | |
parent | eb6cb67ab68679ac80a0f8886879c42cf6953d98 (diff) |
Merge branch 'blender-v2.82-release'
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); } |