opengl - descargar - tela para pantalla verde
¿Alguien puede explicar este Fragmento Shader? Es un filtro de clave de croma(efecto de pantalla verde) (1)
Estoy tratando de entender cómo funciona este filtro de clave de croma. Chroma Key, si no lo sabe, es un efecto de pantalla verde. ¿Alguien podría explicar cómo funcionan algunas de estas funciones y qué están haciendo exactamente?
float maskY = 0.2989 * colorToReplace.r + 0.5866 * colorToReplace.g + 0.1145 * colorToReplace.b;
float maskCr = 0.7132 * (colorToReplace.r - maskY);
float maskCb = 0.5647 * (colorToReplace.b - maskY);
float Y = 0.2989 * textureColor.r + 0.5866 * textureColor.g + 0.1145 * textureColor.b;
float Cr = 0.7132 * (textureColor.r - Y);
float Cb = 0.5647 * (textureColor.b - Y);
float blendValue = smoothstep(thresholdSensitivity, thresholdSensitivity + smoothing, distance(vec2(Cr, Cb), vec2(maskCr, maskCb)));
gl_FragColor = vec4(textureColor.rgb * blendValue, 1.0 * blendValue);
Entiendo las primeras 6 líneas (convirtiendo el color para reemplazar, que probablemente sea verde, y el color de la textura para el sistema de color YCrCb).
Este sombreador de fragmentos tiene dos valores flotantes de entrada: thresholdSensitivity y Smoothing.
- La sensibilidad de umbral controla la forma en que los píxeles similares deben ser coloreados para ser reemplazados.
- El suavizado controla la forma en que gradualmente se reemplazan colores similares en la imagen.
No entiendo cómo se usan esos valores en la línea blendValue. ¿Qué calcula blendValue? ¿Cómo la línea blendValue y la línea gl_FragColor realmente crean el efecto de pantalla verde?
La función smoothstep
en GLSL evalúa una curva cúbica uniforme en un intervalo (especificado por los dos primeros parámetros). En comparación con la función de mix
de GLSL, que combina linealmente sus parámetros como:
smoothstep
utiliza un polinomio cúbico de Hermite para determinar el valor
En su sombreador, blendValue es una interpolación uniforme de su valor de suavizado en función de la distancia entre los valores de crominancia rojos y azules.
Finalmente, gl_FragColor
especifica el color del fragmento final (antes de la fusión, que ocurre después de la finalización del sombreador de fragmentos). En su caso, es el valor modulado leído de la imagen de entrada, y un valor alfa modulado para la translucidez.