The culprit is this innocent-looking line here:
specular = specularIntensity * specularColor * pow(saturate(dot(reflection, normalize(input.viewDirection))), specularPower);
When specularPower
is zero, specular
always winds up as one because any variable raised to the zero power is 1. So that last globe you're seeing is a view of the specular reflection of all pixels with specular reflection.
But your question asked for help finding a problem in the code. I didn't offer one because, strictly speaking, there isn't one - because there is no problem. It's just a quirk of specularity.