diff --git a/src/shaders/fragment.glsl b/src/shaders/fragment.glsl index 2b87f44..e5ac8a7 100644 --- a/src/shaders/fragment.glsl +++ b/src/shaders/fragment.glsl @@ -1,4 +1,28 @@ #version 330 core + +float pi = 3.14159; +vec3 hsvToRgb(vec3 hsl) { + while (hsl.x > 1) { + hsl.x -= 1; + } + int hi = int(floor(hsl.x * 6)); + float f = hsl.x * 6 - hi; + + float p = hsl.z * (1 - hsl.y); + float q = hsl.z * (1 - hsl.y * f); + float t = hsl.z * (1 - hsl.y * (1 - f)); + + switch (hi) { + case 0: return vec3(hsl.z, t, p); + case 1: return vec3(q, hsl.z, p); + case 2: return vec3(p, hsl.z, t); + case 3: return vec3(p, q, hsl.z); + case 4: return vec3(t, p, hsl.z); + case 5: return vec3(hsl.z, p, q); + default: return vec3(0); + } +} + in float fragValue; flat in int pattern; void main() { @@ -6,15 +30,15 @@ void main() { vec4 fragColor2 = vec4(0.0, 1.0, 0.0, 1.0); switch (pattern) { case 0: - gl_FragColor = mix(fragColor1, fragColor2, fragValue); + gl_FragColor = vec4(hsvToRgb(vec3(fragValue, 1, 1)), 1); break; case 1: - gl_FragColor = mix(fragColor1, fragColor2, step(0.5, fragValue)); + gl_FragColor = vec4(hsvToRgb(vec3(0, fragValue, 1)), 1); break; case 2: - gl_FragColor = mix(fragColor1, fragColor2, smoothstep(0.4, 0.6, fragValue)); + gl_FragColor = vec4(hsvToRgb(vec3(0, 1, fragValue)), 1); break; case 3: