Shaders.
A lot more to it than that, unfortunately.
Individual shaders work on a per-vertex/per-fragment basis, and thus know nothing of the other items in the scene.
They basically get per-model 'variables' (including textures) and per-scene 'global variables'.
I believe this can only really be done using post-processing shaders, where you first render-to-texture, then render 'shockwave info' to another texture, then use a shader that takes the 'shockwave info' texture and uses it to distort the first result.
There might be a way to use a stencil buffer instead (which would be faster), but I suspect that wouldn't give the kind of result you're after.