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