diff --git a/circle.fragment.glsl b/circle.fragment.glsl index 4874a02..1d99361 100644 --- a/circle.fragment.glsl +++ b/circle.fragment.glsl @@ -4,8 +4,9 @@ uniform lowp float u_blur; varying lowp vec4 v_color; varying vec2 v_extrude; +varying lowp float v_antialiasblur; void main() { - float t = smoothstep(1.0 - u_blur, 1.0, length(v_extrude)); + float t = smoothstep(1.0 - max(u_blur, v_antialiasblur), 1.0, length(v_extrude)); gl_FragColor = v_color * (1.0 - t); } diff --git a/circle.vertex.glsl b/circle.vertex.glsl index 906cd8c..a0457fc 100644 --- a/circle.vertex.glsl +++ b/circle.vertex.glsl @@ -2,7 +2,7 @@ precision highp float; uniform mat4 u_matrix; uniform mat4 u_exmatrix; -uniform mediump float u_size; +uniform float u_devicepixelratio; attribute vec2 a_pos; @@ -12,14 +12,21 @@ attribute lowp vec4 a_color; uniform lowp vec4 a_color; #endif +#ifdef ATTRIBUTE_RADIUS +attribute mediump float a_radius; +#else +uniform mediump float a_radius; +#endif + varying vec2 v_extrude; varying lowp vec4 v_color; +varying lowp float v_antialiasblur; void main(void) { // unencode the extrusion vector that we snuck into the a_pos vector v_extrude = vec2(mod(a_pos, 2.0) * 2.0 - 1.0); - vec4 extrude = u_exmatrix * vec4(v_extrude * u_size, 0, 0); + vec4 extrude = u_exmatrix * vec4(v_extrude * a_radius / 10.0, 0, 0); // multiply a_pos by 0.5, since we had it * 2 in order to sneak // in extrusion data gl_Position = u_matrix * vec4(floor(a_pos * 0.5), 0, 1); @@ -29,4 +36,9 @@ void main(void) { gl_Position += extrude * gl_Position.w; v_color = a_color / 255.0; + + // This is a minimum blur distance that serves as a faux-antialiasing for + // the circle. since blur is a ratio of the circle's size and the intent is + // to keep the blur at roughly 1px, the two are inversely related. + v_antialiasblur = 1.0 / u_devicepixelratio / (a_radius / 10.0); }