| #version 150 |
| |
| uniform vec2 winsize; |
| uniform float time; |
| |
| out vec4 fragColor; |
| |
| float displacement(vec3 p) |
| { |
| float cosT = cos(time); |
| float sinT = sin(time); |
| |
| mat2 mat = mat2(cosT, -sinT, sinT, cosT); |
| p.xz *= mat; |
| p.xy *= mat; |
| vec3 q = 1.75 * p; |
| |
| return length(p + vec3(sinT)) * |
| log(length(p) + 1.0) + |
| sin(q.x + sin(q.z + sin(q.y))) * 0.25 - 1.0; |
| } |
| |
| void main() |
| { |
| vec3 color; |
| float d = 2.5; |
| vec2 screenPos = gl_FragCoord.xy / winsize.xy - vec2(0.6, 0.4); |
| vec3 pos = normalize(vec3(screenPos, -1.0)); |
| float sinT = sin(time) * 0.2; |
| |
| // compute plasma color |
| for (int i = 0; i < 8; ++i) { |
| vec3 p = vec3(0.0, 0.0, 5.0) + pos * d; |
| |
| float positionFactor = displacement(p); |
| d += min(positionFactor, 1.0); |
| |
| float clampFactor = clamp((positionFactor- displacement(p + 0.1)) * 0.5, -0.1, 1.0); |
| vec3 l = vec3(0.2 * sinT, 0.35, 0.4) + vec3(5.0, 2.5, 3.25) * clampFactor; |
| color = (color + (1.0 - smoothstep(0.0, 2.5, positionFactor)) * 0.7) * l; |
| } |
| |
| // background color + plasma color |
| fragColor = vec4(screenPos * (vec2(1.0, 0.5) + sinT), 0.5 + sinT, 1.0) + vec4(color, 1.0); |
| } |