I have a very simple PNG texture: a gray circle with a transparent background.

I use it as a single map for THREE.ShaderMaterial :
var uniforms = THREE.UniformsUtils.merge( [basicShader.uniforms] ); uniforms['map'].value = THREE.ImageUtils.loadTexture( "img/particle.png" ); uniforms['size'].value = 100; uniforms['opacity'].value = 0.5; uniforms['psColor'].value = new THREE.Color( 0xffffff );
Here is my fragment shader (only part of it):
gl_FragColor = vec4( psColor, vOpacity ); gl_FragColor = gl_FragColor * texture2D( map,vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y ) ); gl_FragColor = gl_FragColor * vec4( vColor, 1.0 );
I applied the material to some particles ( THREE.PointCloud mesh) and it works quite well:

But if I rotate the camera more than 180 degrees, I see this:

I understand that the fragment shader does not correctly take into account the alpha value of the PNG texture.
What is the best approach in this case to get the desired color and opacity (from user attributes) and still get alpha to the right of PNG?
And why does this work correctly on the one hand?
source share