precision mediump float;
varying vec2 interp_tc;
varying vec2 real_coord;
uniform sampler2D y_tex;
uniform sampler2D u_tex;
uniform sampler2D v_tex;
uniform float exposureValue;
vec2 singleStepOffset = vec2(0.00156, 0.00277);
mediump float params = 1.0;
const highp vec3 W = vec3(0.299,0.587,0.114);
vec2 blurCoordinates[20];
float hardLight(float color) {
if(color <= 0.5)
color = color * color * 2.0;
else
color = 1.0 - ((1.0 - color)*(1.0 - color) * 2.0);
return color;
}
float greenValue(vec2 coord) {
return texture2D(y_tex, coord).r - 0.344 * (texture2D(y_tex, coord).r - 0.5) - 0.714 * (texture2D(y_tex, coord).r - 0.5);
}
void main() {
float r2 = (real_coord.x - 0.5) * (real_coord.x - 0.5) + (real_coord.y - 0.5)*(real_coord.y - 0.5);
if (r2 > 0.25)
gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0);
else {
float y = texture2D(y_tex, interp_tc).r;
float u = texture2D(u_tex, interp_tc).r - 0.5;
float v = texture2D(v_tex, interp_tc).r - 0.5;
centralColor = vec3(y + 1.403 * v,
y - 0.344 * u - 0.714 * v,
y + 1.77 * u);
float r = centralColor.r;
float g = centralColor.g;
float b = centralColor.b;
float Y = 0.0 + 0.299 * r + 0.587 * g + 0.114 * b;
float Cb = 0.5 - 0.169 * r - 0.331 * g + 0.5 * b;
float Cr = 0.5 + 0.5 * r - 0.419 * g - 0.081 * b;
if ((Cb > 0.3008 && Cb < 0.5273 && Cr > 0.5078 && Cr < 0.6836) || Y > 0.7 ) {
blurCoordinates[0] = interp_tc.xy + singleStepOffset * vec2(0.0, -10.0);
blurCoordinates[1] = interp_tc.xy + singleStepOffset * vec2(0.0, 10.0);
blurCoordinates[2] = interp_tc.xy + singleStepOffset * vec2(-10.0, 0.0);
blurCoordinates[3] = interp_tc.xy + singleStepOffset * vec2(10.0, 0.0);
blurCoordinates[4] = interp_tc.xy + singleStepOffset * vec2(5.0, -8.0);
blurCoordinates[5] = interp_tc.xy + singleStepOffset * vec2(5.0, 8.0);
blurCoordinates[6] = interp_tc.xy + singleStepOffset * vec2(-5.0, 8.0);
blurCoordinates[7] = interp_tc.xy + singleStepOffset * vec2(-5.0, -8.0);
blurCoordinates[8] = interp_tc.xy + singleStepOffset * vec2(8.0, -5.0);
blurCoordinates[9] = interp_tc.xy + singleStepOffset * vec2(8.0, 5.0);
blurCoordinates[10] = interp_tc.xy + singleStepOffset * vec2(-8.0, 5.0);
blurCoordinates[11] = interp_tc.xy + singleStepOffset * vec2(-8.0, -5.0);
blurCoordinates[12] = interp_tc.xy + singleStepOffset * vec2(0.0, -6.0);
blurCoordinates[13] = interp_tc.xy + singleStepOffset * vec2(0.0, 6.0);
blurCoordinates[14] = interp_tc.xy + singleStepOffset * vec2(6.0, 0.0);
blurCoordinates[15] = interp_tc.xy + singleStepOffset * vec2(-6.0, 0.0);
blurCoordinates[16] = interp_tc.xy + singleStepOffset * vec2(-4.0, -4.0);
blurCoordinates[17] = interp_tc.xy + singleStepOffset * vec2(-4.0, 4.0);
blurCoordinates[18] = interp_tc.xy + singleStepOffset * vec2(4.0, -4.0);
blurCoordinates[19] = interp_tc.xy + singleStepOffset * vec2(4.0, 4.0);;
float sampleColor = centralColor.g * 20.0;
sampleColor += greenValue(blurCoordinates[0]);
sampleColor += greenValue(blurCoordinates[1]);
sampleColor += greenValue(blurCoordinates[2]);
sampleColor += greenValue(blurCoordinates[3]);
sampleColor += greenValue(blurCoordinates[4]);
sampleColor += greenValue(blurCoordinates[5]);
sampleColor += greenValue(blurCoordinates[6]);
sampleColor += greenValue(blurCoordinates[7]);
sampleColor += greenValue(blurCoordinates[8]);
sampleColor += greenValue(blurCoordinates[9]);
sampleColor += greenValue(blurCoordinates[10]);
sampleColor += greenValue(blurCoordinates[11]);
sampleColor += greenValue(blurCoordinates[12]) * 2.0;
sampleColor += greenValue(blurCoordinates[13]) * 2.0;
sampleColor += greenValue(blurCoordinates[14]) * 2.0;
sampleColor += greenValue(blurCoordinates[15]) * 2.0;
sampleColor += greenValue(blurCoordinates[16]) * 2.0;
sampleColor += greenValue(blurCoordinates[17]) * 2.0;
sampleColor += greenValue(blurCoordinates[18]) * 2.0;
sampleColor += greenValue(blurCoordinates[19]) * 2.0;
sampleColor += sampleColor / 48.0;
float highPass = centralColor.g - sampleColor + 0.5;
for(int i = 0; i < 5; i++)
{
highPass = hardLight(highPass);
}
float luminance = dot(centralColor, W);
float alpha = pow(luminance, params);
vec3 smoothColor = centralColor + (centralColor-vec3(highPass))*alpha*0.1;
processedColor = vec3(exposureValue * mix(smoothColor.rgb, max(smoothColor, centralColor), alpha));
} else {
processedColor = exposureValue * centralColor;
}
gl_FragColor = vec4(processedColor.r, processedColor.g, processedColor.b, 1.);;
}
};