Mirrored uvs show seam even with neutral normal map

Hi all,

I’ve been butting my head against mirrored normal map seam issues for a long time now and would greatly appreciate any help. For a sanity check I went to the simplest test case I could think of:

  1. I created a plane, mirrored the geometry and uv shell in Maya then exported as .fbx
  2. I then created a 2K neutral normal map texture in Photoshop with all RGB values of 128,128,255.
  3. I imported the mesh into Unreal and assigned the normal map texture
  4. In the mesh viewer you can see the seam when I move the light just right. The material is just using the defaultLit shading model and I added some constants into the roughness and metallic channel to make it shinier to showcase the seam better.

I know the tangent vector is flipped for the mirrored part of the plane, but as far as I know that is what I want so the mirrored tangent will be correct for X. The mirrored uv shell has been moved into another tile, and I set the texture mode to wrap.

I’ve tried flipping the mirrored shell in Maya then using “mirror” texture wrap mode in Unreal. This removes the seam and mirrors the normal map, but now the x value of the normal map isn’t correct on the mirrored side of the plane.

It doesn’t seem to matter if both shells share the same uv space. Here are some images for reference:

Hmm, I would check your geometry. If you’re saying it does this even with a plain normal map, then this has to be a problem with the mesh. Make sure that is indeed only a single vertex and not two very close together, and make sure it is consistent on both ends. You could also double-check how the tri conversion was handled when it was imported by inspecting the wireframe of your mesh in Unreal Engine and make sure everything looks good there.

All that to say, this looks like a mesh issue, not a material issue.

Good luck!

Thanks for the response. I verified the triangles were symmetrical from conversion, and there is only one vertex on the top middle and bottom.

After more research I found this issue on Github where someone reported similar seams on a flat plane in 3.js. It turned out to be due to bent normals at the seam due to numerical precision issues at 0: Seams with normal map and mirrored uvs · Issue #18565 · mrdoob/three.js · GitHub

I subtracted .003921 from the x channel in the normal map in my material and the seam was gone! I guess Unreal doesn’t natively do this. If anyone has any other ideas or workarounds please let me know. Here is the fixed image with a round bevel in the normal map plane and the seam is completely gone: