My renderer first does an ambient pass, and then individual lighting passes. All materials have shaders that are compiled once for each pass type, with different macros defined (so far it's just nothing for ambient, and the DIRECTIONAL_LIGHT macro for a directional light pass).
Now here are my vertex shader and fragment shader source. Notice how I'm not doing any normal mapping nor any texture reads. All it is is just simple Blinn-Phong diffuse and specular lighting, but in tangent space. And here is my result:
The asset was originally from a DirectX game, it was converted into an .obj file and then exported from Blender with a script I wrote. I can post it here, too, if you suspect that to be the issue, but I kinda doubt it.
(Ignore the POS varying variable in my shaders, that was for when I was attempting to debug and tried drawing some values directly).