Scusami se faccio sembrare un po 'semplicistico questo suono, non sono sicuro di quanto tu sappia sulla programmazione gfx o anche su quali tecniche stai usando (lo farei io stesso con HLSL).
Il modo in cui vorrei affrontare questo problema è generare una trama che contenga offset delle coordinate x/y nei canali r/g. Quindi il colore di uscita di un pixel potrebbe essere:
Texture inputImage
testura distortionMap
colore (x, y) = inputImage (x + distortionMap (x, y) .R, y + distortionMap (x, y) .G)
(a dire il vero questo non è giusto, utilizzando i colori come offset significa direttamente si può rappresentare solo vettori positivi, è abbastanza semplice per sottrarre 0.5 in modo da poter rappresentare vettori negativi)
Ora l'unica il problema che rimane è come generare questa mappa di distorsione, che è una domanda completamente diversa (qualsiasi immagine potrebbe generare una distorsione di qualche tipo, ovviamente, lavorare su un effetto di fluidificazione adeguato è piuttosto complesso e lo lascerò a eone più qualificato).