Quick answer: Godot 4 light_mode shader pass missing normal data? Some passes don't include normal interpolators by default - declare NORMAL in vertex output.

Normal-map shader's light pass reads NORMAL as (0,0,1); broken lighting.

Pass normal through interpolator

varying vec3 v_normal;
// vertex:
v_normal = NORMAL;

Explicit pass; light shader reads the actual normal.

Or use TANGENT/BINORMAL

For normal-mapped surfaces, tangent space passed through. Light shader reconstructs.

Audit interpolator declarations

Each varying matches expected shader inputs. Mismatch = silent wrong values.

“Vertex-to-fragment passing is explicit. Implicit defaults differ per pipeline.”

If your shader behaves differently across renderers, the interpolator setup is suspect. Document; standardize.

Related reading