zero_copy_video_player/shader.frag
2026-08-05 14:07:38 -03:00

34 lines
1.4 KiB
GLSL

#version 150
// Coordenadas de textura interpoladas provenientes del Vertex Shader
in vec2 v_texCoord;
// Color final del píxel de salida que se pintará en la pantalla
out vec4 fragColor;
// Sampler para el canal de Luminancia (Y). Contiene la información de brillo a escala completa (Grises).
uniform sampler2D u_texY;
// Sampler para el canal de Crominancia (UV) entrelazado. Contiene los datos de color a la mitad de resolución.
uniform sampler2D u_texUV;
void main() {
// 1. Muestreamos el brillo (escala de grises) del plano Y. El valor de luminancia se almacena en el canal Rojo (.r).
float y = texture(u_texY, v_texCoord).r;
// 2. Muestreamos la crominancia (color) del plano UV. Al estar entrelazado, el canal Rojo (.r) contiene el componente U
// y el canal Verde (.g) contiene el componente V.
vec2 uvVal = texture(u_texUV, v_texCoord).rg;
// 3. Restamos 0.5 a las componentes de color para centrar la crominancia en el rango [-0.5, 0.5] (su rango original en YUV).
float u = uvVal.r - 0.5;
float v = uvVal.g - 0.5;
// 4. Aplicamos la matriz de conversión matemática estándar de YUV (NV12) a RGB para reconstruir los canales de color.
float r = y + 1.402 * v;
float g = y - 0.344136 * u - 0.714136 * v;
float b = y + 1.772 * u;
// 5. Asignamos el color RGB final al fragmento de salida con opacidad completa (alfa = 1.0)
fragColor = vec4(r, g, b, 1.0);
}