-
Notifications
You must be signed in to change notification settings - Fork 18
/
Copy pathWvN.DelphiShader.FX.NielmoJuliaSet.pas
132 lines (111 loc) · 3.73 KB
/
WvN.DelphiShader.FX.NielmoJuliaSet.pas
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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
unit WvN.DelphiShader.FX.NielmoJuliaSet;
interface
uses GR32, Types, WvN.DelphiShader.Shader;
type
TNielmoJuliaSet = class(TShader)
const
{x $DEFINE antialias}
sr = 0.13;
depth = 128;
vec4_1: vec4 = (x: 0; y: 0; z: 0; w: 1);
vec2_2: vec2 = (x: 0.000; y: 0.333);
vec2_3: vec2 = (x: 0.000; y: 0.666);
vec2_4: vec2 = (x: 0.333; y: 0.000);
vec2_5: vec2 = (x: 0.333; y: 0.333);
vec2_6: vec2 = (x: 0.333; y: 0.666);
vec2_7: vec2 = (x: 0.666; y: 0.000);
vec2_8: vec2 = (x: 0.666; y: 0.333);
vec2_9: vec2 = (x: 0.666; y: 0.666);
var
scale: float;
lr: float;
l : vec2;
rr: float;
r : vec2;
constructor Create; override;
procedure PrepareFrame;
function mandelbrot(const p: vec2; depth: float; const l, r: vec2; scale: float): vec4;
function mainImage(var fragCoord: vec2): TColor32;
end;
var
NielmoJuliaSet: TShader;
implementation
uses SysUtils, Math;
constructor TNielmoJuliaSet.Create;
begin
inherited;
FrameProc := PrepareFrame;
PixelProc := mainImage;
end;
procedure TNielmoJuliaSet.PrepareFrame;
begin
lr := 1.57;
l := vec2.Create(0.7071 * sinLarge(0.717 * sinLarge(0.17 * iGlobalTime * lr) + 0.017 * iGlobalTime), 0.7071 * cosLarge(0.717 * sinLarge(0.17 * iGlobalTime * lr) + 0.017 * iGlobalTime));
rr := 1.37;
r := vec2.Create(0.7071 * sinLarge(0.717 * sinLarge(0.17 * iGlobalTime * rr) + 0.017 * iGlobalTime), 0.7071 * cosLarge(0.717 * sinLarge(0.17 * iGlobalTime * rr) + 0.017 * iGlobalTime));
scale := 0.10 + 0.003 * sinLarge(iGlobalTime * sr);
scale := 4 * scale;
end;
function TNielmoJuliaSet.mandelbrot(const p: vec2; depth: float; const l, r: vec2; scale: float): vec4;
var
re, im : float;
loc, c, z : vec2;
n : float;
nn : integer;
cr, cg, cb: float;
begin
re := -0.8 + 0.03 * sinLarge(iGlobalTime * 0.117) + 0.009 * sinLarge(iGlobalTime * 0.716);
im := 0.15 + 0.03 * sinLarge(iGlobalTime * 0.073) + 0.009 * sinLarge(iGlobalTime * 0.332);
loc := vec2.Create(re, im);
c := (p.xy - resolution.xy / 2) / resolution.y * scale;
c := vec2.Create(c.x * r.x - c.y * r.y, c.x * r.y + r.x * c.y) - l / 1.5;
z := c;
n := 0;
for nn := 0 to 1024 do
begin
z := vec2.Create(z.x * z.x - z.y * z.y, 2 * z.x * z.y) + loc;
n := n + 1;
if dot(z, z) >= 256 then
break;
if n >= depth then
break;
end;
if n >= depth then
Exit(vec4_1);
n := n - Math.log2(Math.log2(dot(z, z)));
n := n * 0.01;
n := System.sqrt(n);
cr := 0.5 + 0.5 * cosLarge(n * 7 + iGlobalTime);
cg := 0.5 + 0.5 * cosLarge(n * 11 + iGlobalTime * 1.111);
cb := 0.5 + 0.5 * cosLarge(n * 13 + iGlobalTime * 2.567);
Exit(vec4.Create(cr, cg, cb, 1));
end;
function TNielmoJuliaSet.mainImage(var fragCoord: vec2): TColor32;
var
{$IFDEF antialias}
c0,c1, c2, c3, c4, c5, c6, c7, c8: vec4;
{$ENDIF}
fragColor: vec4;
begin
{$IFDEF antialias}
c0 := mandelbrot(fragCoord.xy, depth, l, r, scale);
c1 := mandelbrot(fragCoord.xy+vec2_2,depth,l,r,scale);
c2 := mandelbrot(fragCoord.xy+vec2_3,depth,l,r,scale);
c3 := mandelbrot(fragCoord.xy+vec2_4,depth,l,r,scale);
c4 := mandelbrot(fragCoord.xy+vec2_5,depth,l,r,scale);
c5 := mandelbrot(fragCoord.xy+vec2_6,depth,l,r,scale);
c6 := mandelbrot(fragCoord.xy+vec2_7,depth,l,r,scale);
c7 := mandelbrot(fragCoord.xy+vec2_8,depth,l,r,scale);
c8 := mandelbrot(fragCoord.xy+vec2_9,depth,l,r,scale);
fragColor := (c0 + c1 + c2 + c3 + c4 + c5 + c6 + c7 + c8) * 0.11111111;
{$ELSE}
fragColor := mandelbrot(fragCoord.xy, depth, l, r, scale);
{$ENDIF}
Result := TColor32(fragColor);
end;
initialization
NielmoJuliaSet := TNielmoJuliaSet.Create;
Shaders.Add('NielmoJuliaSet', NielmoJuliaSet);
finalization
FreeandNil(NielmoJuliaSet);
end.