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.