34 lines
1.4 KiB
GLSL
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);
|
|
}
|