1#version 120 2// Compatibility #ifdefs needed for parameters 3#ifdef GL_ES 4#define COMPAT_PRECISION mediump 5#else 6#define COMPAT_PRECISION 7#endif 8 9// Parameter lines go here: 10#pragma parameter RETRO_PIXEL_SIZE "Retro Pixel Size" 0.84 0.0 1.0 0.01 11#ifdef PARAMETER_UNIFORM 12// All parameter floats need to have COMPAT_PRECISION in front of them 13uniform COMPAT_PRECISION float RETRO_PIXEL_SIZE; 14#else 15#define RETRO_PIXEL_SIZE 0.84 16#endif 17 18#if defined(VERTEX) 19 20#if __VERSION__ >= 130 21#define COMPAT_VARYING out 22#define COMPAT_ATTRIBUTE in 23#define COMPAT_TEXTURE texture 24#else 25#define COMPAT_VARYING varying 26#define COMPAT_ATTRIBUTE attribute 27#define COMPAT_TEXTURE texture2D 28#endif 29 30#ifdef GL_ES 31#define COMPAT_PRECISION mediump 32#else 33#define COMPAT_PRECISION 34#endif 35 36COMPAT_ATTRIBUTE vec4 VertexCoord; 37COMPAT_ATTRIBUTE vec4 COLOR; 38COMPAT_ATTRIBUTE vec4 TexCoord; 39COMPAT_VARYING vec4 COL0; 40COMPAT_VARYING vec4 TEX0; 41// out variables go here as COMPAT_VARYING whatever 42 43vec4 _oPosition1; 44uniform mat4 MVPMatrix; 45uniform COMPAT_PRECISION int FrameDirection; 46uniform COMPAT_PRECISION int FrameCount; 47uniform COMPAT_PRECISION vec2 OutputSize; 48uniform COMPAT_PRECISION vec2 TextureSize; 49uniform COMPAT_PRECISION vec2 InputSize; 50 51// compatibility #defines 52#define vTexCoord TEX0.xy 53#define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize 54#define OutSize vec4(OutputSize, 1.0 / OutputSize) 55 56void main() 57{ 58 gl_Position = MVPMatrix * VertexCoord; 59 TEX0.xy = VertexCoord.xy; 60// Paste vertex contents here: 61} 62 63#elif defined(FRAGMENT) 64 65#if __VERSION__ >= 130 66#define COMPAT_VARYING in 67#define COMPAT_TEXTURE texture 68out vec4 FragColor; 69#else 70#define COMPAT_VARYING varying 71#define FragColor gl_FragColor 72#define COMPAT_TEXTURE texture2D 73#endif 74 75#ifdef GL_ES 76#ifdef GL_FRAGMENT_PRECISION_HIGH 77precision highp float; 78#else 79precision mediump float; 80#endif 81#define COMPAT_PRECISION mediump 82#else 83#define COMPAT_PRECISION 84#endif 85 86uniform COMPAT_PRECISION int FrameDirection; 87uniform COMPAT_PRECISION int FrameCount; 88uniform COMPAT_PRECISION vec2 OutputSize; 89uniform COMPAT_PRECISION vec2 TextureSize; 90uniform COMPAT_PRECISION vec2 InputSize; 91uniform sampler2D Texture; 92COMPAT_VARYING vec4 TEX0; 93// in variables go here as COMPAT_VARYING whatever 94 95// compatibility #defines 96#define Source Texture 97#define vTexCoord TEX0.xy 98 99#define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize 100#define OutSize vec4(OutputSize, 1.0 / OutputSize) 101 102// delete all 'params.' or 'registers.' or whatever in the fragment 103float iGlobalTime = float(FrameCount)*0.025; 104vec2 iResolution = OutputSize.xy; 105 106float zigzag( float x ) 107{ 108 /* float y = mod(x,3.142 ) / 3.142; 109 if ( y > 0.5 ) 110 { 111 return 1.0-(y -0.5)/0.5; 112 } 113 return (y*2.0); */ 114 115 return cos(x); 116} 117 118float box( vec3 position, vec3 lengths, vec3 raypos ) 119{ 120 vec3 p = raypos - position; 121 122 float d0 = max( p.x - lengths.x, -p.x - lengths.x ); 123 float d1 = max( p.y - lengths.y, -p.y - lengths.y ); 124 float d2 = max( p.z - lengths.z, -p.z - lengths.z ); 125 return vec4( max( d0, max(d1,d2 )), 1.0,0, 0.8).x; 126} 127 128float cylinder( vec3 position, vec2 dim, vec3 raypos ) 129{ 130 vec3 p = raypos - position; 131 return max( length( p.zy ) - dim.x, 132 max( p.x - dim.y, -p.x - dim.y)); 133} 134 135 136 137float feature( vec3 position, vec2 dim, vec3 raypos ) 138{ 139 140 // float zoff = float(int(raypos.z / 10.0)); 141 float y = (iGlobalTime*100.0); 142 float x = -zigzag( (y+raypos.z)/100.0 )*40.0; 143 144 position.y -= floor( mod( (raypos.z + y) / 1000.0 , 2.0 )) * 10.0; 145 146 //roadpos.y += iGlobalTime*100.0; 147 //position.x += x; //zigzag( raypos.z/100.0 )*40.0 ; 148 149 //position.x = x; 150 float c0, c1, c2; 151 { 152 vec3 r = vec3( raypos.x, raypos.y, mod( raypos.z + y + 1000.0, 10.0 ) ); 153 // vec3 r = mod( raypos,10.0 ); 154 vec3 p = r - vec3( position.x + x, position.y, position.z ); 155 c0 = max( length( p.zx ) - dim.x, 156 max( p.y - dim.y, -p.y - dim.y)); 157 } 158 159 { 160 vec3 r = vec3( raypos.x, raypos.y, mod( raypos.z + 1000.0 + y, 10.0 ) ); 161 vec3 p = r - vec3( -position.x + x, position.y, position.z ); 162 c1 = max( length( p.zx ) - dim.x, 163 max( p.y - dim.y, -p.y - dim.y)); 164 } 165 166 { 167 vec3 r = vec3( raypos.x, raypos.y, mod( raypos.z + 1000.0 + y, 10.0 ) ); 168 vec3 p = r - vec3( x, position.y + dim.y, position.z ); 169 c2 = max( length( p.zy ) - dim.x * 0.5, 170 max( p.x - 15.0, -p.x - 15.0)); 171 } 172 173 return min( min(c0,c1 ), c2 ); 174} 175 176 177 178vec4 road( vec2 roadpos ) 179{ 180 vec4 surface = vec4( 0.5,0.5,0.5,1.0); 181 182 183 roadpos.y += iGlobalTime*100.0; 184 roadpos.x += zigzag( roadpos.y/100.0 )*40.0 ; 185 vec2 roadabs = abs(roadpos ); 186 187 if ( roadabs.x > 10.0 ) 188 { 189 190 if ( roadabs.x > 12.0) 191 { 192 surface = vec4(0.0,1.0,0.0,1.0 ); 193 } 194 else 195 { 196 float fy = floor( (roadabs.y) / 0.8 ); 197 if ( mod( fy, 2.0 ) == 0.0 ) 198 { 199 surface = vec4( 1,1,1,1.0); 200 } 201 else 202 { 203 surface = vec4( 1.0,0.0,0.0,1.0); 204 } 205 } 206 } 207 else 208 { 209 if ( roadabs.x < 0.1 ) 210 { 211 float fy = floor( (roadabs.y + 2.0 ) / 4.0 ); 212 if ( mod( fy, 2.0 ) == 0.0 ) 213 { 214 surface = vec4( 1,1,1,1.0); 215 } 216 else 217 { 218 surface = vec4( 0.5,0.5,0.5,1.0); 219 } 220 } 221 else 222 { 223 surface = vec4( 0.5,0.5,0.5,1.0); 224 } 225 } 226 227 float fy = floor( roadabs.y / 20.0 ); 228 229 230 231 232 if ( mod( fy, 2.0 ) == 0.0 ) 233 { 234 surface *= 0.8; 235 } 236 237 return surface; 238 239} 240 241float sphere( vec3 spherepos, float r, vec3 raypos ) 242{ 243 return distance( spherepos, raypos ) - r; 244} 245 246vec4 getlight( vec3 normal, vec3 position, vec3 lightpos, vec4 lightcolour ) 247{ 248 vec4 amb = vec4(0.3,0.3,0.3,1.0); 249 float d = distance( position, lightpos ); 250 vec3 n = normalize( position - lightpos ); 251 if ( dot( normal, n ) > 0.5 ) 252 { 253 return lightcolour + amb;; 254 } 255 else if ( dot( normal, n ) > 0.1 ) 256 { 257 return lightcolour * 0.5 + amb;; 258 } 259 260 return amb; 261 262} 263 264 265float smin( float a, float b, float k ) 266{ 267 float res = exp( -k*a ) + exp( -k*b ); 268 float blend = -log( res )/k; 269 return blend; 270} 271 272 273float sdf( vec3 raypos ) 274{ 275#ifdef MOUSE 276 float xpos = iMouse.x / iResolution.x - 0.5 ; 277#else 278 float xpos = 0.0 / iResolution.x - 0.5 ; 279#endif 280 float y = (iGlobalTime-3.0)*100.0; 281 float x = (xpos * 0.0 + zigzag( y/100.0 ))*40.0; 282 //float e = 1.0; //abs( 0.5 + abs( cos( iGlobalTime )) * 3.0 ) ; 283 float sdf0 = cylinder( vec3( x, 0.5, 0.0 ), vec2( 0.49,1.3 ), raypos ); 284 float sdf1 = cylinder( vec3( x, 0.5, 2.0 ), vec2( 0.49,1.2 ), raypos ); 285 float sdf2 = box( vec3( x, 0.7, 1.0 ), vec3( 1.0, 0.5, 1.0), raypos); 286 float sdf3 = feature( vec3(15.0,0,5.0), vec2(1.0,4.0), raypos ); 287 288 return 289 min( sdf3, 290 min( sdf2, 291 min( sdf1, 292 min( sdf0, min(raypos.y, 20.0-raypos.y )) 293 ) 294 ) 295 ); 296 //sphere( vec3( 0,10, 0.0), 2.0, raypos ), e ); 297} 298 299vec4 contact( vec3 position, vec3 normal, float scale ) 300{ 301 float s = sdf( position + normal * scale ); 302 303 if ( s < scale ) 304 { 305 return vec4(0.8,0.8,0.8,1.0); 306 } 307 308 return vec4(1.0,1.0,1.0,1.0); 309 310 311} 312 313vec3 grad( vec3 raypos, float delta ) 314{ 315 float dx = sdf( raypos + vec3( delta, 0,0 ) ) - sdf( raypos - vec3( delta,0,0 ) ); 316 float dy = sdf( raypos + vec3( 0, delta,0 ) ) - sdf( raypos - vec3( 0,delta,0 ) ); 317 float dz = sdf( raypos + vec3( 0,0, delta ) ) - sdf( raypos - vec3( 0,0,delta ) ); 318 return vec3( dx,dy,dz ); 319 //return vec3(0,-1.0,0); 320} 321 322vec4 march( vec3 ray, vec3 origin, float ep, vec2 uv) 323{ 324 vec3 p = origin; 325 //int pscale = int( float(iFrameRate) / 60.0 * 1024.0); 326 for ( int i = 0; i < 256; i++ ) 327 { 328 /* if ( i == pscale ) 329 { 330 break; 331 } */ 332 float step = sdf(p); 333 if ( step < ep ) 334 { 335 if ( p.y > 19.0 ) 336 { 337 return vec4( 0.3,0.3,1.0,1.0) * ( (uv.y - 0.5) / 0.5 ) + 338 vec4( 1.0,1.0,1.0,1.0) * (1.0 - ( (uv.y-0.5) / 0.5 )) ; 339 } 340 else if ( p.y > ep ) 341 { 342 vec3 normal = normalize( grad( p, 0.1 ) ); 343 return getlight( normal, p, vec3( 500 ,0,1000 ), vec4(1.0, 1.0, 1.0, 0 )); 344 //getlight( normal, p, vec3( -100,-100,-100 ), vec4(0.0,1.0,1.0,1.0 )) ; 345 } 346 347 else 348 { 349 return road( vec2( p.x, p.z ) ) * contact( p, vec3(0.0,1.0,0.0), 0.25 ); 350 } 351 } 352 353 p += ray * step; 354 } 355 356 if ( ray.y < 0.0 ) 357 { 358 vec3 h = ray * -origin.y / ray.y + origin; 359 return road( vec2( h.x, h.z ) ) * contact( p, vec3(0.0,1.0,0.0), 0.25 ); 360 } 361 else 362 { 363 364 return vec4( 0.3,0.3,1.0,1.0) * ( (uv.y - 0.5) / 0.5 ) + 365 vec4( 1.0,1.0,1.0,1.0) * (1.0 - ( (uv.y-0.5) / 0.5 )) ; 366 } 367} 368 369vec3 rotatevecY( vec3 vec, float angle ) 370{ 371 vec3 m0 = vec3( -cos( angle ), 0, sin( angle )); 372 vec3 m1 = vec3( 0 , 1.0, 0 ); 373 vec3 m2 = vec3( sin( angle ), 0, cos( angle ) ); 374 375 return vec3( dot( m0, vec ), dot( m1, vec ), dot( m2, vec )) ; 376} 377 378 379void mainImage( out vec4 fragColor, in vec2 fragCoord ) 380{ 381 vec2 uv = fragCoord.xy / iResolution.xy; 382 383 /*if ( uv.y > 0.8 ) 384 { 385 fragColor = vec4( 0.3,0.3,1.0,1.0) * ( (uv.y - 0.5) / 0.5 ) + 386 vec4( 1.0,1.0,1.0,1.0) * (1.0 - ( (uv.y-0.5) / 0.5 )) ; 387 } 388 else */ 389 { 390 float aspect = iResolution.y / iResolution.x; 391 392 vec3 origin = vec3(0.0, 2.0,-5.0 ); 393 vec3 ray = vec3( uv.x - 0.5, (uv.y - 0.5) * aspect, 0.5 ); 394 395 396 float y = (iGlobalTime-0.0)*100.0; 397 float x = zigzag( y/100.0 )*40.0; 398 399 ray = rotatevecY( ray, x/80.0 ); 400 origin.x += x; 401 origin = rotatevecY( origin, 0.0 ); 402 403 fragColor = march( ray, origin, 0.01, uv ); 404 405 //float y = (iGlobalTime-0.0)*100.0; 406 //float x = zigzag( y/100.0 )*40.0; 407 408 //vec2 vp = uv - vec2(0.5,0.5 ); 409 //vec2 rp = vec2( -x + vp.x / -vp.y * 5.0, 5.0 / -vp.y ); 410 411 //fragColor = road( rp); 412 } 413} 414 415 void main(void) 416{ 417 //just some shit to wrap shadertoy's stuff 418 vec2 FragCoord = vTexCoord.xy*OutputSize.xy; 419 mainImage(FragColor,FragCoord); 420} 421#endif 422