Есть ли способ применить эффект синусоидального искажения только в шейдерах?

Синусоидальное искажение 2D-изображения - это классический визуальный эффект: получение 2D-изображения и его деформация по оси X или Y путем смещения пикселей в соответствии с синусоидальной волной. В конечном итоге это выглядит примерно так: Y-axis sinewave distortion example

Я видел несколько примеров кода для этого, и стандартный способ сделать это с помощью OpenGL, похоже, - это изображение размеров (x, y):

for each column from 0 to X
  draw a single quad one pixel wide and y pixels high, offset by a sine wave value

Конечно, это требует большой работы на стороне клиента. Есть ли способ нарисовать один квад и переложить работу по искажению на графический процессор с помощью шейдеров? Только вершинные и фрагментные шейдеры; Я использую OpenGL 2, поэтому геометрических шейдеров нет.

Я знаю, что могу использовать фрагментный шейдер для выборки координат текстуры, смещенных синусоидальной волной, но заставить их разместить за пределами исходного блока, определенного квадратом, было бы сложно, и я бы предпочел не иметь вывод будет обрезан, как на образце изображения. Есть ли способ обойти эту проблему?

7
задан Mason Wheeler 1 November 2011 в 18:37
поделиться