я делаю так
vec3 normtex = texture2D(normalmap, IN_TexCoords).xyz;
normtex = normtex*2.0-1.0;
mat3 TBN = mat3(normalize(IN_Tangent), normalize(IN_Binormal), normalize(IN_Normal));
normal = TBN * normtex;
далее normal это нормаль в ворлдспейсе с учётом нормалмапы.
некоторые любят переводить лайты в тангент спейс, но мне кажется так удобнее.