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