-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathFractal_01.osl
76 lines (68 loc) · 1.7 KB
/
Fractal_01.osl
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
// Based on a method found by Kali on fractal forums, adapted and modded in GLSL, ported to OSL
// OSL version by Mads Drøschler
// 5.6.2018
// License CC3.0
float fract ( float x )
{
return x - floor (x);
}
float field(vector p,float s, float Time)
{
float strength = 7. + .03 * log(1.e-6 + fract(sin(Time) * 4373.11));
float accum = s/4.;
float prev = 0.;
float tw = 0.;
for (int i = 0; i < 26; ++i)
{
float mag = dot(p, p);
p = abs(p) / mag + vector(-.5, -.4, -1.5);
float w = exp(-float(i) / 7.);
accum += w * exp(-strength * pow(abs(mag - prev), 2.2));
tw += w;
prev = mag;
}
return max(0., 5. * accum / tw - .7);
}
float map2( vector p, float Time )
{
float t = field(p,.5, Time);
return t;
}
vector raymarch(vector ro, vector rd, vector tminmax, float Time )
{
float t = tminmax[0];
float dt = .2 * sin(Time*.1);
vector col= vector(0.);
float c = 0.;
for( int i=0; i<10; i++ )
{
t+=dt*exp(-2.*c);
if(t>tminmax[1])break;
c = map2(ro+t*rd, Time);
col = .99*col+ .08*vector(c*c*c, c*c, c);
}
return col;
}
vector render( vector ro, vector rd, float Time )
{
float mindist = 1.0;
float maxdist = 4.0;
return raymarch(ro, rd, vector(mindist, maxdist,0),Time);
}
shader Fractal_01
(
point Po = P,
float Time = 0,
output vector Out = 0,
)
{
vector uv = Po;
Out = vector(uv[0],uv[1],0.5+0.5*sin(Time));
vector p = (-Po);
float an = 1.87 - 0.04*(1.0-cos(0.5*Time));
vector ro = vector(-0.4,0.2,0.0) + 2.2*vector(cos(an),0.0,sin(an));
vector ta = vector(-0.6,0.2,0.);
vector rd = normalize( vector(p[0],p[1],-2.8) );
vector col = render( ro, rd, Time );
Out = vector( col);
}