Эффект "Плазма" заключается в цветовом отображении нескольких синусоид наложенных одна на другую.
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 );
}