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#define PI 3.14159 106 107mat3 xrot(float t) 108{ 109 return mat3(1.0, 0.0, 0.0, 110 0.0, cos(t), -sin(t), 111 0.0, sin(t), cos(t)); 112} 113 114mat3 yrot(float t) 115{ 116 return mat3(cos(t), 0.0, -sin(t), 117 0.0, 1.0, 0.0, 118 sin(t), 0.0, cos(t)); 119} 120 121mat3 zrot(float t) 122{ 123 return mat3(cos(t), -sin(t), 0.0, 124 sin(t), cos(t), 0.0, 125 0.0, 0.0, 1.0); 126} 127 128float sdBox( vec3 p, vec3 b ) 129{ 130 vec3 d = abs(p) - b; 131 return min(max(d.x,max(d.y,d.z)),0.0) + 132 length(max(d,0.0)); 133} 134 135float map(vec3 pos) 136{ 137 float speed = 1.0; 138 vec3 grid = floor(pos); 139 vec3 gmod = mod(grid, 2.0); 140 vec3 rmod = mod(grid, 4.0) - 2.0; 141 float tm = fract(iGlobalTime * speed); 142 rmod *= (cos(tm*PI)-1.0); 143 144 float g = floor(mod(iGlobalTime*speed,3.0)); 145 if (g==0.0){ 146 if (gmod.y*gmod.x==1.0) { 147 pos.z += rmod.x*rmod.y*0.5; 148 } 149 } else if (g==1.0){ 150 if (gmod.y*gmod.z==1.0) { 151 pos.x += rmod.y; 152 } 153 } else if (g==2.0){ 154 if (gmod.z==0.0) { 155 pos.y += rmod.z*rmod.x*0.5; 156 } 157 } 158 159 grid = floor(pos); 160 pos = pos - grid; 161 pos = pos * 2.0 - 1.0; 162 163 float len = 0.9; 164 165 float d = sdBox(pos,vec3(len)); 166 167 bool skip = false; 168 169 if (mod(grid.x,2.0)==0.0 && mod(grid.y,2.0)==0.0) { 170 skip = true; 171 } 172 173 if (mod(grid.x,2.0)==0.0 && mod(grid.z,2.0)==0.0) { 174 skip = true; 175 } 176 177 if (mod(grid.y,2.0)==0.0 && mod(grid.z,2.0)==1.0) { 178 skip = true; 179 } 180 181 if (skip) { 182 d = 100.0; 183 vec3 off = vec3(2.0,0.0,0.0); 184 for (int i = 0; i < 3; ++i) { 185 float a = sdBox(pos + off,vec3(len)); 186 float b = sdBox(pos - off,vec3(len)); 187 d = min(d,min(a,b)); 188 off = off.zxy; 189 } 190 d *= 0.5; 191 } else { 192 d *= 0.8; 193 } 194 195 return d; 196} 197 198vec3 surfaceNormal(vec3 pos) { 199 vec3 delta = vec3(0.01, 0.0, 0.0); 200 vec3 normal; 201 normal.x = map(pos + delta.xyz) - map(pos - delta.xyz); 202 normal.y = map(pos + delta.yxz) - map(pos - delta.yxz); 203 normal.z = map(pos + delta.zyx) - map(pos - delta.zyx); 204 return normalize(normal); 205} 206 207float aoc(vec3 origin, vec3 ray) 208{ 209 float delta = 0.05; 210 const int samples = 8; 211 float r = 0.0; 212 for (int i = 1; i <= samples; ++i) { 213 float t = delta * float(i); 214 vec3 pos = origin + ray * t; 215 float dist = map(pos); 216 float len = abs(t - dist); 217 r += len * pow(2.0, -float(i)); 218 } 219 return r; 220} 221 222void mainImage( out vec4 fragColor, in vec2 fragCoord ) 223{ 224 vec2 uv = fragCoord.xy / iResolution.xy; 225 uv = uv * 2.0 - 1.0; 226 uv.x *= iResolution.x / iResolution.y; 227 228 vec3 eye = normalize(vec3(uv, 1.0 - dot(uv,uv) * 0.33)); 229 vec3 origin = vec3(0.0); 230 231 eye = eye * yrot(iGlobalTime) * xrot(iGlobalTime); 232 233 float speed = 0.5; 234 235 float j = iGlobalTime * speed; 236 237 float f = fract(j); 238 float g = 1.0 - f; 239 f = f*f * g + (1.0-g*g) * f; 240 f = f * 2.0 - 1.0; 241 float a = floor(j) + f * floor(mod(j,2.0)); 242 float b = floor(j) + f * floor(mod(j+1.0,2.0)); 243 244 origin.x += 0.5 + a; 245 origin.y += 0.5; 246 origin.z += 0.5 + b; 247 248 float t = 0.0; 249 float d = 0.0; 250 251 for (int i = 0; i < 32; ++i){ 252 vec3 pos = origin + eye * t; 253 d = map(pos); 254 t += d; 255 } 256 257 vec3 worldPos = origin + eye * t; 258 259 vec3 norm = surfaceNormal(worldPos); 260 261 float prod = max(0.0, dot(norm, -eye)); 262 263 float amb = 0.0;//aoc(worldPos, -eye); 264 265 vec3 ref = reflect(eye, norm); 266 267 vec3 spec = vec3(0.0);//texture(iChannel0, ref).xyz; 268 269 prod = pow(1.0 - prod, 2.0); 270 271 vec3 col = vec3(0.1, 0.3, 0.5); 272 273 spec *= col; 274 275 col = mix(col, spec, prod); 276 277 float shade = pow(max(1.0 - amb, 0.0), 4.0); 278 279 float fog = 1.0 / (1.0 + t * t * 0.2) * shade; 280 281 vec3 final = col; 282 283 final = mix(final, vec3(1.0), fog); 284 285 fog = 1.0 / (1.0 + t * t * 0.1); 286 287 fragColor = vec4(final*fog,0.0); 288} 289 290 void main(void) 291{ 292 //just some shit to wrap shadertoy's stuff 293 vec2 FragCoord = vTexCoord.xy*OutputSize.xy; 294 mainImage(FragColor,FragCoord); 295} 296#endif 297