#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); }