cyber_fuji_2020.glsl Full Listing#

../../_images/cyber_fuji_2020.png
cyber_fuji_2020.glsl#
  1// Fractal Pyramid by kaiware007
  2// Source : https://www.shadertoy.com/view/Wt33Wf
  3
  4float sun(vec2 uv, float battery)
  5{
  6 	float val = smoothstep(0.3, 0.29, length(uv));
  7 	float bloom = smoothstep(0.7, 0.0, length(uv));
  8    float cut = 3.0 * sin((uv.y + iTime * 0.2 * (battery + 0.02)) * 100.0)
  9				+ clamp(uv.y * 14.0 + 1.0, -6.0, 6.0);
 10    cut = clamp(cut, 0.0, 1.0);
 11    return clamp(val * cut, 0.0, 1.0) + bloom * 0.6;
 12}
 13
 14float grid(vec2 uv, float battery)
 15{
 16    vec2 size = vec2(uv.y, uv.y * uv.y * 0.2) * 0.01;
 17    uv += vec2(0.0, iTime * 4.0 * (battery + 0.05));
 18    uv = abs(fract(uv) - 0.5);
 19 	vec2 lines = smoothstep(size, vec2(0.0), uv);
 20 	lines += smoothstep(size * 5.0, vec2(0.0), uv) * 0.4 * battery;
 21    return clamp(lines.x + lines.y, 0.0, 3.0);
 22}
 23
 24float dot2(in vec2 v ) { return dot(v,v); }
 25
 26float sdTrapezoid( in vec2 p, in float r1, float r2, float he )
 27{
 28    vec2 k1 = vec2(r2,he);
 29    vec2 k2 = vec2(r2-r1,2.0*he);
 30    p.x = abs(p.x);
 31    vec2 ca = vec2(p.x-min(p.x,(p.y<0.0)?r1:r2), abs(p.y)-he);
 32    vec2 cb = p - k1 + k2*clamp( dot(k1-p,k2)/dot2(k2), 0.0, 1.0 );
 33    float s = (cb.x<0.0 && ca.y<0.0) ? -1.0 : 1.0;
 34    return s*sqrt( min(dot2(ca),dot2(cb)) );
 35}
 36
 37float sdLine( in vec2 p, in vec2 a, in vec2 b )
 38{
 39    vec2 pa = p-a, ba = b-a;
 40    float h = clamp( dot(pa,ba)/dot(ba,ba), 0.0, 1.0 );
 41    return length( pa - ba*h );
 42}
 43
 44float sdBox( in vec2 p, in vec2 b )
 45{
 46    vec2 d = abs(p)-b;
 47    return length(max(d,vec2(0))) + min(max(d.x,d.y),0.0);
 48}
 49
 50float opSmoothUnion(float d1, float d2, float k){
 51	float h = clamp(0.5 + 0.5 * (d2 - d1) /k,0.0,1.0);
 52    return mix(d2, d1 , h) - k * h * ( 1.0 - h);
 53}
 54
 55float sdCloud(in vec2 p, in vec2 a1, in vec2 b1, in vec2 a2, in vec2 b2, float w)
 56{
 57	//float lineVal1 = smoothstep(w - 0.0001, w, sdLine(p, a1, b1));
 58    float lineVal1 = sdLine(p, a1, b1);
 59    float lineVal2 = sdLine(p, a2, b2);
 60    vec2 ww = vec2(w*1.5, 0.0);
 61    vec2 left = max(a1 + ww, a2 + ww);
 62    vec2 right = min(b1 - ww, b2 - ww);
 63    vec2 boxCenter = (left + right) * 0.5;
 64    //float boxW = right.x - left.x;
 65    float boxH = abs(a2.y - a1.y) * 0.5;
 66    //float boxVal = sdBox(p - boxCenter, vec2(boxW, boxH)) + w;
 67    float boxVal = sdBox(p - boxCenter, vec2(0.04, boxH)) + w;
 68
 69    float uniVal1 = opSmoothUnion(lineVal1, boxVal, 0.05);
 70    float uniVal2 = opSmoothUnion(lineVal2, boxVal, 0.05);
 71
 72    return min(uniVal1, uniVal2);
 73}
 74
 75void mainImage( out vec4 fragColor, in vec2 fragCoord )
 76{
 77    vec2 uv = (2.0 * fragCoord.xy - iResolution.xy)/iResolution.y;
 78    float battery = 1.0;
 79    //if (iMouse.x > 1.0 && iMouse.y > 1.0) battery = iMouse.y / iResolution.y;
 80    //else battery = 0.8;
 81
 82    //if (abs(uv.x) < (9.0 / 16.0))
 83    {
 84        // Grid
 85        float fog = smoothstep(0.1, -0.02, abs(uv.y + 0.2));
 86        vec3 col = vec3(0.0, 0.1, 0.2);
 87        if (uv.y < -0.2)
 88        {
 89            uv.y = 3.0 / (abs(uv.y + 0.2) + 0.05);
 90            uv.x *= uv.y * 1.0;
 91            float gridVal = grid(uv, battery);
 92            col = mix(col, vec3(1.0, 0.5, 1.0), gridVal);
 93        }
 94        else
 95        {
 96            float fujiD = min(uv.y * 4.5 - 0.5, 1.0);
 97            uv.y -= battery * 1.1 - 0.51;
 98
 99            vec2 sunUV = uv;
100            vec2 fujiUV = uv;
101
102            // Sun
103            sunUV += vec2(0.75, 0.2);
104            //uv.y -= 1.1 - 0.51;
105            col = vec3(1.0, 0.2, 1.0);
106            float sunVal = sun(sunUV, battery);
107
108            col = mix(col, vec3(1.0, 0.4, 0.1), sunUV.y * 2.0 + 0.2);
109            col = mix(vec3(0.0, 0.0, 0.0), col, sunVal);
110
111            // fuji
112            float fujiVal = sdTrapezoid( uv  + vec2(-0.75+sunUV.y * 0.0, 0.5), 1.75 + pow(uv.y * uv.y, 2.1), 0.2, 0.5);
113            float waveVal = uv.y + sin(uv.x * 20.0 + iTime * 2.0) * 0.05 + 0.2;
114            float wave_width = smoothstep(0.0,0.01,(waveVal));
115
116            // fuji color
117            col = mix( col, mix(vec3(0.0, 0.0, 0.25), vec3(1.0, 0.0, 0.5), fujiD), step(fujiVal, 0.0));
118            // fuji top snow
119            col = mix( col, vec3(1.0, 0.5, 1.0), wave_width * step(fujiVal, 0.0));
120            // fuji outline
121            col = mix( col, vec3(1.0, 0.5, 1.0), 1.0-smoothstep(0.0,0.01,abs(fujiVal)) );
122            //col = mix( col, vec3(1.0, 1.0, 1.0), 1.0-smoothstep(0.03,0.04,abs(fujiVal)) );
123            //col = vec3(1.0, 1.0, 1.0) *(1.0-smoothstep(0.03,0.04,abs(fujiVal)));
124
125            // horizon color
126            col += mix( col, mix(vec3(1.0, 0.12, 0.8), vec3(0.0, 0.0, 0.2), clamp(uv.y * 3.5 + 3.0, 0.0, 1.0)), step(0.0, fujiVal) );
127
128            // cloud
129            vec2 cloudUV = uv;
130            cloudUV.x = mod(cloudUV.x + iTime * 0.1, 4.0) - 2.0;
131            float cloudTime = iTime * 0.5;
132            float cloudY = -0.5;
133            float cloudVal1 = sdCloud(cloudUV,
134                                     vec2(0.1 + sin(cloudTime + 140.5)*0.1,cloudY),
135                                     vec2(1.05 + cos(cloudTime * 0.9 - 36.56) * 0.1, cloudY),
136                                     vec2(0.2 + cos(cloudTime * 0.867 + 387.165) * 0.1,0.25+cloudY),
137                                     vec2(0.5 + cos(cloudTime * 0.9675 - 15.162) * 0.09, 0.25+cloudY), 0.075);
138            cloudY = -0.6;
139            float cloudVal2 = sdCloud(cloudUV,
140                                     vec2(-0.9 + cos(cloudTime * 1.02 + 541.75) * 0.1,cloudY),
141                                     vec2(-0.5 + sin(cloudTime * 0.9 - 316.56) * 0.1, cloudY),
142                                     vec2(-1.5 + cos(cloudTime * 0.867 + 37.165) * 0.1,0.25+cloudY),
143                                     vec2(-0.6 + sin(cloudTime * 0.9675 + 665.162) * 0.09, 0.25+cloudY), 0.075);
144
145            float cloudVal = min(cloudVal1, cloudVal2);
146
147            //col = mix(col, vec3(1.0,1.0,0.0), smoothstep(0.0751, 0.075, cloudVal));
148            col = mix(col, vec3(0.0, 0.0, 0.2), 1.0 - smoothstep(0.075 - 0.0001, 0.075, cloudVal));
149            col += vec3(1.0, 1.0, 1.0)*(1.0 - smoothstep(0.0,0.01,abs(cloudVal - 0.075)));
150        }
151
152        col += fog * fog * fog;
153        col = mix(vec3(col.r, col.r, col.r) * 0.5, col, battery * 0.7);
154
155        fragColor = vec4(col,1.0);
156    }
157    //else fragColor = vec4(0.0);
158}