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

HSV and Exposure Composites

2D Controlled Shine Highlight With Angle Adjustment

Depth adjustment for Clipping protection

Subscribe
Notify of
guest

4 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
vesu
vesu
2 years 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
2 years ago
Reply to  vesu

Use shader params in the material

SquiggelSquirrel
2 years 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
1 year ago

Thank you very much!