Трансформация 2d текстуры согласно математической модели сохраняемой в таблице(lookup table).
Эффект очень часто применялся в старых демках, так как тяжелые преобразования(sin, cos, sqrt, pow)
выполняются только на этапе создания LUT. Далее происходит выборка значения цвета из текстуры
по этой таблице. Движение реализуется путем добавления смещения к значению LUT. Смещение - время либо
счетчик кадров. Нагрузка на проц минимальна. Легко реализуется на ассемблере.
Скорость | Эффекты | Текстура |
|
u - координата по Y
v - координата по X
b - изменение яркости точки (0 .. 1)
a = atan2(x,y) - угол между осью X и точкой [x,y]
d = sqrt(x*x + y*y) - расстояние
Все это можно также делать и без LUT, расчитывая значение u, v, b в каждой точке, но - ресурсозатратно. Другое дело если использовать GPU... Там все очень просто.
Если LUT вычисляется и передается GPU как текстура, то код на GLSL будет примерно такой
uniform float time;
uniform sampler2D tex;
uniform sampler2D LUT;
void main( void )
{
vec4 uv = texture2D( LUT, gl_TexCoord[0].xy );
vec4 color = texture2D( tex, uv.xy + vec2(time) );
gl_FragColor = color;
}
А вот вариант без LUT, т.е. трансформация точек происходит на GPU (для shadertoy.com).
void main(void)
{
vec2 uv = gl_FragCoord.xy/iResolution.xy;
uv = -1.0 + 2.0*uv;
uv.x *= iResolution.x/iResolution.y; // aspect ratio
float a = atan(uv.x, uv.y); // angle
float d = length(uv); // length
uv.x = a/3.1416; // magic formulas
uv.y = 1.0/d;
float b = 0.1 + 1./pow(d,0.3);
vec4 color = texture2D(iChannel0, uv.xy + vec2(iGlobalTime/3.)); // get texture & offset
gl_FragColor = vec4(color.rgb*b,color.a);
}
Эффекты из статьи великого IQ http://iquilezles.org/www/articles/deform/deform.htm