1// Compatibility #ifdefs needed for parameters
2#ifdef GL_ES
3#define COMPAT_PRECISION mediump
4#else
5#define COMPAT_PRECISION
6#endif
7
8// Parameter lines go here:
9#pragma parameter RETRO_PIXEL_SIZE "Retro Pixel Size" 0.84 0.0 1.0 0.01
10#ifdef PARAMETER_UNIFORM
11// All parameter floats need to have COMPAT_PRECISION in front of them
12uniform COMPAT_PRECISION float RETRO_PIXEL_SIZE;
13#else
14#define RETRO_PIXEL_SIZE 0.84
15#endif
16
17#if defined(VERTEX)
18
19#if __VERSION__ >= 130
20#define COMPAT_VARYING out
21#define COMPAT_ATTRIBUTE in
22#define COMPAT_TEXTURE texture
23#else
24#define COMPAT_VARYING varying
25#define COMPAT_ATTRIBUTE attribute
26#define COMPAT_TEXTURE texture2D
27#endif
28
29#ifdef GL_ES
30#define COMPAT_PRECISION mediump
31#else
32#define COMPAT_PRECISION
33#endif
34
35COMPAT_ATTRIBUTE vec4 VertexCoord;
36COMPAT_ATTRIBUTE vec4 COLOR;
37COMPAT_ATTRIBUTE vec4 TexCoord;
38COMPAT_VARYING vec4 COL0;
39COMPAT_VARYING vec4 TEX0;
40// out variables go here as COMPAT_VARYING whatever
41
42vec4 _oPosition1;
43uniform mat4 MVPMatrix;
44uniform COMPAT_PRECISION int FrameDirection;
45uniform COMPAT_PRECISION int FrameCount;
46uniform COMPAT_PRECISION vec2 OutputSize;
47uniform COMPAT_PRECISION vec2 TextureSize;
48uniform COMPAT_PRECISION vec2 InputSize;
49
50// compatibility #defines
51#define vTexCoord TEX0.xy
52#define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize
53#define OutSize vec4(OutputSize, 1.0 / OutputSize)
54
55void main()
56{
57    gl_Position = MVPMatrix * VertexCoord;
58    TEX0.xy = VertexCoord.xy;
59// Paste vertex contents here:
60}
61
62#elif defined(FRAGMENT)
63
64#if __VERSION__ >= 130
65#define COMPAT_VARYING in
66#define COMPAT_TEXTURE texture
67out vec4 FragColor;
68#else
69#define COMPAT_VARYING varying
70#define FragColor gl_FragColor
71#define COMPAT_TEXTURE texture2D
72#endif
73
74#ifdef GL_ES
75#ifdef GL_FRAGMENT_PRECISION_HIGH
76precision highp float;
77#else
78precision mediump float;
79#endif
80#define COMPAT_PRECISION mediump
81#else
82#define COMPAT_PRECISION
83#endif
84
85uniform COMPAT_PRECISION int FrameDirection;
86uniform COMPAT_PRECISION int FrameCount;
87uniform COMPAT_PRECISION vec2 OutputSize;
88uniform COMPAT_PRECISION vec2 TextureSize;
89uniform COMPAT_PRECISION vec2 InputSize;
90uniform sampler2D Texture;
91COMPAT_VARYING vec4 TEX0;
92// in variables go here as COMPAT_VARYING whatever
93
94// compatibility #defines
95#define Source Texture
96#define vTexCoord TEX0.xy
97
98#define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize
99#define OutSize vec4(OutputSize, 1.0 / OutputSize)
100
101// delete all 'params.' or 'registers.' or whatever in the fragment
102float iGlobalTime = float(FrameCount)*0.025;
103vec2 iResolution = OutputSize.xy;
104
105/* Gabor^2, by mattz.
106   License: Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License.
107
108   Goal: render the face of Zsa Zsa Gabor using the basis function proposed by Dennis Gabor.
109
110   Original image: http://www.instyle.com/celebrity/gallery-vintage-photos-zsa-zsa-gabor
111   Gabor filter: https://en.wikipedia.org/wiki/Gabor_filter
112   More about Dennis: https://en.wikipedia.org/wiki/Dennis_Gabor
113   More about Zsa Zsa: https://en.wikipedia.org/wiki/Zsa_Zsa_Gabor
114
115   Fitting these 128 basis functions took several days (!) on my Macbook Pro (CPU only, no GPU).
116
117   See https://mzucker.github.io/2016/08/01/gabor-2.html for more details.
118
119   There was probably a faster way of doing it.
120
121*/
122
123const vec4 scl = vec4(0.00391389432485, 0.0122958616579, 0.00782778864971, 0.00391389432485);
124
125float cnt = 0.0;
126
127float gabor(vec2 p, vec4 q) {
128
129    // Here we decode the vec4 q into 8 individual parameters:
130    //
131    //   q0 = (x, a, l, s)
132    //   q1 = (y, p, t, h)
133    //
134    // with parameters given by
135    //
136    //   x: function center x coordinate
137    //   y: function center y coordinate
138    //   a: Gabor function spatial angle/orientation
139    //   p: Gabor function phase offset
140    //   l: Spatial wavelength
141    //   s: Filter width perpendicular to sinusoidal component
142    //   t: Filter width parallel to sinusoidal component
143    //   h: Amplitude
144    //
145    vec4 q0 = floor(q*0.001953125)*scl;
146    vec4 q1 = mod(q, 512.0)*scl;
147
148    float cr = cos(q0.y);
149    float sr = sin(q0.y);
150
151    vec2 st = vec2(q0.w, q1.z);
152
153    // Rotate and translate point
154    p = mat2(cr, -sr, sr, cr) * (p - vec2(q0.x, q1.x));
155
156    // Handle appearing at the start of filter
157    q1.w *= smoothstep(cnt, cnt+0.5, iGlobalTime*32.0);
158    ++cnt;
159
160    // amplitude * gaussian * sinusoid
161    return q1.w * exp(dot(vec2(-0.5), p*p/(st*st))) * cos(p.x*6.2831853/q0.z+q1.y);
162
163}
164
165void mainImage( out vec4 fragColor, in vec2 fragCoord ) {
166
167	vec2 p = (fragCoord.xy - 0.5*iResolution.xy) * 1.2 / iResolution.y;
168    p.y = -p.y;
169    p += 1.0;
170
171    float k = 0.0;
172
173    k += gabor(p, vec4(138752.,150667.,261821.,93447.));
174    k += gabor(p, vec4(226145.,131739.,77399.,33587.));
175    k += gabor(p, vec4(63748.,240999.,76311.,23447.));
176    k += gabor(p, vec4(150173.,43128.,50197.,22225.));
177    k += gabor(p, vec4(116939.,73605.,57898.,7679.));
178    k += gabor(p, vec4(51.,227699.,261732.,68280.));
179    k += gabor(p, vec4(50687.,129029.,38508.,17512.));
180    k += gabor(p, vec4(117913.,117281.,32319.,32324.));
181    k += gabor(p, vec4(96910.,174542.,26669.,26719.));
182    k += gabor(p, vec4(117600.,70656.,17940.,16010.));
183    k += gabor(p, vec4(108871.,58049.,51302.,47654.));
184    k += gabor(p, vec4(167609.,91829.,28204.,28213.));
185    k += gabor(p, vec4(90467.,245116.,36375.,7167.));
186    k += gabor(p, vec4(82369.,164365.,30329.,30267.));
187    k += gabor(p, vec4(225089.,129997.,6684.,4095.));
188    k += gabor(p, vec4(205005.,127709.,12815.,12982.));
189    k += gabor(p, vec4(175993.,130600.,23563.,11978.));
190    k += gabor(p, vec4(30069.,10115.,23055.,2559.));
191    k += gabor(p, vec4(137435.,215947.,14350.,14446.));
192    k += gabor(p, vec4(226165.,115949.,47659.,18501.));
193    k += gabor(p, vec4(71368.,123529.,23052.,12515.));
194    k += gabor(p, vec4(102042.,215281.,7176.,2857.));
195    k += gabor(p, vec4(68218.,214988.,25632.,25694.));
196    k += gabor(p, vec4(115954.,5782.,40979.,2930.));
197    k += gabor(p, vec4(123338.,133796.,77334.,23039.));
198    k += gabor(p, vec4(203913.,117.,38944.,33329.));
199    k += gabor(p, vec4(227964.,132231.,189988.,12174.));
200    k += gabor(p, vec4(63649.,26205.,10763.,10940.));
201    k += gabor(p, vec4(97912.,45398.,12810.,1739.));
202    k += gabor(p, vec4(106690.,166508.,16387.,2559.));
203    k += gabor(p, vec4(54873.,146884.,58426.,58402.));
204    k += gabor(p, vec4(178346.,81559.,14341.,2559.));
205    k += gabor(p, vec4(185649.,144747.,16391.,1535.));
206    k += gabor(p, vec4(120084.,199932.,10249.,4361.));
207    k += gabor(p, vec4(100115.,63452.,18981.,18968.));
208    k += gabor(p, vec4(180941.,96255.,18962.,18500.));
209    k += gabor(p, vec4(63718.,126911.,34827.,11485.));
210    k += gabor(p, vec4(61203.,92616.,23582.,18498.));
211    k += gabor(p, vec4(172754.,196259.,16390.,6559.));
212    k += gabor(p, vec4(177015.,230484.,25173.,24616.));
213    k += gabor(p, vec4(157875.,57828.,4618.,4837.));
214    k += gabor(p, vec4(105263.,51711.,17997.,17939.));
215    k += gabor(p, vec4(167049.,203925.,24612.,15906.));
216    k += gabor(p, vec4(144087.,67302.,14874.,14931.));
217    k += gabor(p, vec4(150391.,43665.,53778.,4032.));
218    k += gabor(p, vec4(207569.,22528.,15906.,8795.));
219    k += gabor(p, vec4(137039.,173193.,27653.,2559.));
220    k += gabor(p, vec4(206047.,207878.,18958.,7797.));
221    k += gabor(p, vec4(228200.,131090.,5678.,5799.));
222    k += gabor(p, vec4(113976.,64789.,7689.,6396.));
223    k += gabor(p, vec4(83114.,62975.,15903.,13894.));
224    k += gabor(p, vec4(117517.,132261.,12814.,11335.));
225    k += gabor(p, vec4(149162.,180114.,75786.,4971.));
226    k += gabor(p, vec4(219290.,259568.,7701.,3469.));
227    k += gabor(p, vec4(9233.,249362.,21102.,14898.));
228    k += gabor(p, vec4(12348.,105446.,15436.,10340.));
229    k += gabor(p, vec4(147344.,213862.,14917.,14877.));
230    k += gabor(p, vec4(205125.,182142.,82962.,5368.));
231    k += gabor(p, vec4(161978.,187391.,5644.,5760.));
232    k += gabor(p, vec4(88210.,61601.,16388.,2047.));
233    k += gabor(p, vec4(78650.,114304.,15885.,2047.));
234    k += gabor(p, vec4(115065.,71687.,15886.,7819.));
235    k += gabor(p, vec4(93059.,235007.,12814.,10350.));
236    k += gabor(p, vec4(196884.,27136.,12303.,5338.));
237    k += gabor(p, vec4(171860.,258580.,24079.,15418.));
238    k += gabor(p, vec4(183655.,243097.,21510.,2559.));
239    k += gabor(p, vec4(191277.,128656.,12293.,3583.));
240    k += gabor(p, vec4(157553.,43644.,22026.,2014.));
241    k += gabor(p, vec4(76369.,27135.,14370.,10903.));
242    k += gabor(p, vec4(194876.,76800.,7683.,3357.));
243    k += gabor(p, vec4(150218.,45734.,3076.,2201.));
244    k += gabor(p, vec4(230711.,259797.,3613.,3813.));
245    k += gabor(p, vec4(143536.,47519.,32771.,2435.));
246    k += gabor(p, vec4(73356.,64451.,16409.,6741.));
247    k += gabor(p, vec4(228480.,129023.,2581.,2683.));
248    k += gabor(p, vec4(193434.,117680.,17930.,4095.));
249    k += gabor(p, vec4(71419.,126168.,4112.,2190.));
250    k += gabor(p, vec4(94887.,188293.,41993.,4095.));
251    k += gabor(p, vec4(221843.,258986.,4634.,4788.));
252    k += gabor(p, vec4(254463.,215580.,25241.,24612.));
253    k += gabor(p, vec4(36217.,144383.,23056.,9348.));
254    k += gabor(p, vec4(110799.,84416.,10835.,10767.));
255    k += gabor(p, vec4(92864.,216574.,22019.,2047.));
256    k += gabor(p, vec4(21781.,110203.,209421.,13785.));
257    k += gabor(p, vec4(42162.,246368.,12299.,11902.));
258    k += gabor(p, vec4(178010.,28532.,27661.,2559.));
259    k += gabor(p, vec4(75445.,144528.,29199.,3583.));
260    k += gabor(p, vec4(66694.,194418.,24581.,5119.));
261    k += gabor(p, vec4(230325.,1590.,13360.,7865.));
262    k += gabor(p, vec4(92351.,97505.,5635.,2956.));
263    k += gabor(p, vec4(75010.,124415.,12335.,7234.));
264    k += gabor(p, vec4(97906.,169101.,54817.,5119.));
265    k += gabor(p, vec4(106161.,83324.,3589.,2713.));
266    k += gabor(p, vec4(113835.,235844.,9225.,3708.));
267    k += gabor(p, vec4(208627.,241050.,10768.,10482.));
268    k += gabor(p, vec4(168661.,177062.,8706.,2559.));
269    k += gabor(p, vec4(181467.,127455.,17938.,7786.));
270    k += gabor(p, vec4(197869.,146292.,28173.,2559.));
271    k += gabor(p, vec4(117558.,187903.,9736.,3285.));
272    k += gabor(p, vec4(222982.,25466.,20483.,3071.));
273    k += gabor(p, vec4(235759.,128791.,8256.,8275.));
274    k += gabor(p, vec4(29057.,162597.,13888.,8215.));
275    k += gabor(p, vec4(190357.,256223.,13345.,4260.));
276    k += gabor(p, vec4(119069.,231138.,8715.,6737.));
277    k += gabor(p, vec4(170876.,121183.,16906.,10329.));
278    k += gabor(p, vec4(154320.,242687.,6147.,3239.));
279    k += gabor(p, vec4(115981.,136703.,12808.,6807.));
280    k += gabor(p, vec4(120081.,193574.,9734.,2257.));
281    k += gabor(p, vec4(134533.,188242.,26635.,1665.));
282    k += gabor(p, vec4(138043.,77525.,7686.,2271.));
283    k += gabor(p, vec4(130835.,198313.,5122.,1988.));
284    k += gabor(p, vec4(102193.,56831.,6148.,1687.));
285    k += gabor(p, vec4(111902.,152880.,20531.,7206.));
286    k += gabor(p, vec4(174288.,78489.,3075.,3151.));
287    k += gabor(p, vec4(96671.,127941.,6669.,4272.));
288    k += gabor(p, vec4(210122.,17650.,13840.,13455.));
289    k += gabor(p, vec4(203063.,194037.,33825.,33307.));
290    k += gabor(p, vec4(149725.,95402.,11796.,11817.));
291    k += gabor(p, vec4(66297.,11373.,17922.,2559.));
292    k += gabor(p, vec4(179440.,110836.,5633.,1319.));
293    k += gabor(p, vec4(43681.,262028.,25090.,3071.));
294    k += gabor(p, vec4(101192.,233983.,8200.,8304.));
295    k += gabor(p, vec4(202536.,155036.,12293.,2559.));
296    k += gabor(p, vec4(197017.,107008.,8719.,2338.));
297    k += gabor(p, vec4(163006.,200413.,3076.,2203.));
298    k += gabor(p, vec4(122700.,196047.,6149.,5280.));
299    k += gabor(p, vec4(138048.,193231.,17925.,1322.));
300    k += gabor(p, vec4(205566.,243712.,10761.,9529.));
301
302    // Don't add speckles in preview!
303    if (iResolution.y >= 200.0) {
304        // borrowed Dave Hoskins' hash from https://www.shadertoy.com/view/4djSRW
305        p = fract(p * vec2(443.8975,397.2973));
306        p += dot(p.xy, p.yx+19.19);
307        k += 0.12 * (fract(p.x * p.y)*2.0 - 1.0);
308    }
309
310    fragColor.xyz = vec3(0.5*k + 0.5);
311}
312
313 void main(void)
314{
315  //just some shit to wrap shadertoy's stuff
316  vec2 FragCoord = vTexCoord.xy*OutputSize.xy;
317  mainImage(FragColor,FragCoord);
318}
319#endif
320