Every hard-surface tutorial ends the same way. Add a Weighted Normal modifier, export FBX, done.
Unreal has been throwing that work away since 5.4. I measured it this week on a stock install.
Why this email lands on me
I sell base mesh packs and game-ready props into projects I never see. When shading looks wrong in someone else's level, I get the message.
The mesh was correct when it left my machine. That is easy to say and hard to prove, so I built a test that proves it.
The two test meshes
I made them in Blender 5.1.1. Both carry custom normals and nothing else unusual.
- A flat plane. Four vertices, two triangles, every normal tilted 30 degrees off the surface.
- A 24-sided cylinder wall. Forty-eight vertices, all smooth, every normal rotated 20 degrees off radial.
The second one is not a toy. It is what a normal transfer does to foliage cards and to flat panels shaded from a proxy.
I exported each as FBX and as glTF. Then I imported them into Unreal Engine 5.7.3, default settings, nothing touched.
I did not judge this by eye. A script read the normals back out of the built asset and printed the angle.
The numbers
FBX through Unreal's default importer, measured on the imported asset:
- Plane: 0.00 degrees. The authored 30 is gone.
- Cylinder: 0.00 degrees off radial. The authored 20 is gone.
The same meshes as glTF, same engine, same session:
- Plane: 30.00 degrees.
- Cylinder: 20.00 degrees.
The same FBX file with the legacy importer switched back on:
- Plane: 30.00 degrees.
- Cylinder: 20.00 degrees.
The file was never the problem
I checked the FBX itself before blaming anyone. Blender out to FBX and back into Blender returns 30.0 and 20.0 exactly.
So the normals are in the file. One importer reads them and one does not.
Why the default is this way
Interchange replaced the legacy FBX plugin as Unreal's default in 5.4. A forum thread about this opened on 1 February 2025 and is still open.
An Epic engineer answered it in April 2025. Legacy FBX had recompute-normals off for static meshes and on for skeletal ones. Interchange cannot yet choose per mesh type, so the skeletal value was taken for both.
The old importer is still in the build. It sits behind a console variable named Interchange.FeatureFlags.Import.FBX, which ships set to 1.
What the checkboxes actually say
I read the shipped import pipeline in 5.7.3 rather than trusting a screenshot. Four settings under Common Meshes, Build:
- Recompute Normals: on
- Compute Weighted Normals: on
- Recompute Tangents: on
- Use MikkTSpace: on
The glTF pipeline in the same install has Recompute Normals off. That single difference is the whole result above.
Epic's import reference page describes all four options and publishes no defaults.
Why almost nobody reports it
Unreal's recompute is weighted by face area and corner angle. On a bevelled part that lands close to what the Weighted Normal modifier gave you.
Close is not the same, but it is close enough that the mesh looks acceptable and no bug gets filed. Normal transfer is where it falls apart. There the normals are meant to disagree with the geometry, so putting them back on the geometry undoes the entire technique.
Three fixes, in the order I would try them
- Turn Recompute Normals off in the import dialog, under Common Meshes and Build. This is per import.
- Save your own pipeline asset with it off, and point the project at that. This is the one that survives a team.
- Send glTF. In my test it needed no settings change at all.
None of this is exotic. It is one checkbox that nobody told you about.
What I am changing on my side
My FBX files are correct and that is not enough. From now on the shading test goes in the pack, not just the mesh.
I teach the import step in the Unreal course, and that lesson now starts with this checkbox. Bakes need the same habit. Look at the result before you trust it, which is the argument in why mesh maps are not optional.
What I did not test
I had 5.7.3 on this machine. Unreal 5.8 documentation is live, and I have not measured that build.
I also tested static meshes only. Skeletal meshes want recomputed normals, which is where this default came from in the first place.
If Epic splits the setting by mesh type, this article is finished and I will be glad. Until then, check the box before you blame the mesh.

