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//kirby jump 106// fizzer 2018-01-31 107// https://www.shadertoy.com/view/lt2fD3 108 109// polynomial smooth min (from IQ) 110float smin( float a, float b, float k ) 111{ 112 float h = clamp( 0.5+0.5*(b-a)/k, 0.0, 1.0 ); 113 return mix( b, a, h ) - k*h*(1.0-h); 114} 115 116 117float smax(float a,float b, float k) 118{ 119 return -smin(-a,-b,k); 120} 121 122mat2 rotmat(float a) 123{ 124 return mat2(cos(a),sin(a),-sin(a),cos(a)); 125} 126 127float shoesDist(vec3 p) 128{ 129 vec3 op=p; 130 float d=1e4; 131 132 p.y-=1.5; 133 134 // right shoe 135 op=p; 136 p-=vec3(-.5,-.6,-.9); 137 p.yz=rotmat(-.7)*p.yz; 138 p.xz=rotmat(0.1)*p.xz; 139 d=min(d,-smin(p.y,-(length(p*vec3(1.6,1,1))-.64),.2)); 140 p=op; 141 142 // left shoe 143 op=p; 144 p-=vec3(.55,-.8,0.4); 145 p.x=-p.x; 146 p.yz=rotmat(1.4)*p.yz; 147 d=min(d,-smin(p.y,-(length(p*vec3(1.6,1,1))-.73),.2)); 148 p=op; 149 return d; 150} 151 152float sceneDist(vec3 p) 153{ 154 vec3 op=p; 155 float d=shoesDist(p); 156 157 d=min(d,p.y); 158 p.y-=1.5; 159 160 // torso 161 d=min(d,length(p)-1.); 162 163 164 // left arm 165 op=p; 166 p-=vec3(.66,.7,0); 167 p.xz=rotmat(-0.1)*p.xz; 168 d=smin(d,(length(p*vec3(1.8,1,1))-.58),.07); 169 p=op; 170 171 // right arm 172 op=p; 173 p-=vec3(-.75,0.2,0); 174 d=smin(d,(length(p*vec3(1,1.5,1))-.54),.03); 175 p=op; 176 177 // mouth 178 p.y-=.11; 179 float md=smax(p.z+.84,smax(smax(p.x-.2,p.y-.075,.2),dot(p,vec3(.7071,-.7071,0))-.1,.08),.04); 180 p.x=-p.x; 181 md=smax(md,smax(p.z+.84,smax(smax(p.x-.2,p.y-.075,.2),dot(p,vec3(.7071,-.7071,0))-.1,.08),.01),.13); 182 d=smax(d,-md,.012); 183 184 // tongue 185 p=op; 186 d=smin(d,length((p-vec3(0,.03,-.75))*vec3(1,1,1))-.16,.01); 187 188 return min(d,10.); 189} 190 191 192 193vec3 sceneNorm(vec3 p) 194{ 195 vec3 e=vec3(1e-3,0,0); 196 float d = sceneDist(p); 197 return normalize(vec3(sceneDist(p + e.xyy) - sceneDist(p - e.xyy), sceneDist(p + e.yxy) - sceneDist(p - e.yxy), 198 sceneDist(p + e.yyx) - sceneDist(p - e.yyx))); 199} 200 201 202// from simon green and others 203float ambientOcclusion(vec3 p, vec3 n) 204{ 205 const int steps = 4; 206 const float delta = 0.15; 207 208 float a = 0.0; 209 float weight = 4.; 210 for(int i=1; i<=steps; i++) { 211 float d = (float(i) / float(steps)) * delta; 212 a += weight*(d - sceneDist(p + n*d)); 213 weight *= 0.5; 214 } 215 return clamp(1.0 - a, 0.0, 1.0); 216} 217 218// a re-shaped cosine, to make the peaks more pointy 219float cos2(float x){return cos(x-sin(x)/3.);} 220 221float starShape(vec2 p) 222{ 223 float a=atan(p.y,p.x)+iGlobalTime/3.; 224 float l=pow(length(p),.8); 225 float star=1.-smoothstep(0.,(3.-cos2(a*5.*2.))*.02,l-.5+cos2(a*5.)*.1); 226 return star; 227} 228 229 230void mainImage( out vec4 fragColor, in vec2 fragCoord ) 231{ 232 // Normalized pixel coordinates (from 0 to 1) 233 vec2 uv = fragCoord/iResolution.xy; 234 235 float an=cos(iGlobalTime)*.1; 236 237 vec2 ot=uv*2.-1.; 238 ot.y*=iResolution.y/iResolution.x; 239 vec3 ro=vec3(0.,1.4,4.); 240 vec3 rd=normalize(vec3(ot.xy,-1.3)); 241 242 rd.xz=mat2(cos(an),sin(an),sin(an),-cos(an))*rd.xz; 243 ro.xz=mat2(cos(an),sin(an),sin(an),-cos(an))*ro.xz; 244 245 float s=20.; 246 247 // primary ray 248 float t=0.,d=0.; 249 for(int i=0;i<80;++i) 250 { 251 d=sceneDist(ro+rd*t); 252 if(d<1e-4) 253 break; 254 if(t>10.) 255 break; 256 t+=d*.9; 257 } 258 259 t=min(t,10.0); 260 261 // shadow ray 262 vec3 rp=ro+rd*t; 263 vec3 n=sceneNorm(rp); 264 float st=5e-3; 265 vec3 ld=normalize(vec3(2,4,-4)); 266 for(int i=0;i<20;++i) 267 { 268 d=sceneDist(rp+ld*st); 269 if(d<1e-5) 270 break; 271 if(st>5.) 272 break; 273 st+=d*2.; 274 } 275 276 // ambient occlusion and shadowing 277 vec3 ao=vec3(ambientOcclusion(rp, n)); 278 float shad=mix(.85,1.,step(5.,st)); 279 280 ao*=mix(.3,1.,.5+.5*n.y); 281 282 // soft floor shadow 283 if(rp.y<1e-3) 284 ao*=mix(mix(vec3(1,.5,.7),vec3(1),.4)*.6,vec3(1),smoothstep(0.,1.6,length(rp.xz))); 285 286 287 288 vec3 diff=vec3(1); 289 vec3 emit=vec3(0); 290 291 // skin 292 diff*=vec3(1.15,.3,.41)*1.4; 293 diff+=.4*mix(1.,0.,smoothstep(0.,1.,length(rp.xy-vec2(0.,1.9)))); 294 diff+=.5*mix(1.,0.,smoothstep(0.,.5,length(rp.xy-vec2(.7,2.5)))); 295 diff+=.36*mix(1.,0.,smoothstep(0.,.5,length(rp.xy-vec2(-1.1,1.8)))); 296 297 if(rp.y<1e-3) 298 diff=vec3(.6,1,.6); 299 300 // mouth 301 diff*=mix(vec3(1,.3,.2),vec3(1),smoothstep(.97,.99,length(rp-vec3(0,1.5,0)))); 302 303 // shoes 304 diff=mix(vec3(1.,.05,.1),diff,smoothstep(0.,0.01,shoesDist(rp))); 305 diff+=.2*mix(1.,0.,smoothstep(0.,.2,length(rp.xy-vec2(-0.5,1.4)))); 306 diff+=.12*mix(1.,0.,smoothstep(0.,.25,length(rp.xy-vec2(0.57,.3)))); 307 308 // bounce light from the floor 309 diff+=vec3(.25,1.,.25)*smoothstep(-.3,1.7,-rp.y+1.)*max(0.,-n.y)*.7; 310 311 vec3 orp=rp; 312 rp.y-=1.5; 313 rp.x=abs(rp.x); 314 315 // blushes 316 diff*=mix(vec3(1,.5,.5),vec3(1),smoothstep(.1,.15,length((rp.xy-vec2(.4,.2))*vec2(1,1.65)))); 317 318 rp.xy-=vec2(.16,.45); 319 rp.xy*=.9; 320 orp=rp; 321 rp.y=pow(abs(rp.y),1.4)*sign(rp.y); 322 323 // eye outline 324 diff*=smoothstep(.058,.067,length((rp.xy)*vec2(.9,.52))); 325 326 rp=orp; 327 rp.y+=.08; 328 rp.y-=pow(abs(rp.x),2.)*16.; 329 330 // eye reflections 331 emit+=vec3(.1,.5,1.)*(1.-smoothstep(.03,.036,length((rp.xy)*vec2(.7,.3))))*max(0.,-rp.y)*10.; 332 333 rp=orp; 334 rp.y-=.12; 335 336 // eye highlights 337 emit+=vec3(1)*(1.-smoothstep(.03,.04,length((rp.xy)*vec2(1.,.48)))); 338 339 // fresnel 340 diff+=pow(clamp(1.-dot(-rd,n),0.,.9),4.)*.5; 341 342 // background and floor fade 343 vec3 backg=vec3(1.15,.3,.41)*.9; 344 ot.x+=.6+iGlobalTime/50.; 345 ot.y+=cos(floor(ot.x*2.)*3.)*.1+.2; 346 ot.x=mod(ot.x,.5)-.25; 347 backg=mix(backg,vec3(1.,1.,.5),.1*starShape((ot-vec2(0.,.6))*8.)*smoothstep(9.,10.,t)); 348 diff=mix(diff,backg,smoothstep(.9,10.,t)); 349 350 fragColor.rgb=mix(vec3(.15,0,0),vec3(1),ao)*shad*diff*1.1; 351 fragColor.rgb+=emit; 352 fragColor.a = 1.0f; 353 354 fragColor.rgb=pow(fragColor.rgb,vec3(1./2.4)); 355} 356 357 void main(void) 358{ 359 //just some shit to wrap shadertoy's stuff 360 vec2 FragCoord = vTexCoord.xy*OutputSize.xy; 361 mainImage(FragColor,FragCoord); 362} 363#endif 364