HSV Adjustment

Just a simple hsv ajustment shader

Shader code
shader_type canvas_item;

uniform float h: hint_range(0,1) = 1;
uniform float s: hint_range(0,1) = 1;
uniform float v: hint_range(0,1) = 1;

vec3 rgb2hsv(vec3 c) {
    vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);
    vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g));
    vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));

    float d = q.x - min(q.w, q.y);
    float e = 1.0e-10;
    return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);
}

vec3 hsv2rgb(vec3 c) {
    vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);
    vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);
    return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);
}

void fragment() {
	vec4 col = texture(TEXTURE, UV);
	
	col.rgb = hsv2rgb(rgb2hsv(col.rgb) * vec3(h, s, v));
	
	COLOR = col;
}
Tags
2d, adjustment, Color, hsv
The shader code and all code snippets in this post are under CC0 license and can be used freely without the author's permission. Images and videos, and assets depicted in those, do not fall under this license. For more info, see our License terms.

Related shaders

2D Controlled Shine Highlight With Angle Adjustment

Subscribe
Notify of
guest

4 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
vesu
vesu
1 year ago

can you kinda explain how to use this shader? i created a shader in colorrect and pasted the code in there but nothing happens

Talum
Talum
1 year ago
Reply to  vesu

Use shader params in the material

SquiggelSquirrel
SquiggelSquirrel
1 year ago

Nice! However, I would suggest changing the ranges for your uniforms.
For hue, a range of -2PI to 1 seems to work.
Saturation works from 0 to 2.
Value also works from 0 to 2.

i appreciate it
i appreciate it
4 months ago

Thank you very much!