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;

}

``