Simply put, FSOpen's normal map shader is doing it wrong. I encountered a similar problem when I was implementing tangent-space normal mapping in a program of my own, and I think I know what the issue is...

**For everyone else who doesn't, tangent-space normal maps (the kind FSO uses) work like this:**

There's a normal vector (fairly straight forward, it's the direction "out" from the surface, possibly using the per-vertex defined normals, i.e. smoothing info. I don't know if FSO does that or not. Next, depending on the terminology you use, you could say there are 2 tangent vectors, or a tangent vector and a bi-tangent vector. These are basically vectors in the plane of the polygon which correspond to the u- and v- texture axes. Basically they're the directions in which u and v increase the fastest; the gradients of *u* and *v* with respect to position.

These vectors are normalized (meaning they're scaled to have a length of 1), and the shader lights the object as though its normal vector were the linear combination of these 3 vectors with the coefficients for the 1st tangent, 2nd tangent, and normal vector being the reg, green, and blue components of the normal map (of a traditional "blue" normal map, of course, not the converted green/alpha maps FSO uses), respectively.

**I suspect the problem is this:**

The 2nd tangent vector (sometimes called the bi-tangent) is often perpendicular to the 1st tangent vector; if the texture is not skewed at all, they are exactly perpendicular. Thus, a program can get away with using a cross-product (the cross product of two vectors is a vector guaranteed to be perpendicular to both of the two input vectors) rather than doing the potentially more expensive calculation necessary to compute 2 tangent vectors. However, if a model is mirrored (with accordingly mirrored texture coordinates), the direction of the cross product vector is *opposite* of what it is on the other side.

So really the program (or the vertex shader) just needs to calculate both tangent vectors.

I'll bring this to the attention of someone on the SCP, maybe it can be fixed and in the nightly builds soon.