Why are these mesh normals different just because one is rotated 180deg on the Y axis?
These are two flat planes sitting side by side. But when I rotate one of them it lights differently due to the normals shown here from the normal buffer. It makes no sense, as they are perfectly flat planes with 4 verts and 2 triangles. All verts are at the same Y height and it’s definitely flat.
This is an exported mesh .glb from Blender 4.0. I can’t find any issues with normals, duplicate verts or anything unusual. It’s not the first time I’ve noticed this issue either. I’ve seen it happen on more complex models and it’s driving me crazy.
This is how normals work. The normal is a vector that means “the side of the face that should be rendered” usually. If you enable backface culling you’ll see one of your planes become see-through, and if you rotate the camera around, you’ll see the opposite plane is.
The way normals are used to calculate lighting means faces with the normal facing away from the camera, if made to render, will look very dark as they are reflecting light the wrong way.
If what you want is a plane that can be seen from both sides, you need it to have 4 triangles. Two facing one side, two facing the other, and not connected by smooth shading.
This is how all 3D works, it’s not an issue, it’s part of the fundamental architecture.
Thanks, I am aware of backside normals being different. This is a different case, the Y axis is directly up in that image (the axis gizmo line you can see running vertically through the center). That’s the axis I rotated the second plane on, so it’s the exact same forward facing normal on the surface of the plane, just rotated 180 deg on the Y axis. Before I rotate it, they match, after I rotate it the normals are different but should not be. I’m starting to wonder if it’s a GLTF rounding error or some other subtle export problem from Blender.
I knew I wasn’t going crazy. There was a pipeline issue in Godot! The normals in Blender were perfect, the representation in Godot was screwy. It comes down to a bug in mesh compression.
Solution: Check Force Disable Compression
Oh, you said Y axis and I assumed Z was up ;u;