How did they do it:
In this post, I will explain how these results are calculated almost exclusively on gpu via WebGL / Three.js - this may look a bit messy, as I use the integrated graphics of the Intel i7 4770k:

:
-gpu: . 1024x1024 , , - .
RGB 0... 255. 32- (R + G + B + ) , . ( , /).
. :
- ( ) ('randShader')
- ('velShader')
- ('posShader')
- ('dispShader') **
.
2: :
1 , . 2 "vUv" , x y , .
- , ( RGB- , - gpu). id="velFrag", uniform vec3 targetPos;. CPU, . ( , , -1.00f + 1.00f), , FEW, ).
? , , , - . : / , .
.
3: :
. , - Texture. , ( ), , Texture :
id="posFrag" (posTexture velTexture) . x y ( ).
.
4: - (= )
, , , / positionTexture . , RGB x, y ( ).
// From <script type="x-shader/x-vertex" id="dispVert">
vec3 mvPosition = texture2D(posTex, vec2(x, y)).rgb;
gl_PointSize = 1.0;
gl_Position = projectionMatrix * modelViewMatrix * vec4(mvPosition,1.0);
( , 20 , ).
// From <script type="x-shader/x-fragment" id="dispFrag">
gl_FragColor = vec4(vec3(0.5, 1.0, 0.1), 0.05);
.
, , :-) . , - - , .