From 388098a1783cfc1396010601de6fc34c67e66d78 Mon Sep 17 00:00:00 2001 From: Sam Hocevar Date: Sun, 15 Dec 2013 17:21:49 +0000 Subject: [PATCH] hsv2rgb 6th --- demos/tutorial/04_texture.lolfx | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/demos/tutorial/04_texture.lolfx b/demos/tutorial/04_texture.lolfx index 6ee4804d..3b0171f8 100644 --- a/demos/tutorial/04_texture.lolfx +++ b/demos/tutorial/04_texture.lolfx @@ -31,6 +31,30 @@ float segdist(vec2 p1, vec2 p2, vec2 a) return distance(a, mix(p1, p2, t)); } +vec3 hsv2rgb(vec3 c) +{ + vec3 tmp = abs(fract(c[0] + vec3(3.0, 2.0, 1.0) / 3.0) * 6.0 - 3.0); + return c[2] * mix(vec3(1.0), clamp((tmp - 1.0), 0.0, 1.0), c[1]); +} + +vec3 rgb2hsv(vec3 c) +{ + vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); + vec4 v1 = mix(vec4(c.bg, K.wz), + vec4(c.gb, K.xy), + step(c.b, c.g)); + + vec4 v3 = mix(vec4(v1.x, v1.yw, c.r), + vec4(c.r, v1.yzx), + step(v1.x, c.r)); + + float chroma = v3.r - min(v3.a, v3.g); +float h = abs(v3.b + (v3.a - v3.g) / (6.0 * chroma + 1.0e-10)); +float s = chroma / (v3.r + 1.0e-10); +float v = v3.r; + return vec3(h, s, v); +} + void main(void) { float width = 800.0; @@ -75,7 +99,12 @@ void main(void) lum = pow(1.0 - lum, 1.0 / 2.4); /* Choose some funny colours */ - gl_FragColor = vec4(mix(p.x, 1.0, lum), lum, lum, 1.0); + vec4 col = vec4(mix(p.x, 1.0, lum), lum, lum, 1.0); + col.rgb = hsv2rgb(rgb2hsv(col.rgb) * vec3(1.0, 1.0, 0.5) + vec3(p.x, 0.5, 0.0)); + col.rgb = hsv2rgb(rgb2hsv(col.rgb)); + col.rgb = hsv2rgb(rgb2hsv(col.rgb)); + col.rgb = hsv2rgb(rgb2hsv(col.rgb)); + gl_FragColor = col; } [vert.hlsl]