Чтобы преобразовать точку из координат мира в экран, вы умножаете ее на матрицы вида и проекции. Поэтому, если у вас есть пиксель на экране, вы можете умножить его координаты (в диапазоне -1..1 для всех трех осей) на обратные преобразования, чтобы найти соответствующую точку в мировом пространстве, а затем умножить его на новые матрицы вида / проекции для следующий кадр.
Уловка в том, что вам нужна правильная глубина (координата Z), если вы хотите найти движение точек сетки. Для этого вы можете либо проследить луч через этот пиксель и найти его пересечение с вашей сеткой, либо просто прочитать содержимое Z-буфера, предварительно отобразив его в текстуре.
Аналогичная методика используется для размытия движения, где скорость каждого пикселя вычисляется в фрагментном шейдере. Подробное объяснение можно найти в GeForce GPU 3 ch27 .
Я сделал jsfiddle с помощью этой техники: http://jsfiddle.net/Rivvy/f9kpxeaw/126/
Вот соответствующий фрагмент кода:
// reconstruct normalized device coordinates
ivec2 coord = ivec2(gl_FragCoord.xy);
vec4 pos = vec4(v_Position, texelFetch(u_Depth, coord, 0).x * 2.0 - 1.0, 1.0);
// convert to previous frame
pos = u_ToPrevFrame * pos;
vec2 prevCoord = pos.xy / pos.w;
// calculate velocity
vec2 velocity = -(v_Position - prevCoord) / 8.0;