blob: 9a7775766c99783cdeebe70a146c31ce3009ae1f [file] [log] [blame]
precision mediump float;
varying vec2 v_tex_coord_uyvy;
uniform sampler2D texture_uyvy;
uniform mat4 to_rgb_color_matrix;
uniform ivec2 texture_size_uyvy;
void main() {
float texture_space_x = float(texture_size_uyvy.x) * v_tex_coord_uyvy.x;
texture_space_x = clamp(
texture_space_x, 0.25, float(texture_size_uyvy.x) - 0.25);
float texel_step_u = 1.0 / float(texture_size_uyvy.x);
float sample_1_texture_space = floor(texture_space_x - 0.5) + 0.5;
float sample_1_normalized = sample_1_texture_space * texel_step_u;
float sample_2_normalized = sample_1_normalized + texel_step_u;
vec4 sample_1 =
texture2D(texture_uyvy, vec2(sample_1_normalized, v_tex_coord_uyvy.y));
vec4 sample_2 =
texture2D(texture_uyvy, vec2(sample_2_normalized, v_tex_coord_uyvy.y));
float lerp_progress = texture_space_x - sample_1_texture_space;
vec2 uv_value = mix(sample_1.rb, sample_2.rb, lerp_progress);
float y_value;
if (lerp_progress < 0.25) {
y_value = mix(sample_1.g, sample_1.a, lerp_progress * 2.0 + 0.5);
} else if (lerp_progress < 0.75) {
y_value = mix(sample_1.a, sample_2.g, lerp_progress * 2.0 - 0.5);
} else {
y_value = mix(sample_2.g, sample_2.a, lerp_progress * 2.0 - 1.5);
}
vec4 untransformed_color = vec4(y_value, uv_value.r, uv_value.g, 1.0);
gl_FragColor = untransformed_color * to_rgb_color_matrix;
}