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

guest

3 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
vesu
vesu
9 months 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
9 months ago
Reply to  vesu

Use shader params in the material

SquiggelSquirrel
SquiggelSquirrel
1 month 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.