#version 450 // Created by inigo quilez - iq/2013 // License Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License. // A port of my 2007 demo Kindernoiser: https://www.youtube.com/watch?v=9AX8gNyrSWc (http://www.pouet.net/prod.php?which=32549) // // More info here: http://iquilezles.org/www/articles/juliasets3d/juliasets3d.htm layout(std140, set = 0, binding = 0) uniform UBO { mat4 MVP; vec4 OutputSize; vec4 OriginalSize; vec4 SourceSize; uint FrameCount; } global; #pragma stage vertex layout(location = 0) in vec4 Position; layout(location = 1) in vec2 TexCoord; layout(location = 0) out vec2 vTexCoord; const vec2 madd = vec2(0.5, 0.5); void main() { gl_Position = global.MVP * Position; vTexCoord = gl_Position.xy; } #pragma stage fragment layout(location = 0) in vec2 vTexCoord; layout(location = 0) out vec4 FragColor; float iGlobalTime = float(global.FrameCount)*0.025; vec2 iResolution = global.OutputSize.xy; // antialias level (1, 2, 3...) #define AA 1 float map( in vec3 p, out vec4 oTrap, in vec4 c ) { vec4 z = vec4(p,0.0); float md2 = 1.0; float mz2 = dot(z,z); vec4 trap = vec4(abs(z.xyz),dot(z,z)); for( int i=0; i<11; i++ ) { // |dz|^2 -> 4*|dz|^2 md2 *= 4.0*mz2; // z -> z2 + c z = vec4( z.x*z.x-dot(z.yzw,z.yzw), 2.0*z.x*z.yzw ) + c; trap = min( trap, vec4(abs(z.xyz),dot(z,z)) ); mz2 = dot(z,z); if(mz2>4.0) break; } oTrap = trap; return 0.25*sqrt(mz2/md2)*log(mz2); } // analytic normal for quadratic formula vec3 calcNormal( in vec3 p, in vec4 c ) { vec4 z = vec4(p,0.0); vec4 dz0 = vec4(1.0,0.0,0.0,0.0); vec4 dz1 = vec4(0.0,1.0,0.0,0.0); vec4 dz2 = vec4(0.0,0.0,1.0,0.0); vec4 dz3 = vec4(0.0,0.0,0.0,1.0); for(int i=0;i<11;i++) { vec4 mz = vec4(z.x,-z.y,-z.z,-z.w); // derivative dz0 = vec4(dot(mz,dz0),z.x*dz0.yzw+dz0.x*z.yzw); dz1 = vec4(dot(mz,dz1),z.x*dz1.yzw+dz1.x*z.yzw); dz2 = vec4(dot(mz,dz2),z.x*dz2.yzw+dz2.x*z.yzw); dz3 = vec4(dot(mz,dz3),z.x*dz3.yzw+dz3.x*z.yzw); z = vec4( dot(z, mz), 2.0*z.x*z.yzw ) + c; if( dot(z,z)>4.0 ) break; } return normalize(vec3(dot(z,dz0), dot(z,dz1), dot(z,dz2))); } float intersect( in vec3 ro, in vec3 rd, out vec4 res, in vec4 c ) { vec4 tmp; float resT = -1.0; float maxd = 10.0; float h = 1.0; float t = 0.0; for( int i=0; i<150; i++ ) { if( h<0.002||t>maxd ) break; h = map( ro+rd*t, tmp, c ); t += h; } if( t