Quick answer: Sample with vec2(UV.x, 1.0 - UV.y) in fragment. Or set Texture import → Flip Vertical.
Custom .gdshader on a MeshInstance3D shows the texture upside-down. UV convention difference between authoring and Godot 4 Vulkan path.
The Fix
shader_type spatial;
uniform sampler2D tex;
void fragment() {
vec2 uv = vec2(UV.x, 1.0 - UV.y); // flip Y
ALBEDO = texture(tex, uv).rgb;
}
Or fix at import time so all shaders see consistent orientation. Pick one path; mixing leads to per-asset chaos.
Verifying
Texture appears right-side up. Compare with StandardMaterial3D using the same texture — matches.
“Flip in shader. Or import. One source of truth.”
Related Issues
For shader instance uniform, see instance uniform. For shader TIME, see TIME.
Flip Y. Texture upright.