0.00
60.0 fps
Starfield in the sky with scroll
Starfield effect .
Godot version: godotshaders.com/sha…ling-effect-ver-1-0/
Log in to post a comment.
#version 300 es
precision highp float;
uniform float iTime;
uniform vec2 iResolution;
uniform float u_density; // value=150, min=0, max=100, step=0.1
uniform float u_speed; // value=0.2, min=0, max=10, step=0.01
uniform float u_size; // value=3, min=0, max=10, step=0.1
uniform float u_wind; // value=2, min=0, max=10, step=0.1
out vec4 fragColor;
float onedx(float x) {
if (x == 0.) {
return 1.;
} else {
return 1./x;
}
}
float onedx2(float x) {
return onedx(x)*onedx(x);
}
float getBetaW(float x, float f, float size) {
return size*x*3.1415926/f;
}
float getBetaH(float y, float f, float size) {
return size*y*3.1415926/f;
}
float getI(vec2 uv, float f, vec2 SIZE) {
return onedx2(getBetaW(uv.x, f, SIZE.x))*onedx2(getBetaH(uv.y, f, SIZE.y));
}
float random(vec2 st) {
return fract(sin(dot(st.xy, vec2(12.9898, 78.233))) * 43758.5453123);
}
float noise(vec2 st) {
vec2 i = floor(st);
vec2 f = fract(st);
float a = random(i);
float b = random(i + vec2(1.0, 0.0));
float c = random(i + vec2(0.0, 1.0));
float d = random(i + vec2(1.0, 1.0));
vec2 u = f * f * (3.0 - 2.0 * f);
return mix(a, b, u.x) +
(c - a) * u.y * (1.0 - u.x) +
(d - b) * u.x * u.y;
}
float fbm(vec2 st) {
float value = 0.0;
float amplitude = 0.5;
float frequency = 2.0;
for(int i = 0; i < 5; i++) {
value += amplitude * noise(st * frequency);
frequency *= 2.0;
amplitude *= 0.5;
}
return value;
}
vec2 getSnowflakeWorldCenter(vec2 gridId, float timeOffset, vec2 snowOffset, float layerScale) {
vec2 gridWorldPos = (gridId + snowOffset) / layerScale;
gridWorldPos.x += (timeOffset / layerScale);
return gridWorldPos;
}
vec2 rotate(vec2 uv, float addtheta) {
float theta = atan(uv.y/uv.x) + addtheta;
float r = sqrt(uv.x*uv.x + uv.y*uv.y);
vec2 ruv;
ruv.x = r*cos(theta);
ruv.y = r*sin(theta);
return ruv;
}
void main() {
vec3 color = vec3(0.02, 0.04, 0.12);
vec2 st = gl_FragCoord.xy / iResolution;
st.x = st.x/iResolution.y*iResolution.x;
vec2 cuv = (st - 0.5)*2.;
for(int layer = 0; layer < 3; layer++) {
float layerScale = float(layer + 1) * u_density * 0.02;
float layerSpeed = u_speed * (1.0 + float(layer) * 0.3);
float layerSize = u_size * (1.0 - float(layer) * 0.2);
vec2 layerSt = st * layerScale;
vec2 cuvSt = cuv;
float timeOffset = iTime * layerSpeed * 1.;
layerSt.x -= timeOffset;
vec2 gridSt = fract(layerSt);
vec2 gridId = floor(layerSt);
float randSeed = random(gridId);
vec2 snowPos = vec2(
0.5 + 0.3 * sin(randSeed * 6.28 + iTime * 0.3),
0.5 + 0.2 * cos(randSeed * 12.56)
);
float dist = distance(gridSt, snowPos);
float snowSize = layerSize * 0.01 * (0.5 + 0.5 * randSeed);
float brightness = 1.0 - float(layer) * 0.3;
float M = exp(-dist * dist / (snowSize * snowSize));
float rotateAngle = 0.01 * (iTime * cos(randSeed * 120.0 + iTime * 0.2));
vec2 fst = rotate(cuvSt - (getSnowflakeWorldCenter(gridId, timeOffset, snowPos, layerScale) - 0.5)*2., rotateAngle);
float snowflake = getI(fst, 0.8 - dist*42., vec2(1./snowSize))*M*0.5 + M*0.5;
float twinkle = 0.6 + 0.4 * (sin(randSeed * 100.0 + iTime * 4.0) * cos(randSeed * 120.0 + iTime * 6.0));
snowflake *= twinkle;
vec3 colortype = vec3(random(gridId-3.),random(gridId+7.),random(gridId+5.));
color += (snowflake * brightness) * colortype;
}
fragColor = vec4(color, 1.0);
}