evg
Разбор демо-эффекта "Плазма"

Эффект "Плазма" заключается в цветовом отображении нескольких синусоид наложенных одна на другую.

Старт | Стоп
v = sin(x*10+time) v = sin(10*(x*sin(time/2.0)+y*cos(time/3.0))+time);
cx = x + 0.5 * sin(time / 5.0)
cy = y + 0.5 * cos(time / 3.0)
v = sin(sqrt(100 *(cx * cx + cy * cy) + 1) + time)
cx = x + 0.5 * sin(time/5.0);
cy = y + 0.5 * cos(time/3.0);
v = sin((x * 10 + time)) +
    sin(10 * (x * sin(time/2.0) + y * cos(time/3.0)) + time) +
    sin(sqrt(100 * (cx * cx + cy * cy) + 1) + time)

Палитра №1Палитра №2
r = 255*(0.5+0.4 * sin(PI * v))
g = r
b = r
r = 255
g = 255*(0.5 + 0.5 * cos(PI * v))
b = 255*(0.5 + 0.5 * sin(PI * v))

Вот, более сложный пример плазмы:

  v =  sin( x * cos( time / 15.0 ) * 80.0 ) + cos( y * cos( time / 15.0 ) * 10.0 );
  v += sin( y * sin( time / 10.0 ) * 40.0 ) + cos( x * sin( time / 25.0 ) * 40.0 );
  v += sin( x * sin( time / 5.0 ) * 10.0 ) +  sin( y * sin( time / 35.0 ) * 80.0 );
  v *= sin( time / 10.0 ) * 0.5;

На палитре с зависимостью от времени:

   r = 255 * v;
   g = 255 * v * 0.5;
   b = 255 * sin( toRadians(v) + time/3 ) * 0.75;

Реализация этой плазмы на GLSL:


#ifdef GL_ES
precision mediump float;
#endif

uniform float time;
uniform vec2 resolution;

void main( void ) {

	vec2 position = ( gl_FragCoord.xy / resolution.xy );

	float color = 0.0;
	color += sin( position.x * cos( time / 15.0 ) * 80.0 ) + cos( position.y * cos( time / 15.0 ) * 10.0 );
	color += sin( position.y * sin( time / 10.0 ) * 40.0 ) + cos( position.x * sin( time / 25.0 ) * 40.0 );
	color += sin( position.x * sin( time / 5.0 ) * 10.0 ) + sin( position.y * sin( time / 35.0 ) * 80.0 );
	color *= sin( time / 10.0 ) * 0.5;

	gl_FragColor = vec4( vec3( color, color * 0.5, sin( color + time / 3.0 ) * 0.75 ), 1.0 );

}

Коментарии