Неоднородные плавные искривления никак не получится сделать в рамках CSS или SVG. Плюс волна трехмерная, поэтому изобретать что-то в 2d-канвасе будет непрактично и скорее всего сложно в плане производительности. Поэтому использование WebGL - это естественный выбор. Конкретные библиотеки/фреймворки не имеют значения, в конечном счете все такие волны сводятся к простой схеме:
- Берем плоскость
- На плоскость накладываем какую-нибудь красивую текстуру
- Добавляем вершин побольше
- В вершинном шейдере делаем какой-то генератор шума и используем значения из него чтобы двигать вершины туда-сюда в направлении, перпендикулярном плоскости
- Опционально там же рассчитываем нормали для освещения
- Играемся с коэффициентами до посинения, пока результат не начнет нравиться