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;
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

Notify of

Newest Most Voted
Inline Feedbacks
View all comments
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

2 years ago
Reply to  vesu

Use shader params in the material

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
10 months ago

Thank you very much!