¿Hay alguna forma de cambiar de manera eficiente el tono de una textura 2D OpenGL usando GLSL (fragment shader)?¿Cómo cambiar el tono de una textura con GLSL?
¿Alguien tiene un código para ello?
ACTUALIZACIÓN: Este es el código resultante de user1118321 sugerencia:
uniform sampler2DRect texture;
const mat3 rgb2yiq = mat3(0.299, 0.587, 0.114, 0.595716, -0.274453, -0.321263, 0.211456, -0.522591, 0.311135);
const mat3 yiq2rgb = mat3(1.0, 0.9563, 0.6210, 1.0, -0.2721, -0.6474, 1.0, -1.1070, 1.7046);
uniform float hue;
void main() {
vec3 yColor = rgb2yiq * texture2DRect(texture, gl_TexCoord[0].st).rgb;
float originalHue = atan(yColor.b, yColor.g);
float finalHue = originalHue + hue;
float chroma = sqrt(yColor.b*yColor.b+yColor.g*yColor.g);
vec3 yFinalColor = vec3(yColor.r, chroma * cos(finalHue), chroma * sin(finalHue));
gl_FragColor = vec4(yiq2rgb*yFinalColor, 1.0);
}
Y este es el resultado se compara con una referencia:
he tratado de cambiar I con Q dentro de atan pero el resultado es incorrecto incluso alrededor de 0 °
¿Tiene usted alguna pista?
Si es necesario para la comparación, esta es la imagen original sin modificar:
Es un giro de la triple RGB alrededor de la (1,1,1) del vector - usted puede expresar que, como la multiplicación de matrices en el shader – Flexo
Si su cambio de tono es constante, entonces se puede omitir el atan, sqrt, sin y cos. Lo que estás haciendo es convertirlos en coordenadas polares, agregarlos al ángulo y convertirlos nuevamente. Puedes hacer esto con una matriz de rotación de 2x2. Si no necesita hacer ninguna otra operación matemática en el espacio yiq, puede precalcular toda la transformación.Multiplique su rgb2yiq con la rotación 2d (acolchada a un 3x3) y luego con el yiq2rgb para obtener una matriz grande de 3x3 que haga todo el proceso. Lo cual, como dice @Flexo, es solo una rotación alrededor del vector (1,1,1). –