forked from Kitware/VTK
-
Notifications
You must be signed in to change notification settings - Fork 0
/
vtkSurfaceLICPainter_CE.glsl
105 lines (86 loc) · 2.52 KB
/
vtkSurfaceLICPainter_CE.glsl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
//=========================================================================
//
// Program: Visualization Toolkit
// Module: vtkSurfaceLICPainter_CE.glsl
//
// Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
// All rights reserved.
// See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
//
// This software is distributed WITHOUT ANY WARRANTY; without even
// the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
// PURPOSE. See the above copyright notice for more information.
//
//=========================================================================
// color contrast enhance stage implemented via histogram stretching
// on lightness channel. if the min and max are tweaked it can generate
// out-of-range values these will be clamped in 0 to 1
#version 110
uniform sampler2D texGeomColors; // scalars + lighting
uniform sampler2D texLIC; // image lic, mask
uniform sampler2D texHSLColors; // hsla colors
uniform float uLMin; // min lightness over all fragments
uniform float uLMaxMinDiff; // max - min lightness over all fragments
/**
Helper for HSL to RGB conversion.
*/
float Util(float v1, float v2, float vH)
{
if (vH < 0.0)
vH += 1.0;
if (vH > 1.0)
vH -= 1.0;
if ((6.0 * vH) < 1.0)
return (v1 + (v2 - v1) * 6.0 * vH);
if ((2.0 * vH) < 1.0)
return (v2);
if ((3.0 * vH) < 2.0)
return (v1 + (v2 - v1) * ((2.0 / 3.0) - vH) * 6.0);
return v1;
}
/**
Convert from HSL space into RGB space.
*/
vec3 HSLToRGB(vec3 HSL)
{
vec3 RGB;
if (HSL.y == 0.0)
{
// Gray
RGB.r = HSL.z;
RGB.g = HSL.z;
RGB.b = HSL.z;
}
else
{
// Chromatic
float v2;
if (HSL.z < 0.5)
v2 = HSL.z * (1.0 + HSL.y);
else
v2 = (HSL.z + HSL.y) - (HSL.y * HSL.z);
float v1 = 2.0 * HSL.z - v2;
RGB.r = Util(v1, v2, HSL.x + (1.0 / 3.0));
RGB.g = Util(v1, v2, HSL.x);
RGB.b = Util(v1, v2, HSL.x - (1.0 / 3.0));
}
return RGB.rgb;
}
void main()
{
// lookup hsl color , mask
vec4 fragColor = texture2D(texHSLColors, gl_TexCoord[0].st);
// don't modify masked fragments (masked => lic.g==1)
vec4 lic = texture2D(texLIC, gl_TexCoord[0].st);
if (lic.g==0.0)
{
// normalize lightness channel
fragColor.z = clamp((fragColor.z - uLMin)/uLMaxMinDiff, 0.0, 1.0);
}
// back into rgb space
fragColor.rgb = HSLToRGB(fragColor.xyz);
// add alpha
vec4 geomColor = texture2D(texGeomColors, gl_TexCoord[0].st);
fragColor.a = geomColor.a;
gl_FragData[0] = fragColor;
}