What an intriguing question!
To achieve this effect with a single sprite, you can utilize a shaderMaterial by disabling depthTest and using the vertex/fragment shader to render pixels below ground level as transparent. Alternatively, you can duplicate the sprites and set depthTest to false on one of them. This way, the sprite will still be visible underneath the ground without affecting its visibility above ground.
I have provided a small example for reference: https://jsfiddle.net/EthanHermsey/kw7dn8bh/25/
// Create 2 sprites
let sprite = new THREE.Sprite(
new THREE.SpriteMaterial({
color: 'red'
})
)
sprite.scale.setScalar( 0.5 );
let sprite2 = new THREE.Sprite(
new THREE.SpriteMaterial({
color: 'red',
opacity: 0.2,
transparent: true,
depthTest: false
})
)
sprite2.scale.setScalar( 0.5 );
// Create a container for both sprites, add sprites to it.
spriteContainer = new THREE.Object3D();
spriteContainer.add(sprite)
spriteContainer.add(sprite2)
scene.add(spriteContainer);