Quick answer: Godot SCREEN_TEXTURE sampling upside-down on GLES3 mobile while correct on Vulkan? GLES3 uses bottom-left origin - flip the V coordinate or use SCREEN_UV unchanged but render through a Viewport.

Glass shader reflects the scene flipped on Android, correct on desktop Vulkan. Same shader, different framebuffer orientation.

Flip V on GLES3

vec2 uv = SCREEN_UV;
#ifdef RENDER_GLES
uv.y = 1.0 - uv.y;
#endif

The conditional keeps both backends correct. Vulkan reads top-left already.

Route through a SubViewport

SubViewport's framebuffer has consistent orientation across backends. Sample from ViewportTexture instead of SCREEN_TEXTURE.

Use the renderer macro

Godot 4.3+ exposes GLES3 as a preprocessor define in shaders. Don't guess at runtime; use the compile-time branch.

“Backbuffer orientation is a backend choice - your shader has to know.”

If your game targets both backends, build a small shader test scene that renders a known image as SCREEN_TEXTURE and visually inspects the output.