-
Notifications
You must be signed in to change notification settings - Fork 16
/
Copy pathscene3.glsl
87 lines (76 loc) · 2.14 KB
/
scene3.glsl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#ifdef GL_ES
precision highp float;
#endif
uniform vec2 resolution;
uniform float time;
uniform float lowFreq;
float f(vec3 o)
{
float a=(sin(o.x)+o.y*.25)*.35;
o=vec3(cos(a)*o.x-sin(a)*o.y,sin(a)*o.x+cos(a)*o.y,o.z);
return dot(cos(o)*cos(o),vec3(1))-1.2;
}
#if 1
//
// modified by iq:
// removed the break inside the marching loop (GLSL compatibility)
// replaced 10 step binary search by a linear interpolation
//
vec3 s(vec3 o,vec3 d)
{
float t=0.0;
float dt = 0.2;
float nh = 0.0;
float lh = 0.0;
for(int i=0;i<50;i++)
{
nh = f(o+d*t);
if(nh>0.0) { lh=nh; t+=dt; }
}
if( nh>0.0 ) return vec3(.93,.94,.85);
t = t - dt*nh/(nh-lh);
vec3 e=vec3(.1,0.0,0.0);
vec3 p=o+d*t;
vec3 n=-normalize(vec3(f(p+e),f(p+e.yxy),f(p+e.yyx))+vec3((sin(p*75.)))*.01);
return vec3( mix( ((max(-dot(n,vec3(.577)),0.) + 0.125*max(-dot(n,vec3(-.707,-.707,0)),0.)))*(mod
(length(p.xy)*20.,2.)<1.0?vec3(.71,.85,.25):vec3(.79,.93,.4))
,vec3(.93,.94,.85), vec3(pow(t/9.,5.)) ) );
}
#else
//
// original marching
//
vec3 s(vec3 o,vec3 d)
{
float t=0.,a,b;
for(int i=0;i<75;i++)
{
if(f(o+d*t)<0.0)
{
a=t-.125;b=t;
for(int i=0; i<10;i++)
{
t=(a+b)*.5;
if(f(o+d*t)<0.0)
b=t;
else
a=t;
}
vec3 e=vec3(.1,0.0,0.0);
vec3 p=o+d*t;
vec3 n=-normalize(vec3(f(p+e),f(p+e.yxy),f(p+e.yyx))+vec3((sin(p*75.)))*.01);
return vec3( mix( ((max(-dot(n,vec3(.577)),0.) + 0.125*max(-dot(n,vec3(-.707,-.707,0)),0.)))*(mod(length(p.xy)*20.,2.)<1.0?vec3(.71,.85,.25):vec3(.79,.93,.4))
,vec3(.93,.94,.85), vec3(pow(t/9.,5.)) ) );
}
t+=.125;
}
return vec3(.93,.94,.85);
}
#endif
void main()
{
// time = time + clamp(10.0 * lowFreq, 0.0, 0.75);
float a = 200.0 * lowFreq * lowFreq + 0.1;
vec2 p = -1.0 + 2.0 * gl_FragCoord.xy / resolution.xy;
gl_FragColor= a * vec4(s(vec3(sin(time*1.5)*.5,cos(time)*.5,time), normalize(vec3(p.xy,1.0))),1.0);
}