56 lines
2.0 KiB
GLSL
56 lines
2.0 KiB
GLSL
// Inject some common shader snippets. It is only possible to include glsl files from the
|
|
// "common" directory. Also, the files in the "common" directory are not allowed to
|
|
// include any further files.
|
|
#include "common/uniforms.glsl"
|
|
#include "common/noise.glsl"
|
|
#include "common/edgeMask.glsl"
|
|
#include "common/compositing.glsl"
|
|
|
|
uniform vec2 uSeed;
|
|
uniform vec3 uColor;
|
|
uniform float uScale;
|
|
|
|
const float WISPS_RADIUS = 20.0;
|
|
const float WISPS_SPEED = 10.0;
|
|
const float WISPS_SPACING = 40 + WISPS_RADIUS;
|
|
const int WISPS_LAYERS = 8;
|
|
const float WISPS_IN_TIME = 0.5;
|
|
const float WINDOW_OUT_TIME = 1.0;
|
|
|
|
// Returns a grid of randomly moving points. Each grid cell contains one point which
|
|
// moves on an ellipse.
|
|
float getWisps(vec2 texCoords, float gridSize, vec2 seed) {
|
|
|
|
// Shift coordinates by a random offset and make sure the have a 1:1 aspect ratio.
|
|
vec2 coords = (texCoords + hash22(seed)) * uSize;
|
|
|
|
// Apply global scale.
|
|
coords /= gridSize;
|
|
|
|
// Get grid cell coordinates in [0..1].
|
|
vec2 cellUV = mod(coords, vec2(1));
|
|
|
|
// This is unique for each cell.
|
|
vec2 cellID = coords - cellUV + vec2(362.456);
|
|
|
|
// Add random rotation, scale and offset to each grid cell.
|
|
float speed = mix(10.0, 15.0, hash12(cellID * seed * 134.451)) / gridSize * WISPS_SPEED;
|
|
float rotation = mix(0.0, 6.283, hash12(cellID * seed * 54.4129));
|
|
float radius = mix(0.5, 1.0, hash12(cellID * seed * 19.1249)) * WISPS_RADIUS;
|
|
float roundness = mix(-1.0, 1.0, hash12(cellID * seed * 7.51949));
|
|
|
|
vec2 offset = vec2(sin(speed * (uTime + 1)) * roundness, cos(speed * (uTime + 1)));
|
|
offset *= 0.5 - 0.5 * radius / gridSize;
|
|
offset = vec2(offset.x * cos(rotation) - offset.y * sin(rotation),
|
|
offset.x * sin(rotation) + offset.y * cos(rotation));
|
|
|
|
cellUV += offset;
|
|
|
|
// Use distance to center of shifted / rotated UV coordinates to draw a glaring point.
|
|
float dist = length(cellUV - 0.5) * gridSize / radius;
|
|
if (dist < 1.0) {
|
|
return min(5, 0.01 / pow(dist, 2.0));
|
|
}
|
|
|
|
return 0.0;
|
|
} |