Yeah the vertex shader would need to be modified to apply a scale that is independent of distance.
Try this out. Tweak the value 50.0 to your liking.
precision highp float;
attribute vec3 a_position;
attribute vec3 a_normal;
varying vec3 v_normal;
uniform mat3 u_normalMatrix;
uniform mat4 u_modelViewMatrix;
uniform mat4 u_projectionMatrix;
attribute vec2 a_texcoord0;
varying vec2 v_texcoord0;
void main(void) {
// Billboard code. Remove all rotation and scaling from the modelView matrix
mat4 modelViewMatrix = mat4(1.0, 0.0, 0.0, 0.0, 0.0, 0.0, -1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0);
modelViewMatrix[3] = u_modelViewMatrix[3];
float distance = -modelViewMatrix[3][2]; // Get z value in eye-space
float scale = distance / 50.0;
vec4 pos = modelViewMatrix * vec4(scale * a_position, 1.0);
v_normal = u_normalMatrix * a_normal;
v_texcoord0 = a_texcoord0;
gl_Position = u_projectionMatrix * pos;
}
``