Вы можете добиться "волнового" эффекта в WebGL, передав все вычисления на графический процессор.
Для этого необходимо разделить квадрат (или прямоугольник) на треугольную полосу, как показано в следующей схеме:
1 3 5 7
| /| /| /|
|/ |/ |/ |
2 4 6 8
Поместите вершину 1 в координатах (0,0), вершину 2 в (0,1), вершину 7 в (1,0) и вершину 8 в (1,1). Вы можете легко вывести координаты для остальных вершин.
Эти координаты - это UV, используемые в текстуре для отображения вашего изображения Более того, вы можете использовать эти координаты для размещения вершины на экране.
Чтобы получить эффект «волны», вы можете перемещаться вверх и вниз по вершинам в зависимости от времени.
Вершинный шейдер будет выполняться для каждой вершины и параллельно. Его код может быть очень простым. Вот пример:
// The time is the only variable value.
uniform float uniTime;
// Coords of the current vertex.
attribute vec2 attCoords;
// Propagate UV coords to the fragment shader
varying vec2 varUV;
void main() {
// Propagate UV coords to the fragment shader
varUV = attCoords;
// Separate X and Y coordinates.
float x = attCoords.x;
float y = attCoords.y;
// Compute the vertical shift of the vertex according to the time.
float h = cos( uniTime + x * 10.0 );
// The following line is not mandatory, but it make the move look
// more random.
h += cos( x * 3.0 - uniTime * 0.1751 );
// Define the size of the wave and make it steady on the left
// to simulate a fixing point on a stick.
y += h * x * 0.2;
// In WebGL, the visble space is between -1 and +1 in each direction.
gl_Position = vec4( 2.0 * x - 1.0, 0.5 - y, 0.0, 1.0 );
}
Вы можете увидеть живой пример здесь: https://jsfiddle.net/63sj1rpk/53/