White & black dots can be the result of math that produces errors. 99% of the cases are sqrt(negative number) and ~zero-length vectors.
Flickering is usually uninitialized variables.
Completely white/black is usually missing/empty texture, or missing/uninitialized uniforms etc.
Check your inputs for errors.
Transfer normal and tangent to pixel shader (interpolated) and show their magnitudes. color = length(vector);
white = good, black = bad
Eventually you will find the issue. It helps alot to know what values certain things should have. For example, directional vectors (normal, tangent, binormal) should all be length == 1 (white).