Luxophia
125 строк · 2.5 Кб
1#version 430
2
3#extension GL_ARB_compute_variable_group_size : enable
4
5//layout( local_size_variable ) in;
6layout( local_size_x = 10,
7local_size_y = 10,
8local_size_z = 1 ) in;
9
10//------------------------------------------------------------------------------
11const ivec3 _WorkGrupsN = ivec3( gl_NumWorkGroups );
12
13//const ivec3 _WorkItemsN = ivec3( gl_LocalGroupSizeARB );
14const ivec3 _WorkItemsN = ivec3( gl_WorkGroupSize );
15
16const ivec3 _WorksN = _WorkGrupsN * _WorkItemsN;
17
18const ivec3 _WorkID = ivec3( gl_GlobalInvocationID );
19
20
21struct TDoubleC
22{
23double R;
24double I;
25};
26
27//------------------------------------------------------------------------------
28
29TDoubleC Add( TDoubleC A, TDoubleC B )
30{
31TDoubleC Result;
32
33Result.R = A.R + B.R;
34Result.I = A.I + B.I;
35
36return Result;
37}
38
39TDoubleC Sub( TDoubleC A, TDoubleC B )
40{
41TDoubleC Result;
42
43Result.R = A.R - B.R;
44Result.I = A.I - B.I;
45
46return Result;
47}
48
49TDoubleC Mul( TDoubleC A, TDoubleC B )
50{
51TDoubleC Result;
52
53Result.R = A.R * B.R - A.I * B.I;
54Result.I = A.R * B.I + A.I * B.R;
55
56return Result;
57}
58
59TDoubleC Pow2( TDoubleC C )
60{
61return Mul( C, C );
62}
63
64double Abs( TDoubleC C )
65{
66return sqrt( C.R * C.R + C.I * C.I );
67}
68
69//----------------------------------------------------------------------------
70
71struct TAreaC
72{
73TDoubleC Min;
74TDoubleC Max;
75};
76
77//----------------------------------------------------------------------------
78
79layout( std430 ) buffer TBuffer
80{
81TAreaC _RangeC;
82};
83
84writeonly uniform image2D _Imager;
85
86uniform sampler1D _Textur;
87
88//----------------------------------------------------------------------------
89
90TDoubleC ScreenToComplex( ivec2 S )
91{
92TDoubleC Result;
93
94Result.R = ( _RangeC.Max.R - _RangeC.Min.R ) * ( S.x + 0.5 ) / _WorksN.x + _RangeC.Min.R;
95Result.I = ( _RangeC.Min.I - _RangeC.Max.I ) * ( S.y + 0.5 ) / _WorksN.y + _RangeC.Max.I;
96
97return Result;
98}
99
100vec4 ComplexToColor( TDoubleC C )
101{
102TDoubleC Z = TDoubleC( 0, 0 );
103
104for ( int N = 1; N < 500; N++ )
105{
106Z = Add( Pow2( Z ), C );
107
108if ( Abs( Z ) > 2 ) return texture( _Textur, N / 500.0 );
109}
110
111return texture( _Textur, 1 );
112}
113
114//----------------------------------------------------------------------------
115
116void main()
117{
118TDoubleC C = ScreenToComplex( _WorkID.xy );
119
120vec4 L = ComplexToColor( C );
121
122imageStore( _Imager, _WorkID.xy, L );
123}
124
125//----------------------------------------------------------------------------
126