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.