precision highp float;
-varying highp vec2 vFragCoord;
varying highp vec2 vTexCoord;
+varying highp vec2 vOptRectSize;
varying highp vec4 vCornerRadius;
+
uniform highp vec3 uSize;
uniform sampler2D sTexture;
vec3 applyDithering( vec3 inColor )
{
float rnd = nrand(vTexCoord) - 0.5;
- inColor.rgb += rnd / 255.0;
+ inColor.rgb += rnd * 0.0039215686;
return inColor;
}
void main()
{
gl_FragColor = texture2D(sTexture, vTexCoord);
-
- highp vec2 location = vTexCoord.xy - vec2(0.5);
- float radius =
- mix(
- mix(vCornerRadius.x, vCornerRadius.y, sign(location.x)*0.5 + 0.5),
- mix(vCornerRadius.w, vCornerRadius.z, sign(location.x)*0.5 + 0.5),
- sign(location.y) * 0.5 + 0.5
- );
-
- float edgeSoftness = min(1.0, radius);
- float distance = roundedBoxSDF(vFragCoord.xy - (uSize.xy/2.0), uSize.xy/2.0, radius);
-
- float smoothedAlpha = 1.0 - smoothstep(-edgeSoftness, edgeSoftness, distance);
- gl_FragColor.a *= smoothedAlpha;
-
gl_FragColor.rgb = applyDithering(gl_FragColor.rgb);
+
+ highp vec2 location = (vTexCoord.xy - vec2(0.5)) * uSize.xy;
+ // skip most potential calculate for performance
+ if(abs(location.x) < vOptRectSize.x && abs(location.y) < vOptRectSize.y)
+ {
+ // Do nothing.
+ }
+ else
+ {
+ float radius =
+ mix(
+ mix(vCornerRadius.x, vCornerRadius.y, sign(location.x) * 0.5 + 0.5),
+ mix(vCornerRadius.w, vCornerRadius.z, sign(location.x) * 0.5 + 0.5),
+ sign(location.y) * 0.5 + 0.5
+ );
+
+ float edgeSoftness = min(1.0, radius);
+ float distance = roundedBoxSDF(location, uSize.xy * 0.5, radius);
+
+ float smoothedAlpha = 1.0 - smoothstep(-edgeSoftness, edgeSoftness, distance);
+ gl_FragColor.a *= smoothedAlpha;
+ }
}
precision highp float;
+
attribute highp vec2 aPosition;
-varying highp vec2 vFragCoord;
+
varying highp vec2 vTexCoord;
+varying highp vec2 vOptRectSize;
varying highp vec4 vCornerRadius; //output
+
uniform highp mat4 uMvpMatrix;
-uniform highp vec3 uSize;
uniform highp vec4 uCornerRadius; //input
-uniform highp float uCornerRadiusPolicy;
+uniform lowp float uCornerRadiusPolicy;
+uniform highp vec3 uSize;
void main()
{
highp vec4 vertexPosition = vec4(aPosition * uSize.xy, 0.0, 1.0);
- vFragCoord = vertexPosition.xy + uSize.xy/2.0;
vTexCoord = aPosition + vec2(0.5);
gl_Position = uMvpMatrix * vertexPosition;
highp float minSize = min(uSize.x, uSize.y);
vCornerRadius = mix(uCornerRadius * minSize, uCornerRadius, uCornerRadiusPolicy);
vCornerRadius = min(vCornerRadius, minSize * 0.5);
+
+ vOptRectSize = uSize.xy * 0.5;
+
+ // Optimize fragment shader. 0.2929 ~= 1.0 - sqrt(0.5)
+ highp float maxRadius = max(max(vCornerRadius.x, vCornerRadius.y), max(vCornerRadius.z, vCornerRadius.w));
+ vOptRectSize -= 0.2929 * maxRadius + min(1.0, maxRadius);
}