C'è un modo per cambiare in modo efficiente la tonalità di una trama OpenGL 2D usando GLSL (framment shader)?Come cambiare la tonalità di una trama con GLSL?
Qualcuno ha un codice per questo?
UPDATE: Questo è il codice risultante da user1118321 suggerimento:
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);
}
E questo è il risultato confrontato con un riferimento:
ho cercato di commutare I con Q dentro atan ma il risultato è sbagliato anche intorno a 0 °
Avete qualche suggerimento?
se necessario per il confronto, questa è l'immagine originale non modificato:
Si tratta di una rotazione del RGB tripla attorno alla (1,1,1) vettore - è possibile esprimere che come moltiplicazione di matrici nello shader – Flexo
Se il cambiamento di tonalità è costante allora si può saltare la atan, sqrt, sin, e cos. Quello che stai facendo è convertirli in coordinate polari, aggiungere all'angolo e riconvertire. Puoi fare questo calcolo con una matrice di rotazione 2x2. Se non è necessario eseguire altri calcoli matematici nello spazio yiq, è possibile precalcolare l'intera trasformazione.Moltiplica il tuo rgb2yiq con la rotazione 2d (estesa a 3x3) e poi con yiq2rgb per ottenere una grande matrice 3x3 che fa l'intero processo. Che, come dice @Flexo, è solo una rotazione attorno al vettore (1,1,1). –