evg

Трансформация 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

Коментарии