2/ Going to start with a basic texture from Pinni to demonstrate each step.
The shader can work in any game engine; in Pinni we use Unity's awful shaders language, but for readability I'll be using HLSL.
3/ Distorting an image from a fragment shader basically means taking each UV coordinate and moving it.
We want to move in the opposite direction of the origin, which we can get from the normalized (direction-only) result of our UV coordinate minus the center.