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// Created by inigo quilez - iq/2013 106// License Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License. 107 108// A port of my 2007 demo Kindernoiser: https://www.youtube.com/watch?v=9AX8gNyrSWc (http://www.pouet.net/prod.php?which=32549) 109// 110// More info here: http://iquilezles.org/www/articles/juliasets3d/juliasets3d.htm 111 112// antialias level (1, 2, 3...) 113#define AA 1 114 115float map( in vec3 p, out vec4 oTrap, in vec4 c ) 116{ 117 vec4 z = vec4(p,0.0); 118 float md2 = 1.0; 119 float mz2 = dot(z,z); 120 121 vec4 trap = vec4(abs(z.xyz),dot(z,z)); 122 123 for( int i=0; i<11; i++ ) 124 { 125 // |dz|^2 -> 4*|dz|^2 126 md2 *= 4.0*mz2; 127 128 // z -> z2 + c 129 z = vec4( z.x*z.x-dot(z.yzw,z.yzw), 130 2.0*z.x*z.yzw ) + c; 131 132 trap = min( trap, vec4(abs(z.xyz),dot(z,z)) ); 133 134 mz2 = dot(z,z); 135 if(mz2>4.0) break; 136 } 137 138 oTrap = trap; 139 140 return 0.25*sqrt(mz2/md2)*log(mz2); 141} 142 143// analytic normal for quadratic formula 144vec3 calcNormal( in vec3 p, in vec4 c ) 145{ 146 vec4 z = vec4(p,0.0); 147 148 vec4 dz0 = vec4(1.0,0.0,0.0,0.0); 149 vec4 dz1 = vec4(0.0,1.0,0.0,0.0); 150 vec4 dz2 = vec4(0.0,0.0,1.0,0.0); 151 vec4 dz3 = vec4(0.0,0.0,0.0,1.0); 152 153 for(int i=0;i<11;i++) 154 { 155 vec4 mz = vec4(z.x,-z.y,-z.z,-z.w); 156 157 // derivative 158 dz0 = vec4(dot(mz,dz0),z.x*dz0.yzw+dz0.x*z.yzw); 159 dz1 = vec4(dot(mz,dz1),z.x*dz1.yzw+dz1.x*z.yzw); 160 dz2 = vec4(dot(mz,dz2),z.x*dz2.yzw+dz2.x*z.yzw); 161 dz3 = vec4(dot(mz,dz3),z.x*dz3.yzw+dz3.x*z.yzw); 162 163 z = vec4( dot(z, mz), 2.0*z.x*z.yzw ) + c; 164 165 if( dot(z,z)>4.0 ) break; 166 } 167 168 return normalize(vec3(dot(z,dz0), 169 dot(z,dz1), 170 dot(z,dz2))); 171} 172 173float intersect( in vec3 ro, in vec3 rd, out vec4 res, in vec4 c ) 174{ 175 vec4 tmp; 176 float resT = -1.0; 177 float maxd = 10.0; 178 float h = 1.0; 179 float t = 0.0; 180 for( int i=0; i<150; i++ ) 181 { 182 if( h<0.002||t>maxd ) break; 183 h = map( ro+rd*t, tmp, c ); 184 t += h; 185 } 186 if( t<maxd ) { resT=t; res = tmp; } 187 188 return resT; 189} 190 191float softshadow( in vec3 ro, in vec3 rd, float mint, float k, in vec4 c ) 192{ 193 float res = 1.0; 194 float t = mint; 195 for( int i=0; i<64; i++ ) 196 { 197 vec4 kk; 198 float h = map(ro + rd*t, kk, c); 199 res = min( res, k*h/t ); 200 if( res<0.001 ) break; 201 t += clamp( h, 0.01, 0.5 ); 202 } 203 return clamp(res,0.0,1.0); 204} 205 206vec3 render( in vec3 ro, in vec3 rd, in vec4 c ) 207{ 208 vec3 light1 = vec3( 0.577, 0.577, 0.577 ); 209 vec3 light2 = vec3( -0.707, 0.000, -0.707 ); 210 211 vec4 tra; 212 vec3 col; 213 float t = intersect( ro, rd, tra, c ); 214 if( t < 0.0 ) 215 { 216 col = vec3(0.8,0.9,1.0)*(0.7+0.3*rd.y); 217 col += vec3(0.8,0.7,0.5)*pow( clamp(dot(rd,light1),0.0,1.0), 48.0 ); 218 } 219 else 220 { 221 col = vec3(1.0,0.8,0.7)*0.3; 222 223 vec3 pos = ro + t*rd; 224 vec3 nor = calcNormal( pos, c ); 225 vec3 ref = reflect( rd, nor ); 226 227 float dif1 = clamp( dot( light1, nor ), 0.0, 1.0 ); 228 float dif2 = clamp( 0.5 + 0.5*dot( light2, nor ), 0.0, 1.0 ); 229 float occ = clamp(2.5*tra.w-0.15,0.0,1.0); 230 float sha = softshadow( pos, light1, 0.001, 64.0, c ); 231 float fre = pow( clamp( 1.+dot(rd,nor), 0.0, 1.0 ), 2.0 ); 232 233 vec3 lin = 1.5*vec3(0.15,0.20,0.25)*(0.6+0.4*nor.y)*(0.1+0.9*occ); 234 lin += 3.5*vec3(1.00,0.90,0.70)*dif1*sha; 235 lin += 1.5*vec3(0.14,0.14,0.14)*dif2*occ; 236 lin += 0.3*vec3(1.00,0.80,0.60)*fre*(0.5+0.5*occ); 237 238 col *= lin; 239 col += pow( clamp( dot( ref, light1 ), 0.0, 1.0 ), 32.0 )*dif1*sha; 240 col += 0.1*vec3(0.8,0.9,1.0)*smoothstep( 0.0, 0.1, ref.y )*occ*(0.5+0.5*nor.y); 241 } 242 243 return pow( col, vec3(0.4545) ); 244} 245 246void mainImage( out vec4 fragColor, in vec2 fragCoord ) 247{ 248 // anim 249 float time = iGlobalTime*.15; 250 vec4 c = 0.4*cos( vec4(0.5,3.9,1.4,1.1) + time*vec4(1.2,1.7,1.3,2.5) ) - vec4(0.3,0.0,0.0,0.0); 251 252 // camera 253 float r = 1.4+0.15*cos(0.0+0.29*time); 254 vec3 ro = vec3( r*cos(0.3+0.37*time), 255 0.3 + 0.8*r*cos(1.0+0.33*time), 256 r*cos(2.2+0.31*time) ); 257 vec3 ta = vec3(0.0,0.0,0.0); 258 float cr = 0.1*cos(0.1*time); 259 260 261 // render 262 vec3 col = vec3(0.0); 263 for( int j=0; j<AA; j++ ) 264 for( int i=0; i<AA; i++ ) 265 { 266 vec2 p = (-iResolution.xy + 2.0*(fragCoord + vec2(float(i),float(j))/float(AA))) / iResolution.y; 267 268 vec3 cw = normalize(ta-ro); 269 vec3 cp = vec3(sin(cr), cos(cr),0.0); 270 vec3 cu = normalize(cross(cw,cp)); 271 vec3 cv = normalize(cross(cu,cw)); 272 vec3 rd = normalize( p.x*cu + p.y*cv + 2.0*cw ); 273 274 col += render( ro, rd, c ); 275 } 276 col /= float(AA*AA); 277 278 vec2 uv = fragCoord.xy / iResolution.xy; 279 col *= 0.7 + 0.3*pow(16.0*uv.x*uv.y*(1.0-uv.x)*(1.0-uv.y),0.25); 280 281 fragColor = vec4( col, 1.0 ); 282} 283 284 void main(void) 285{ 286 //just some shit to wrap shadertoy's stuff 287 vec2 FragCoord = vTexCoord.xy*OutputSize.xy; 288 mainImage(FragColor,FragCoord); 289} 290#endif 291