How do I go about changing the hue or saturation of an RGB color by the mean of a GLSL shader without the RGB to HSV back to RGB cycle?
I already figured how to modify the contrast and brightness through this shader, and I need only the last two components to finish my demo.
<Shaders
linkProcessors = "true"
vertexProcessor = "VERTEX_SHADER"
fragmentProcessor = "FRAGMENT_SHADER">
<VERTEX_SHADER>
<RawData>
void main(void)
{
gl_TexCoord[0] = gl_MultiTexCoord0;
gl_Position = ftransform();
}
</RawData>
</VERTEX_SHADER>
<FRAGMENT_SHADER>
<Uniform name = "videoParams" size = "2" type = "float" x = "0.5"
y = "1.0"/>
<Uniform name = "proccessMatRow0" type = "float" size = "4"/>
<Uniform name = "proccessMatRow1" type = "float" size = "4"/>
<Uniform name = "proccessMatRow2" type = "float" size = "4"/>
<Uniform name = "first" size = "1" type = "int" x = "0" />
<Uniform name = "second" size = "1" type = "int" x = "1" />
<RawData>
uniform sampler2D second;
uniform sampler2D first;
uniform vec2 videoParams;
uniform vec4 proccessMatRow0;
uniform vec4 proccessMatRow1;
uniform vec4 proccessMatRow2;
const vec4 halfVector = vec4(0.5, 0.5, 0.5, 0.0);
vec4 applyPostProcessingMatrix(vec4 color)
{
vec4 outColor;
outColor.x = dot(proccessMatRow0, color);
outColor.y = dot(proccessMatRow1, color);
outColor.z = dot(proccessMatRow2, color);
outColor -= halfVector;
outColor *= videoParams.y;
outColor += halfVector;
return outColor;
}
void main(void)
{
vec4 firstColor = texture2D(first , gl_TexCoord[0].xy)*(1.0 - videoParams.x),
secondColor = texture2D(second, gl_TexCoord[0].xy)*videoParams.x;
gl_FragColor = applyPostProcessingMatrix(firstColor + secondColor);
}
</RawData>
</FRAGMENT_SHADER>
</Shaders>
The contrast value is loaded in the y component of videoParams and the brightness is in x;
Screenshot