Move the cursor through the cloth: it wraps around an invisible sphere. Add wind, then cut the pins.
GPU cloth. Position-based dynamics in fragment shaders.
The cloth is a 128 × 128 grid of particles stored in a floating-point texture. Each frame a fragment shader integrates positions with Verlet (gravity, wind, damping), then a constraint shader runs a dozen relaxation iterations: every particle looks at its structural, shear, and bend neighbours, computes how far each spring is from rest length, and moves toward satisfying all of them at once. Jacobi-style, so it parallelises perfectly.
Collision with the cursor is a sphere test in the same pass: any particle inside the sphere is projected to its surface. The two top corners are pinned by a flag in the alpha channel; cutting the pins just clears the flag and the whole sheet falls.
Rendering does not read the positions back to the CPU. A static index buffer describes the grid, and the vertex shader fetches each vertex’s position from the texture and derives a normal from its neighbours, so the mesh is rebuilt on the GPU every frame. The shading is a two-sided sheen with an anisotropic highlight, which is what makes it read as silk and not paper.