Skip to content

Commit 0794141

Browse files
Support GLSL in shadertoy (#343)
* support GLSL in shadertoy * Apply suggestions from code review --------- Co-authored-by: Almar Klein <[email protected]>
1 parent b66df50 commit 0794141

15 files changed

+2096
-44
lines changed

examples/shadertoy_blink.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
2727
fn shader_main(frag_coord: vec2<f32>) -> vec4<f32> {
2828
29-
let uv = (frag_coord-i_resolution*0.5)/i_resolution.y;
29+
let uv = (frag_coord-i_resolution.xy*0.5)/i_resolution.y;
3030
3131
let col = render(uv);
3232

examples/shadertoy_circuits.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242
}
4343
4444
fn shader_main(frag_coord: vec2<f32>) -> vec4<f32> {
45-
var uv = frag_coord / i_resolution - 0.5;
45+
var uv = frag_coord / i_resolution.xy - 0.5;
4646
uv.x*=i_resolution.x/i_resolution.y;
4747
4848
var aa = 6.0;

examples/shadertoy_flyby.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@
162162
}
163163
164164
fn shader_main(frag_coord : vec2<f32>) -> vec4<f32> {
165-
var uv = frag_coord / i_resolution;
165+
var uv = frag_coord / i_resolution.xy;
166166
uv = uv - 0.5;
167167
uv /= vec2<f32>(i_resolution.y / i_resolution.x, 1.0);
168168

examples/shadertoy_glsl_flame.py

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
from wgpu.utils.shadertoy import Shadertoy
2+
3+
shader_code = """
4+
5+
// https://www.shadertoy.com/view/MdX3zr
6+
7+
// Created by anatole duprat - XT95/2013
8+
// License Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License.
9+
10+
float noise(vec3 p) //Thx to Las^Mercury
11+
{
12+
vec3 i = floor(p);
13+
vec4 a = dot(i, vec3(1., 57., 21.)) + vec4(0., 57., 21., 78.);
14+
vec3 f = cos((p-i)*acos(-1.))*(-.5)+.5;
15+
a = mix(sin(cos(a)*a),sin(cos(1.+a)*(1.+a)), f.x);
16+
a.xy = mix(a.xz, a.yw, f.y);
17+
return mix(a.x, a.y, f.z);
18+
}
19+
20+
float sphere(vec3 p, vec4 spr)
21+
{
22+
return length(spr.xyz-p) - spr.w;
23+
}
24+
25+
float flame(vec3 p)
26+
{
27+
float d = sphere(p*vec3(1.,.5,1.), vec4(.0,-1.,.0,1.));
28+
return d + (noise(p+vec3(.0,iTime*2.,.0)) + noise(p*3.)*.5)*.25*(p.y) ;
29+
}
30+
31+
float scene(vec3 p)
32+
{
33+
return min(100.-length(p) , abs(flame(p)) );
34+
}
35+
36+
vec4 raymarch(vec3 org, vec3 dir)
37+
{
38+
float d = 0.0, glow = 0.0, eps = 0.02;
39+
vec3 p = org;
40+
bool glowed = false;
41+
42+
for(int i=0; i<64; i++)
43+
{
44+
d = scene(p) + eps;
45+
p += d * dir;
46+
if( d>eps )
47+
{
48+
if(flame(p) < .0)
49+
glowed=true;
50+
if(glowed)
51+
glow = float(i)/64.;
52+
}
53+
}
54+
return vec4(p,glow);
55+
}
56+
57+
void mainImage( out vec4 fragColor, in vec2 fragCoord )
58+
{
59+
vec2 v = -1.0 + 2.0 * fragCoord.xy / iResolution.xy;
60+
v.x *= iResolution.x/iResolution.y;
61+
62+
vec3 org = vec3(0., -2., 4.);
63+
vec3 dir = normalize(vec3(v.x*1.6, -v.y, -1.5));
64+
65+
vec4 p = raymarch(org, dir);
66+
float glow = p.w;
67+
68+
vec4 col = mix(vec4(1.,.5,.1,1.), vec4(0.1,.5,1.,1.), p.y*.02+.4);
69+
70+
fragColor = mix(vec4(0.), col, pow(glow*2.,4.));
71+
//fragColor = mix(vec4(1.), mix(vec4(1.,.5,.1,1.),vec4(0.1,.5,1.,1.),p.y*.02+.4), pow(glow*2.,4.));
72+
73+
}
74+
75+
76+
77+
""" # noqa
78+
shader = Shadertoy(shader_code)
79+
80+
if __name__ == "__main__":
81+
shader.show()

examples/shadertoy_glsl_fuji.py

Lines changed: 169 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,169 @@
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

Comments
 (0)