From fea4454b44721ba5ad2abe9608a8ff5aa279d056 Mon Sep 17 00:00:00 2001 From: Laurent Le Brun Date: Wed, 22 Feb 2023 00:49:30 +0100 Subject: [PATCH 1/9] Old-movie style This is a quick test for an old-movie postprocessing. Code was not cleaned up. The binary is 6087 bytes, but could be reduced easily (e.g. simplify the texture code and parts of the rendering). - Switch to monochrome - Add noise, lines, and blotches (derived https://www.shadertoy.com/view/Xdl3D8) - Move randomly the image - Add stronger vignetting - Disable specular light and sss - Set the animation to 14 FPS --- Intro/src/shaders/mouton.frag | 9 +- Intro/src/shaders/mouton.frag.klproj | Bin 0 -> 17190 bytes Intro/src/shaders/mouton.vert | 3 +- Intro/src/shaders/postprocess.frag | 112 +++- Intro/src/shaders/shaders.inl | 753 ++++++++++++++------------- 5 files changed, 514 insertions(+), 363 deletions(-) create mode 100644 Intro/src/shaders/mouton.frag.klproj diff --git a/Intro/src/shaders/mouton.frag b/Intro/src/shaders/mouton.frag index d5b0934..e8467b1 100644 --- a/Intro/src/shaders/mouton.frag +++ b/Intro/src/shaders/mouton.frag @@ -131,7 +131,7 @@ vec2 anvil(vec3 p) { } vec2 flower(vec3 p) { - + float iTime = int(iTime * 12) / 12.; p -= flowerPos; vec3 pr = p; pr.x += cos(3.1*.25+iTime)*3.1*.2; @@ -197,6 +197,7 @@ vec2 panelWarning(vec3 p) { // return [distance, material] vec2 sheep(vec3 p) { p -= sheepPos; + float iTime = int(iTime * 12) / 12.; float time = mod(iTime, 1.); time = smoothstep(0., 1., abs(time * 2. - 1.)); @@ -350,6 +351,7 @@ vec3 skyColor(vec3 rd, vec2 uv, float night) { col = vec3(1.) * night * night; + float iTime = int(iTime * 12) / 12.; // mon vec2 moonPos = vec2(cos(iTime*.7+2.4), sin(iTime*.7+2.4)*.75 ); float moon = smoothstep(0.151,0.15, length(uv-moonPos)); @@ -623,6 +625,11 @@ vec3 shade(vec3 ro, vec3 rd, vec3 p, vec3 n, vec2 uv) { spe = pow(spe, vec3(4.))*fre*.02; } + sss = vec3(0.); + spe = vec3(0.); + //emi = vec3(0.); + //bnc = vec3(0.); + // diff = mix(diff, vec3(1.), 0.2); // vec3(1.); vec3 col = (albedo * (amb*1. + diff*.5 + bnc*2. + sss*2. ) + spe*shad + emi) * night;//* (saturate(sunDir.y)*.95+.05); //col = diff;//diff + bnc + amb + sss; //col = albedo * spe; diff --git a/Intro/src/shaders/mouton.frag.klproj b/Intro/src/shaders/mouton.frag.klproj new file mode 100644 index 0000000000000000000000000000000000000000..0daa5af0db910fa911269a2325d00bbf2273905c GIT binary patch literal 17190 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 0.2) + l = pow( abs(a * uv.x + b * uv.y + c ), 1.0/16.0 ); + else + l = 2.0 - pow( abs(a * uv.x + b * uv.y + c), 1.0/8.0 ); + + return mix(0.5, 1.0, l); +} + +// Generate some blotches. +float randomBlotch(float seed) +{ + float x = rand(seed); + float y = rand(seed+1.0); + float s = 0.01 * rand(seed+2.0); + + vec2 p = vec2(x,y) - uv; + p.x *= iResolution.x / iResolution.y; + float a = atan(p.y,p.x); + float v = 1.0; + float ss = s*s * (sin(6.2831*a*x)*0.1 + 1.0); + + if ( dot(p,p) < ss ) v = 0.2; + else + v = pow(dot(p,p) - ss, 1.0/16.0); + + return mix(0.3 + 0.2 * (1.0 - (s / 0.02)), 1.0, v); +} + + void main(void) { + // Set frequency of global effect (12 / second). + float t = float(int(iTime * 12)); + vec2 invRes = 1./iResolution; - vec2 uv = gl_FragCoord.xy * invRes; - vec2 offset = (uv*2.-1.)*invRes.x*.5; + uv = gl_FragCoord.xy * invRes; + // Jumping image + if (rand(t) < .01) uv += vec2(0.1); + // Get some image movement + vec2 suv = uv + 0.004 * vec2( rand(t), rand(t + 23.0)); + vec2 offset = (suv*2.-1.)*invRes.x*.5; + // chromatic aberration - vec3 col; - col.r = texture(prevPass,uv+offset).r; - col.g = texture(prevPass,uv).g; - col.b = texture(prevPass,uv-offset).b; + vec3 col = texture(prevPass,suv+offset).rgb; + + + //col.r = texture(prevPass,suv+offset).r; + //col.g = texture(prevPass,suv).g; + //col.b = texture(prevPass,suv-offset).b; // filmic grain /* @@ -76,13 +134,14 @@ void main(void) // fade in col *= smoothstep(0.,10., iTime); - const float endTime = 156.; + const float endTime = 160.; + { // Circle to black float circle = length(gl_FragCoord.xy/iResolution.xx - vec2(.5,.3)); - float t = max(.137, smoothstep(endTime+1., endTime, iTime)); - col *= smoothstep(t, t-.005, circle); - + float t2 = max(.137, smoothstep(endTime+1., endTime, iTime)); + col *= smoothstep(t2, t2-.005, circle); + // Looney tunes float f = circle; float alpha = smoothstep(0.135, .136, f) * smoothstep(endTime+1., endTime+2., iTime); @@ -90,8 +149,39 @@ void main(void) f -= smoothstep(0.95, 0.99, f); vec3 col2 = mix(vec3(1.,.6,.0), vec3(1.,.0,0.), pow(f,1.)); col = mix(col, col2, alpha); + } + // Create a time-varying vignetting effect + float vI = 16.0 * (uv.x * (1.0-uv.x) * uv.y * (1.0-uv.y)); + vI *= mix( 0.7, 1.0, rand(t + 0.5)); + + // Add additive flicker + //vI += 0. + 0.2 * rand(t+8.); + + // Add a fixed vignetting (independent of the flicker) + vI *= pow(16.0 * uv.x * (1.0-uv.x) * uv.y * (1.0-uv.y), 0.14); + + int l = int(8.0 * rand(t+7.0)); + int s = int( max(8.0 * rand(t+18.0) -2.0, 0.0 )); + for (int i = 1; i < 8; i++) { + if ( i < l ) vI *= randomLine( t+6.0+17.* i); + if ( i < s ) vI *= randomBlotch( t+6.0+19.* i); + } + + // Show the image modulated by the defects + col *= vI; + // Add some grain + col *= 1.0+(rand(uv+t*.01)-.2)*.15; + + // Monochrome + float luma = dot( vec3(0.2126, 0.7152, 0.0722), col); + col = luma * vec3(0.7, 0.7, 0.7); + // col = mix(col, luma * vec3(0.7, 0.7, 0.7), 1.); // desaturated + + col.b = pow(col.r, 0.9); // slightly blue-ish + // Fade out - col *= smoothstep(endTime+6., endTime+5., iTime); + col *= smoothstep(endTime+5., endTime+4., iTime); + fragColor = vec4(col,1.); } diff --git a/Intro/src/shaders/shaders.inl b/Intro/src/shaders/shaders.inl index 09d0b3e..b3c56ca 100644 --- a/Intro/src/shaders/shaders.inl +++ b/Intro/src/shaders/shaders.inl @@ -1,7 +1,7 @@ // Generated with Shader Minifier 1.3.3 (https://github.com/laurentlb/Shader_Minifier/) #ifndef SHADERS_INL_ # define SHADERS_INL_ -# define VAR_a_position "M" +# define VAR_a_position "N" # define VAR_animationAmp "m" # define VAR_animationSpeed "y" # define VAR_anvilPos "n" @@ -18,9 +18,9 @@ # define VAR_headRot "l" # define VAR_iTime "t" # define VAR_noseSize "k" -# define VAR_panelPos "z" -# define VAR_panelWarningPos "i" -# define VAR_prevPass "L" +# define VAR_panelPos "i" +# define VAR_panelWarningPos "z" +# define VAR_prevPass "M" # define VAR_sheepPos "s" # define VAR_sunDir "r" @@ -28,7 +28,7 @@ const char *mouton_frag = "#version 150\n" "out vec4 f;" "const vec2 v=vec2(1280,720);" - "in vec3 m,y,s,x,z,i,n,r,c,a,d;" + "in vec3 m,y,s,x,i,z,n,r,c,a,d;" "in vec2 l;" "in float e,u,o,p,w,k;" "uniform float t;" @@ -45,13 +45,13 @@ const char *mouton_frag = "y=mod(y-i/2.,i)-i/2.;" "return vec2(cos(y),sin(y))*s;" "}" - "vec2 g(vec3 i,vec3 v,vec3 m,vec3 t)" + "vec2 g(vec3 i,vec3 v,vec3 m,vec3 s)" "{" - "vec3 y=t*i,x=abs(t)*m,c=-y-x,d=-y+x;" - "float a=max(max(c.x,c.y),c.z),s=min(min(d.x,d.y),d.z);" - "return a>s||s<0.?" + "vec3 y=s*i,x=abs(s)*m,c=-y-x,d=-y+x;" + "float z=max(max(c.x,c.y),c.z),a=min(min(d.x,d.y),d.z);" + "return z>a||a<0.?" "vec2(-1):" - "vec2(a,s);" + "vec2(z,a);" "}" "vec3 g(vec3 v)" "{" @@ -68,15 +68,16 @@ const char *mouton_frag = "f+=vec3(1,.7,.3)*pow(i,1.);" "f+=vec3(1,.5,.1)*pow(i,52.);" "f=vec3(1)*y*y;" - "vec2 x=vec2(cos(t*.7+2.4),sin(t*.7+2.4)*.75);" + "float c=int(t*12)/12.;" + "vec2 x=vec2(cos(c*.7+2.4),sin(c*.7+2.4)*.75);" "float s=smoothstep(.151,.15,length(m-x));" "s*=smoothstep(.15,.1501,length(m-x-vec2(.1,.025)));" "s+=exp(-length(m-x)*2.)*.1;" "s*=smoothstep(.5,0.,r.y);" - "vec2 c=m*2e2,a=fract(c)-.5,d=floor(c);" - "vec3 l=g(vec3(abs(d),abs(d.x)));" - "float z=l.z*.1;" - "s+=smoothstep(z,z*.01,length(l.xy-.5+a))*(cos(t*l.y+l.z*3.14)*.5+.5);" + "vec2 d=m*2e2,a=fract(d)-.5,z=floor(d);" + "vec3 l=g(vec3(abs(z),abs(z.x)));" + "float u=l.z*.1;" + "s+=smoothstep(u,u*.01,length(l.xy-.5+a))*(cos(c*l.y+l.z*3.14)*.5+.5);" "f+=s*smoothstep(.5,-1.,r.y);" "return f;" "}" @@ -87,8 +88,8 @@ const char *mouton_frag = "float C(vec3 v)" "{" "vec3 m=floor(v),s=fract(v),y=s*s*s*(s*(s*6.-15.)+10.);" - "float i=m.x+317.*m.y+157.*m.z,x=h(i),c=h(i+1.),d=h(i+317.),a=h(i+318.),f=h(i+157.),z=h(i+158.),u=h(i+474.),t=h(i+475.);" - "return-1.+2.*(x+(c-x)*y.x+(d-x)*y.y+(f-x)*y.z+(x-c-d+a)*y.x*y.y+(x-d-f+u)*y.y*y.z+(x-c-f+z)*y.z*y.x+(-x+c+d-a+f-z-u+t)*y.x*y.y*y.z);" + "float x=m.x+317.*m.y+157.*m.z,z=h(x),c=h(x+1.),d=h(x+317.),a=h(x+318.),f=h(x+157.),u=h(x+158.),p=h(x+474.),r=h(x+475.);" + "return-1.+2.*(z+(c-z)*y.x+(d-z)*y.y+(f-z)*y.z+(z-c-d+a)*y.x*y.y+(z-d-f+p)*y.y*y.z+(z-c-f+u)*y.z*y.x+(-z+c+d-a+f-u-p+r)*y.x*y.y*y.z);" "}" "vec2 B(vec3 v)" "{" @@ -101,19 +102,19 @@ const char *mouton_frag = "}" "mat3 B(vec3 v,vec3 y)" "{" - "const vec3 i=vec3(0,1,0);" - "vec3 x=normalize(y-v),c=normalize(cross(x,normalize(i)));" - "return mat3(c,cross(c,x),x);" + "const vec3 x=vec3(0,1,0);" + "vec3 c=normalize(y-v),d=normalize(cross(c,normalize(x)));" + "return mat3(d,cross(d,c),c);" "}" "mat2 A(float v)" "{" "float y=cos(v),x=sin(v);" "return mat2(y,x,-x,y);" "}" - "float A(vec3 v,vec3 x)" + "float A(vec3 v,vec3 y)" "{" - "vec3 y=abs(v)-x;" - "return length(max(y,0.))+min(max(y.x,max(y.y,y.z)),0.);" + "vec3 c=abs(v)-y;" + "return length(max(c,0.))+min(max(c.x,max(c.y,c.z)),0.);" "}" "vec2 D(vec3 v)" "{" @@ -123,10 +124,10 @@ const char *mouton_frag = "if(f<10.)" "{" "f=min(f,A(v-vec3(0,3,0),vec3(2,1,3)));" - "float i=length((v.yz-vec2(4.5,3))*vec2(1,.8))-2.;" - "i=max(i,abs(v.x)-.5);" - "i=max(i,v.y-3.5);" - "f=min(f,i);" + "float c=length((v.yz-vec2(4.5,3))*vec2(1,.8))-2.;" + "c=max(c,abs(v.x)-.5);" + "c=max(c,v.y-3.5);" + "f=min(f,c);" "vec2 x=vec2(f-.1,11);" "return x;" "}" @@ -134,13 +135,13 @@ const char *mouton_frag = "}" "vec2 E(vec3 v)" "{" - "v-=z;" + "v-=i;" "float y=A(v-vec3(0,7.5,-5),vec3(.8,.8,.1))-.2;" "if(y<7.)" "{" "y=max(y,abs(v.z+5.)-.1);" - "float i=A(v-vec3(0,4,-5.1),vec3(.11,4,.08));" - "vec2 f=vec2(i,5);" + "float c=A(v-vec3(0,4,-5.1),vec3(.11,4,.08));" + "vec2 f=vec2(c,5);" "f=h(f,vec2(y,7));" "return f;" "}" @@ -148,89 +149,90 @@ const char *mouton_frag = "}" "float A(vec3 v,float y,float i,float x)" "{" - "vec2 m=vec2(length(v.xz),v.y),c=vec2(x,y),t=vec2(x-i,2.*y),d=vec2(m.x-min(m.x,m.y<0.?" + "vec2 m=vec2(length(v.xz),v.y),c=vec2(x,y),z=vec2(x-i,2.*y),d=vec2(m.x-min(m.x,m.y<0.?" "i:" - "x),abs(m.y)-y),f=m-c+t*clamp(dot(c-m,t)/dot(t,t),0.,1.);" + "x),abs(m.y)-y),f=m-c+z*clamp(dot(c-m,z)/dot(z,z),0.,1.);" "return(f.x<0.&&d.y<0.?" "-1.:" "1.)*sqrt(min(dot(d,d),dot(f,f)));" "}" - "float B(vec3 v,vec3 x,vec3 m,float y)" + "float B(vec3 v,vec3 y,vec3 m,float x)" "{" - "vec3 i=v-x,c=m-x;" - "float s=clamp(dot(i,c)/dot(c,c),0.,1.);" - "return length(i-c*s)-y;" + "vec3 c=v-y,z=m-y;" + "float i=clamp(dot(c,z)/dot(z,z),0.,1.);" + "return length(c-z*i)-x;" "}" "float C(vec3 v,vec2 y)" "{" - "vec2 i=vec2(length(v.xy)-y.x,v.z);" - "return length(i)-y.y;" + "vec2 c=vec2(length(v.xy)-y.x,v.z);" + "return length(c)-y.y;" "}" "float D(vec3 v,vec3 y)" "{" - "float i=length(v/y),x=length(v/(y*y));" - "return i*(i-1.)/x;" + "float c=length(v/y),x=length(v/(y*y));" + "return c*(c-1.)/x;" "}" "vec2 F(vec3 v)" "{" + "float y=int(t*12)/12.;" "v-=x;" - "vec3 y=v;" - "y.x+=cos(.775+t)*3.1*.2;" - "y.y-=2.8;" - "y.zy=A(.7)*y.zy;" - "float i=D(y-vec3(0,.3,0),vec3(1,.2+cos(y.x*150.)*sin(y.z*150.)*.05,1)*.25);" - "if(i<5.)" + "vec3 m=v;" + "m.x+=cos(.775+y)*3.1*.2;" + "m.y-=2.8;" + "m.zy=A(.7)*m.zy;" + "float c=D(m-vec3(0,.3,0),vec3(1,.2+cos(m.x*150.)*sin(m.z*150.)*.05,1)*.25);" + "if(c<5.)" "{" - "vec2 m=vec2(i,8);" - "vec3 f=y;" + "vec2 i=vec2(c,8);" + "vec3 f=m;" "f.xz=g(f.xz,U*.2);" - "float c=D(f-vec3(.5,.2+sin(f.x*2.)*.2,0),vec3(2,.1+sin(f.z*40.)*.02,.75)*.25);" - "if(c0.)" + "vec3 c=1./y;" + "float m=9e7,f;" + "vec2 d=g(v-s-vec3(0,3,-2),y,vec3(3,3,7),c);" + "if(d.y>0.)" "{" - "c=max(e.x,0.);" + "f=max(d.x,0.);" "for(int u=0;u<128;u++)" "{" - "vec3 d=v+y*c;" - "float a=h(vec2(d.y,0),G(d)).x;" - "c+=a;" - "if(c>e.y||abs(a)<.001)" + "vec3 a=v+y*f;" + "float t=h(vec2(a.y,0),G(a)).x;" + "f+=t;" + "if(f>d.y||abs(t)<.001)" "break;" "}" - "if(c0.)" + "d=g(v-i-vec3(0,5,-5),y,vec3(1.5,5,1),c);" + "if(d.y>0.)" "{" - "c=max(e.x,0.);" + "f=max(d.x,0.);" "for(int u=0;u<128;u++)" "{" - "float d=E(v+y*c).x;" - "c+=d;" - "if(c>e.y||abs(d)<.001)" + "float a=E(v+y*f).x;" + "f+=a;" + "if(f>d.y||abs(a)<.001)" "break;" "}" - "if(c0.)" + "d=g(v-z-vec3(0,5,-5),y,vec3(1.5,5,1),c);" + "if(d.y>0.)" "{" - "c=max(e.x,0.);" + "f=max(d.x,0.);" "for(int u=0;u<128;u++)" "{" - "float d=H(v+y*c).x;" - "c+=d;" - "if(c>e.y||abs(d)<.001)" + "float a=H(v+y*f).x;" + "f+=a;" + "if(f>d.y||abs(a)<.001)" "break;" "}" - "if(c0.)" + "d=g(v-x-vec3(0,5,0),y,vec3(2,5,1),c);" + "if(d.y>0.)" "{" - "c=max(e.x,0.);" + "f=max(d.x,0.);" "for(int u=0;u<128;u++)" "{" - "float d=F(v+y*c).x;" - "c+=d;" - "if(c>e.y||abs(d)<.001)" + "float a=F(v+y*f).x;" + "f+=a;" + "if(f>d.y||abs(a)<.001)" "break;" "}" - "if(c0.)" + "d=g(v-n-vec3(0,3,2),y,vec3(4,4,5),c);" + "if(d.y>0.)" "{" - "c=max(e.x,0.);" + "f=max(d.x,0.);" "for(int u=0;u<128;u++)" "{" - "float d=D(v+y*c).x;" - "c+=d;" - "if(c>e.y||abs(d)<.001)" + "float a=D(v+y*f).x;" + "f+=a;" + "if(f>d.y||abs(a)<.001)" "break;" "}" - "if(c0.&&length((v+y*c).xz-n.xz)<10.)" + "f=-(v.y+.4)*c.y;" + "if(f>0.&&length((v+y*f).xz-n.xz)<10.)" "{" - "c=-c;" + "f=-f;" "for(int u=0;u<128;u++)" "{" - "vec3 d=v+y*c;" - "float a=min(d.y,B(d).x);" - "c+=a;" - "if(c>e.y||abs(a)<.001)" + "vec3 a=v+y*f;" + "float t=min(a.y,B(a).x);" + "f+=t;" + "if(f>d.y||abs(t)<.001)" "break;" "}" - "if(c<1e2)" - "f=min(f,c);" + "if(f<1e2)" + "m=min(m,f);" "}" - "c=-v.y*m.y;" - "if(c>0.)" - "f=min(f,c);" - "return f;" + "f=-v.y*c.y;" + "if(f>0.)" + "m=min(m,f);" + "return m;" "}" "vec3 J(vec3 v)" "{" @@ -455,53 +457,53 @@ const char *mouton_frag = "}" "return clamp(f,0.,1.);" "}" - "float E(vec2 v,float y,float i,float x)" + "float E(vec2 v,float y,float x,float f)" "{" "v.x=abs(v.x);" - "float c=(y-i)/x,f=sqrt(1.-c*c),m=dot(v,vec2(-c,f));" + "float c=(y-x)/f,d=sqrt(1.-c*c),m=dot(v,vec2(-c,d));" "return m<0.?" "length(v)-y:" - "m>f*x?" - "length(v-vec2(0,x))-i:" - "dot(v,vec2(f,c))-y;" - "}" - "vec3 A(vec3 v,vec3 y,vec3 m,vec3 f,vec2 c)" - "{" - "vec2 u=I(m);" - "float s=smoothstep(0.,.3,r.y)+.1,a=C(m,f,.15,1.);" - "a*=C(m,f,1.,.1)*.5;" - "float l=D(m,r,.08,50.),n=clamp(1.+dot(y,f),0.,5.);" - "vec3 M=vec3(1,.8,.7)*max(dot(f,r),0.)*pow(vec3(l),vec3(1,1.2,1.5)),G=vec3(1,.8,.7)*.1*max(dot(f,-r),0.)*a,w=vec3(.5)*mix(C(m,y,.3,.75),C(m,r,.3,.75),.5),F=vec3(1)*max(dot(reflect(y,f),r),0.),k=vec3(.4,.45,.5)*a,L=vec3(0),H=vec3(0);" - "if(u.y==0.)" - "H=vec3(3),w=vec3(0),F=vec3(0);" + "m>d*f?" + "length(v-vec2(0,f))-x:" + "dot(v,vec2(d,c))-y;" + "}" + "vec3 A(vec3 v,vec3 f,vec3 y,vec3 c,vec2 m)" + "{" + "vec2 a=I(y);" + "float s=smoothstep(0.,.3,r.y)+.1,u=C(y,c,.15,1.);" + "u*=C(y,c,1.,.1)*.5;" + "float l=D(y,r,.08,50.),n=clamp(1.+dot(f,c),0.,5.);" + "vec3 F=vec3(1,.8,.7)*max(dot(c,r),0.)*pow(vec3(l),vec3(1,1.2,1.5)),N=vec3(1,.8,.7)*.1*max(dot(c,-r),0.)*u,G=vec3(.5)*mix(C(y,f,.3,.75),C(y,r,.3,.75),.5),w=vec3(1)*max(dot(reflect(f,c),r),0.),k=vec3(.4,.45,.5)*u,M=vec3(0),H=vec3(0);" + "if(a.y==0.)" + "H=vec3(3),G=vec3(0),w=vec3(0);" "else" - " if(u.y==1.)" - "H=vec3(.4),w*=vec3(1)*(n*.5+.5),L=vec3(.35),F=pow(F,vec3(4))*n*.25;" + " if(a.y==1.)" + "H=vec3(.4),G*=vec3(1)*(n*.5+.5),M=vec3(.35),w=pow(w,vec3(4))*n*.25;" "else" - " if(u.y==4.)" - "H=vec3(.025),w=vec3(0),F=pow(F,vec3(80))*n*10.;" + " if(a.y==4.)" + "H=vec3(.025),G=vec3(0),w=pow(w,vec3(80))*n*10.;" "else" - " if(u.y==3.)" + " if(a.y==3.)" "{" - "w*=.5;" + "G*=.5;" "H=vec3(1);" - "float J=dot(f,normalize(vec3(0,0,1))),B=dot(f,d),h=smoothstep(-.953,-.952,B-o/2.);" + "float J=dot(c,normalize(vec3(0,0,1))),B=dot(c,d),h=smoothstep(-.953,-.952,B-o/2.);" "H*=h;" - "F*=h;" + "w*=h;" "if(J>0.||e>.95)" - "u.y=2.;" - "F=pow(F,vec3(80))*n*3.;" + "a.y=2.;" + "w=pow(w,vec3(80))*n*3.;" "}" "else" - " if(u.y==5.)" - "H=vec3(1),w=vec3(0),F=pow(F,vec3(8))*n*2.;" + " if(a.y==5.)" + "H=vec3(1),G=vec3(0),w=pow(w,vec3(8))*n*2.;" "else" - " if(u.y==6.)" + " if(a.y==6.)" "{" - "vec3 J=m-i;" - "w=vec3(0);" - "F=pow(F,vec3(8))*n*10.;" - "if(f.z>.5)" + "vec3 J=y-z;" + "G=vec3(0);" + "w=pow(w,vec3(8))*n*10.;" + "if(c.z>.5)" "{" "float B=C(J-vec3(0,7.5,-5),vec2(1.3,.2),.01);" "H=vec3(1.5,0,0);" @@ -514,12 +516,12 @@ const char *mouton_frag = " H=vec3(1);" "}" "else" - " if(u.y==7.)" + " if(a.y==7.)" "{" - "vec3 J=m-z;" - "w=vec3(0);" - "F=pow(F,vec3(8))*n*10.;" - "if(f.z>.5)" + "vec3 J=y-i;" + "G=vec3(0);" + "w=pow(w,vec3(8))*n*10.;" + "if(c.z>.5)" "{" "H=vec3(0,0,1.5);" "J.y-=7.4;" @@ -540,85 +542,87 @@ const char *mouton_frag = " H=vec3(1);" "}" "else" - " if(u.y==8.)" + " if(a.y==8.)" "{" - "vec3 J=m-x;" + "vec3 J=y-x;" "J.x+=cos(.775+t)*3.1*.2;" "J.y-=2.8;" "J.zy=A(.75)*J.zy;" "H=mix(vec3(2,.75,0),vec3(2,2,0),smoothstep(0.,.45,length(J-vec3(0,.3,0))))*1.8;" - "w=vec3(.01);" - "F=vec3(0);" + "G=vec3(.01);" + "w=vec3(0);" "}" "else" - " if(u.y==10.)" - "H=vec3(0,.05,0),w*=vec3(1),F*=vec3(1)*n;" + " if(a.y==10.)" + "H=vec3(0,.05,0),G*=vec3(1),w*=vec3(1)*n;" "else" - " if(u.y==9.)" + " if(a.y==9.)" "{" - "vec3 J=m-x;" + "vec3 J=y-x;" "J.x+=cos(.775+t)*3.1*.2;" "J.y-=2.8;" "J.zy=A(.75)*J.zy;" "H=mix(vec3(1)+.5,vec3(.75,.5,1),smoothstep(.5,1.1,length(J-vec3(0,.3,0))))*2.;" - "w*=0.;" - "F=pow(F,vec3(4))*n;" + "G*=0.;" + "w=pow(w,vec3(4))*n;" "}" "else" - " if(u.y==11.)" - "H=vec3(1),M*=vec3(.1)*n,k*=vec3(.1)*n,G*=vec3(0)*n,w=vec3(0),F=pow(F,vec3(100))*n*2.;" + " if(a.y==11.)" + "H=vec3(1),F*=vec3(.1)*n,k*=vec3(.1)*n,N*=vec3(0)*n,G=vec3(0),w=pow(w,vec3(100))*n*2.;" "else" - " if(u.y==12.)" + " if(a.y==12.)" "{" "H=vec3(1,.01,.01)*.3;" "float J=n*n;" - "M*=vec3(3);" + "F*=vec3(3);" "k*=vec3(2)*J;" - "G*=vec3(1);" - "w*=vec3(0);" - "F=vec3(1,.3,.3)*pow(F,vec3(500))*5.;" + "N*=vec3(1);" + "G*=vec3(0);" + "w=vec3(1,.3,.3)*pow(w,vec3(500))*5.;" "}" - "if(u.y==2.)" - "H=vec3(1,.7,.5),k*=vec3(1,.75,.75),w=pow(w,vec3(.5,2.5,5)+2.)*2.,F=pow(F,vec3(4))*n*.02;" - "vec3 J=(H*(k+M*.5+G*2.+w*2.)+F*l+L)*s;" - "float B=length(m-v);" - "J=mix(J,g(y,c,s),smoothstep(90.,1e2,B));" - "if(u.y==0.)" + "if(a.y==2.)" + "H=vec3(1,.7,.5),k*=vec3(1,.75,.75),G=pow(G,vec3(.5,2.5,5)+2.)*2.,w=pow(w,vec3(4))*n*.02;" + "G=vec3(0);" + "w=vec3(0);" + "vec3 J=(H*(k+F*.5+N*2.+G*2.)+w*l+M)*s;" + "float B=length(y-v);" + "J=mix(J,g(f,m,s),smoothstep(90.,1e2,B));" + "if(a.y==0.)" "{" - "float U=cos(atan(c.x,c.y)*15.+t*3.),K=length(c)*.5;" + "float U=cos(atan(m.x,m.y)*15.+t*3.),K=length(m)*.5;" "J=mix(J,mix(vec3(1,.5,0),vec3(1),smoothstep(-K,K,U)),p);" "}" "return clamp(J,0.,1.);" "}" "float D(vec2 v,float y,float m)" "{" - "const vec2 f=vec2(.809016994375,-.587785252292),c=vec2(-f.x,f.y);" + "const vec2 c=vec2(.809016994375,-.587785252292),f=vec2(-c.x,c.y);" "v.x=abs(v.x);" - "v-=2.*max(dot(f,v),0.)*f;" "v-=2.*max(dot(c,v),0.)*c;" + "v-=2.*max(dot(f,v),0.)*f;" "v.x=abs(v.x);" "v.y-=y;" - "vec2 i=m*vec2(-f.y,f.x)-vec2(0,1);" - "float x=clamp(dot(v,i)/dot(i,i),0.,y);" - "return length(v-i*x)*sign(v.y*i.x-v.x*i.y);" + "vec2 x=m*vec2(-c.y,c.x)-vec2(0,1);" + "float i=clamp(dot(v,x)/dot(x,x),0.,y);" + "return length(v-x*i)*sign(v.y*x.x-v.x*x.y);" "}" "void main()" "{" - "vec2 y=vec2(1)/v,m=gl_FragCoord.xy*y,i=m*2.-1.;" - "i.x*=v.x*y.y;" - "vec3 x=c,d=a,s=B(x,d)*normalize(vec3(i,u-length(i)*w));" - "float H=E(x,s);" - "vec3 F=x+s*H,z=J(F),e=A(x,s,F,z,i);" + "vec2 y=vec2(1)/v,m=gl_FragCoord.xy*y,d=m*2.-1.;" + "d.x*=v.x*y.y;" + "vec3 i=c,x=a,z=B(i,x)*normalize(vec3(d,u-length(d)*w));" + "float s=E(i,z);" + "vec3 H=i+z*s,G=J(H),e=A(i,z,H,G,d);" "{" - "vec2 r=i*5.;" + "vec2 r=d*5.;" "r.x=abs(r.x-.3)-1.5;" "r.y-=1.4;" "r=A(t*5.)*r;" - "float n=1.4+.2*sin(t*20.);" - "n*=smoothstep(.5,1.,p);" - "float l=D(r,n,.5);" - "vec3 M=mix(vec3(1,.6,0),vec3(1,.2,0),smoothstep(-.1,.6,D(r,n*.5,.5)))*1.3;" - "e=mix(e,M,smoothstep(0.,-.01,l)*p);" + "float N=1.4+.2*sin(t*20.);" + "N*=smoothstep(.5,1.,p);" + "float l=D(r,N,.5);" + "vec3 n=mix(vec3(1,.6,0),vec3(1,.2,0),smoothstep(-.1,.6,D(r,N*.5,.5)))*1.3;" + "e=mix(e,n,smoothstep(0.,-.01,l)*p);" "}" "e/=1.+pow(length(m*2.-1.),4.)*.04;" "f=vec4(pow(e,vec3(1./2.2)),1);" @@ -626,19 +630,20 @@ const char *mouton_frag = const char *mouton_vert = "#version 150\n" - "in vec4 M;" - "out vec3 m,y,s,x,z,i,n,r,c,a,d;" + "in vec4 N;" + "out vec3 m,y,s,x,i,z,n,r,c,a,d;" "out vec2 l;" "out float e,u,o,p,w,k;" "uniform float t;" "void main()" "{" - "gl_Position=M;" + "gl_Position=N;" "float v=t;" + "v=int(v*12)/12.;" "s=vec3(0);" - "z=vec3(9e7);" - "x=vec3(9e7);" "i=vec3(9e7);" + "x=vec3(9e7);" + "z=vec3(9e7);" "n=vec3(9e7);" "u=2.;" "e=max(fract(t*.333),fract(t*.123+.1));" @@ -692,11 +697,11 @@ const char *mouton_vert = "else" " if(v<55.)" "{" - "float f=v-50.,F=smoothstep(2.,2.5,f);" - "l.y=mix(.25,0.,F);" - "m=vec3(1.-F,.2*(1.-F),1);" + "float f=v-50.,G=smoothstep(2.,2.5,f);" + "l.y=mix(.25,0.,G);" + "m=vec3(1.-G,.2*(1.-G),1);" "y=vec3(1,1,.5);" - "d=normalize(vec3(F*.3,.3-F*.3,1));" + "d=normalize(vec3(G*.3,.3-G*.3,1));" "o=smoothstep(4.6,4.8,f)*.2;" "u=4.;" "c=vec3(0,3,-4);" @@ -709,15 +714,15 @@ const char *mouton_vert = "{" "float f=v-55.;" "s=vec3(0);" - "z=vec3(-5,0,-8);" + "i=vec3(-5,0,-8);" "d=normalize(vec3(.3,0,1));" "o=.2;" "m=vec3(0,0,1);" "y=vec3(3,1.5,6);" - "float F=smoothstep(0.,.5,f);" - "u=mix(4.,3.,F);" + "float G=smoothstep(0.,.5,f);" + "u=mix(4.,3.,G);" "c=vec3(0,3,-4);" - "a=mix(vec3(0,3,0),vec3(-5,5,-9),F);" + "a=mix(vec3(0,3,0),vec3(-5,5,-9),G);" "}" "else" " if(v<65.)" @@ -737,7 +742,7 @@ const char *mouton_vert = "float f=v-65.;" "d=normalize(vec3(0,0,1));" "s=vec3(0,0,-f*3.-2.);" - "z=vec3(-5,0,-8);" + "i=vec3(-5,0,-8);" "m=vec3(1,1,.5);" "y=vec3(3,1.5,8)*1.5;" "c=vec3(16,5,9);" @@ -750,7 +755,7 @@ const char *mouton_vert = "float f=v-70.;" "m=vec3(1);" "y=vec3(3,1.5,8);" - "float F=mod(f,8.),H=smoothstep(.5,1.,F)*smoothstep(2.8,2.5,F)-smoothstep(4.,4.5,F)*smoothstep(5.8,5.5,F)+cos(t)*.2;" + "float G=mod(f,8.),H=smoothstep(.5,1.,G)*smoothstep(2.8,2.5,G)-smoothstep(4.,4.5,G)*smoothstep(5.8,5.5,G)+cos(t)*.2;" "d=normalize(vec3(H,cos(t*.5)*.1+.1,1));" "w=.3;" "u=2.5;" @@ -764,10 +769,10 @@ const char *mouton_vert = "else" " if(v<85.)" "{" - "float f=v-80.,F=smoothstep(1.,3.,f);" - "m=vec3(0,1.-F*.5,1);" + "float f=v-80.,G=smoothstep(1.,3.,f);" + "m=vec3(0,1.-G*.5,1);" "y=vec3(3,1.5,6);" - "d=normalize(vec3(F*.5,.3-F*.45,1));" + "d=normalize(vec3(G*.5,.3-G*.45,1));" "u=4.;" "c=vec3(0,3,-4);" "a=vec3(0,3,0);" @@ -779,21 +784,21 @@ const char *mouton_vert = "{" "float f=v-85.;" "s=vec3(0);" - "i=vec3(-5,0,-8);" + "z=vec3(-5,0,-8);" "d=normalize(vec3(.5,-.15,1));" "m=vec3(0,.5,1);" "y=vec3(3,1.5,6);" - "float F=smoothstep(0.,1.,f);" - "u=mix(4.,3.,F);" + "float G=smoothstep(0.,1.,f);" + "u=mix(4.,3.,G);" "c=vec3(0,3,-4);" - "a=mix(vec3(0,3,0),vec3(-5,5,-9),F);" + "a=mix(vec3(0,3,0),vec3(-5,5,-9),G);" "}" "else" " if(v<97.)" "{" "float f=v-89.;" "s=vec3(0,0,-11);" - "i=vec3(-5,0,-8);" + "z=vec3(-5,0,-8);" "d=normalize(mix(vec3(1,-.5,1),vec3(0,.5,1),smoothstep(3.,3.5,f)));" "d=normalize(mix(d,vec3(1,-.5,1),smoothstep(6.5,7.,f)));" "l.y=smoothstep(3.,3.5,f)*.6;" @@ -807,11 +812,11 @@ const char *mouton_vert = "else" " if(v<107.)" "{" - "float f=v-98.,F=smoothstep(6.,9.,f);" + "float f=v-98.,G=smoothstep(6.,9.,f);" "s=vec3(0,0,f*.25-11.);" - "i=vec3(-2,0,-8);" - "d=normalize(vec3(-.5,.25-F,1));" - "l.y=.5-F;" + "z=vec3(-2,0,-8);" + "d=normalize(vec3(-.5,.25-G,1));" + "l.y=.5-G;" "m=vec3(1,.2,.5);" "y=vec3(-1,1,1)*.5;" "c=vec3(18,5,-5);" @@ -824,7 +829,7 @@ const char *mouton_vert = "float f=v-107.;" "m=vec3(0);" "y=vec3(0);" - "i=vec3(0,0,-8);" + "z=vec3(0,0,-8);" "a=mod(f,2.)<1.?" "(c=vec3(0,2,-8),vec3(0,3,0)):" "(c=vec3(0,5.5,2),vec3(0,5.75,0));" @@ -834,12 +839,12 @@ const char *mouton_vert = "else" " if(v<116.)" "{" - "float f=v-109.,F=sin(min(f,5.));" + "float f=v-109.,G=sin(min(f,5.));" "m=vec3(0);" "y=vec3(0);" - "d=normalize(vec3(F*.7,0,1));" + "d=normalize(vec3(G*.7,0,1));" "d=normalize(mix(d,vec3(-.3,.2,1),smoothstep(5.2,5.4,f)));" - "l.x=F*.25;" + "l.x=G*.25;" "o=smoothstep(6.,6.2,f)*.2;" "s=vec3(0,(smoothstep(6.,6.2,f)-smoothstep(6.2,6.4,f))*.4,0);" "u=3.5;" @@ -851,13 +856,13 @@ const char *mouton_vert = "{" "float f=v-116.;" "s=vec3(9e7);" - "i=vec3(-2,0,-8);" + "z=vec3(-2,0,-8);" "x=vec3(5,0,-20);" - "float F=smoothstep(.5,1.5,f);" - "u=mix(3.5,5.,F);" + "float G=smoothstep(.5,1.5,f);" + "u=mix(3.5,5.,G);" "c=vec3(0,5.5,2);" - "a=mix(vec3(-.5,5.75,0),vec3(5,2,-20),F);" - "p=F*.3;" + "a=mix(vec3(-.5,5.75,0),vec3(5,2,-20),G);" + "p=G*.3;" "}" "else" " if(v<137.)" @@ -866,19 +871,19 @@ const char *mouton_vert = "m=vec3(.1);" "y=vec3(.2);" "u=2.8+f*.15;" - "int F=int(f);" - "if(F%4==1)" - "i=vec3(0,0,-8),c=vec3(2.5,2,-1),a=vec3(1,5.25,-8),u=2.8+pow(f*.3,1.2);" + "int J=int(f);" + "if(J%4==1)" + "z=vec3(0,0,-8),c=vec3(2.5,2,-1),a=vec3(1,5.25,-8),u=2.8+pow(f*.3,1.2);" "else" - " if(F%4==3)" + " if(J%4==3)" "x=vec3(4,0,-8),c=vec3(0,5.5,2),a=vec3(4,3,-8),p=.3;" "else" " c=vec3(0,2.4,-8),a=vec3(0,3,0);" - "float H=smoothstep(.3,.7,fract(f));" - "if(F%4==0)" - "H=1.-H;" - "l.x=-H*.1;" - "d=normalize(mix(vec3(.1,-.25,1),vec3(-.2,.2,1),H));" + "float G=smoothstep(.3,.7,fract(f));" + "if(J%4==0)" + "G=1.-G;" + "l.x=-G*.1;" + "d=normalize(mix(vec3(.1,-.25,1),vec3(-.2,.2,1),G));" "d=normalize(d+vec3(cos(f*10.),cos(f*5.),1)*.01);" "}" "else" @@ -904,8 +909,8 @@ const char *mouton_vert = "x=vec3(0,-.5,-30);" "m=vec3(1,1,.5);" "y=vec3(3,1.5,8);" - "float F=smoothstep(0.,10.,f);" - "c=vec3(-2,3.5,mix(-10.,-33.,F));" + "float G=smoothstep(0.,10.,f);" + "c=vec3(-2,3.5,mix(-10.,-33.,G));" "a=vec3(2,2,-3.-f*2.);" "u=3.;" "}" @@ -921,22 +926,22 @@ const char *mouton_vert = "c=vec3(-20,6,-13)+vec3(cos(f*72.),cos(f*64.),sin(f*48.))*3.*smoothstep(.09,.1,f)*smoothstep(.7,.1,f);" "a=vec3(3,2,-23);" "u=mix(4.,4.2,smoothstep(0.,5.,f));" - "float F=smoothstep(.1,0.,f)*13.;" - "n=vec3(0,F,-22);" + "float G=smoothstep(.1,0.,f)*13.;" + "n=vec3(0,G,-22);" "}" "else" "{" "float f=v-155.;" "d=normalize(vec3(0,0,1));" "s=vec3(9e7);" - "i=vec3(-1,0,-8);" + "z=vec3(-1,0,-8);" "x=vec3(1,0,-25);" "a=vec3(2,3.8,-18);" "c=vec3(5,5,2);" - "float F=smoothstep(1.5,2.,f);" - "u=2.5+F*3.5;" + "float G=smoothstep(1.5,2.,f);" + "u=2.5+G*3.5;" "n=vec3(7,0,-20);" - "p=F*.5;" + "p=G*.5;" "}" "}"; @@ -944,53 +949,101 @@ const char *fxaa_frag = "#version 150\n" "out vec4 f;" "const vec2 K=vec2(1280,720);" - "uniform sampler2D L;" + "uniform sampler2D M;" "vec3 E(vec4 v,sampler2D f,vec2 y)" "{" - "vec3 i=textureLod(f,v.zw,0.).xyz,c=textureLod(f,v.zw+vec2(1,0)*y.xy,0.).xyz,m=textureLod(f,v.zw+vec2(0,1)*y.xy,0.).xyz,F=textureLod(f,v.zw+vec2(1)*y.xy,0.).xyz,x=textureLod(f,v.xy,0.).xyz,d=vec3(.299,.587,.114);" - "float s=dot(i,d),a=dot(c,d),u=dot(m,d),z=dot(F,d),H=dot(x,d),w=min(H,min(min(s,a),min(u,z))),e=max(H,max(max(s,a),max(u,z)));" - "vec2 J;" - "J.x=-(s+a-u-z);" - "J.y=s+u-a-z;" - "float n=1./(min(abs(J.x),abs(J.y))+1./128.);" - "J=min(vec2(8),max(vec2(-8),J*n))*y.xy;" - "vec3 t=.5*(textureLod(f,v.xy+J*(1./3.-.5),0.).xyz+textureLod(f,v.xy+J*(2./3.-.5),0.).xyz),M=t*.5+.25*(textureLod(f,v.xy+J*-.5,0.).xyz+textureLod(f,v.xy+J*.5,0.).xyz);" - "float l=dot(M,d);" - "return le?" + "vec3 c=textureLod(f,v.zw,0.).xyz,d=textureLod(f,v.zw+vec2(1,0)*y.xy,0.).xyz,m=textureLod(f,v.zw+vec2(0,1)*y.xy,0.).xyz,a=textureLod(f,v.zw+vec2(1)*y.xy,0.).xyz,x=textureLod(f,v.xy,0.).xyz,G=vec3(.299,.587,.114);" + "float i=dot(c,G),z=dot(d,G),s=dot(m,G),u=dot(a,G),w=dot(x,G),H=min(w,min(min(i,z),min(s,u))),J=max(w,max(max(i,z),max(s,u)));" + "vec2 r;" + "r.x=-(i+z-s-u);" + "r.y=i+s-z-u;" + "float n=1./(min(abs(r.x),abs(r.y))+1./128.);" + "r=min(vec2(8),max(vec2(-8),r*n))*y.xy;" + "vec3 t=.5*(textureLod(f,v.xy+r*(1./3.-.5),0.).xyz+textureLod(f,v.xy+r*(2./3.-.5),0.).xyz),N=t*.5+.25*(textureLod(f,v.xy+r*-.5,0.).xyz+textureLod(f,v.xy+r*.5,0.).xyz);" + "float e=dot(N,G);" + "return eJ?" "t:" - "M;" + "N;" "}" "void main()" "{" - "vec2 y=1./K,v=gl_FragCoord.xy*y;" - "vec4 i=vec4(v,v-y*.5);" - "vec3 c=E(i,L,y);" - "f=vec4(c,1);" + "vec2 v=1./K,y=gl_FragCoord.xy*v;" + "vec4 c=vec4(y,y-v*.5);" + "vec3 m=E(c,M,v);" + "f=vec4(m,1);" "}"; const char *postprocess_frag = "#version 150\n" "out vec4 f;" - "const vec2 N=vec2(1280,720);" - "uniform sampler2D L;" + "const vec2 L=vec2(1280,720);" + "uniform sampler2D M;" "uniform float t;" + "vec2 b;" + "float O(vec2 v)" + "{" + "return fract(sin(dot(v.xy,vec2(12.9898,78.233)))*43758.5453);" + "}" + "float O(float v)" + "{" + "return O(vec2(v,1));" + "}" + "float P(float v)" + "{" + "float y=.01*O(v),f=O(v+1.),c=O(v+2.)-.5,m=O(v+3.),u=1.;" + "u=m>.2?" + "pow(abs(f*b.x+y*b.y+c),.0625):" + "2.-pow(abs(f*b.x+y*b.y+c),.125);" + "return mix(.5,1.,u);" + "}" + "float Q(float v)" + "{" + "float y=O(v),f=O(v+1.),m=.01*O(v+2.);" + "vec2 c=vec2(y,f)-b;" + "c.x*=L.x/L.y;" + "float x=atan(c.y,c.x),u=1.,G=m*m*(sin(6.2831*x*y)*.1+1.);" + "u=dot(c,c) Date: Wed, 22 Feb 2023 21:51:17 +0100 Subject: [PATCH 2/9] Simplify code (5881) - Generate monochrome textures - Convert lighting equations to monochrome --- Intro/src/shaders/mouton.frag | 133 +++----- Intro/src/shaders/mouton.frag.klproj | Bin 17190 -> 17195 bytes Intro/src/shaders/postprocess.frag | 89 +---- Intro/src/shaders/shaders.inl | 466 +++++++++++++-------------- 4 files changed, 275 insertions(+), 413 deletions(-) diff --git a/Intro/src/shaders/mouton.frag b/Intro/src/shaders/mouton.frag index e8467b1..075d2ba 100644 --- a/Intro/src/shaders/mouton.frag +++ b/Intro/src/shaders/mouton.frag @@ -341,16 +341,11 @@ vec2 map(vec3 p) { return dmat; } -vec3 skyColor(vec3 rd, vec2 uv, float night) { - vec3 col = vec3(1.); +float skyColor(vec3 rd, vec2 uv, float night) { + float col = night * night; float vdots = max(dot(rd, sunDir), 0.); - col += vec3(1.,.7,.3) * pow(vdots,1.); - col += vec3(1.,.5,.1) * pow(vdots,52.); - - col = vec3(1.) * night * night; - float iTime = int(iTime * 12) / 12.; // mon vec2 moonPos = vec2(cos(iTime*.7+2.4), sin(iTime*.7+2.4)*.75 ); @@ -494,7 +489,7 @@ float fastTrace(vec3 ro, vec3 rd) { } // /!\ Not energy conservative! -vec3 shade(vec3 ro, vec3 rd, vec3 p, vec3 n, vec2 uv) { +float shade(vec3 ro, vec3 rd, vec3 p, vec3 n, vec2 uv) { vec2 dmat = map(p); @@ -506,64 +501,51 @@ vec3 shade(vec3 ro, vec3 rd, vec3 p, vec3 n, vec2 uv) { float shad = shadow(p, sunDir, .08, 50.); float fre = clamp(1.0+dot(rd,n), 0., 5.); - vec3 diff = vec3(1.,.8,.7) * max(dot(n,sunDir), 0.) * pow(vec3(shad), vec3(1.,1.2,1.5)); - vec3 bnc = vec3(1.,.8,.7)*.1 * max(dot(n,-sunDir), 0.) * ao; - vec3 sss = vec3(.5) * mix(fastAO(p, rd, .3, .75), fastAO(p, sunDir, .3, .75), 0.5); - vec3 spe = vec3(1.) * max(dot(reflect(rd,n), sunDir),0.); + // vec3 diff = vec3(1.,.8,.7) * max(dot(n,sunDir), 0.) * pow(vec3(shad), vec3(1.,1.2,1.5)); + float diff = .85 * max(dot(n,sunDir), 0.) * pow(shad, 1.2) ; + // vec3 bnc = vec3(1.,.8,.7)*.1 * max(dot(n,-sunDir), 0.) * ao; + float bnc = .085 * max(dot(n,-sunDir), 0.) * ao ; + + // vec3 sss = vec3(.5) * mix(fastAO(p, rd, .3, .75), fastAO(p, sunDir, .3, .75), 0.5); + // float spe = vec3(1.) * max(dot(reflect(rd,n), sunDir),0.); //sss = vec3(1.) * calcSSS(p,rd); - vec3 amb = vec3(.4,.45,.5)*1. * ao; - vec3 emi = vec3(0.); + float amb = .45 * ao; // vec3(.4,.45,.5)*1. * ao; + float emi = 0.; - vec3 albedo = vec3(0.); + float albedo = 0.; if(dmat.y == GROUND) { - albedo = vec3(3.); - sss = vec3(0.); - spe = vec3(0.); + albedo = 3.; } else if (dmat.y == COTON) { - albedo = vec3(.4); - sss *= vec3(1.) *(fre*.5+.5); - emi = vec3(.35); - spe = pow(spe, vec3(4.))*fre*.25; + albedo = .4; + emi = .35; } else if (dmat.y == CLOGS) { - albedo = vec3(.025); - sss = vec3(0.); - spe = pow(spe, vec3(80.))*fre*10.; + albedo = .025; } else if (dmat.y == EYE) { - sss *= .5; - albedo = vec3(1.); float ndz = dot(n, normalize(vec3(0.,0.,1.))); float nde = dot(n, eyeDir); float pupil = smoothstep(-0.953,-.952, nde-eyesSurprise/2.); - albedo *= pupil; - spe *= pupil; + albedo = pupil; if (ndz > 0. || blink > .95) dmat.y = SKIN; - spe = pow(spe, vec3(80.))*fre*3.; } else if(dmat.y == METAL) { - albedo = vec3(1.); - sss = vec3(0.); - spe = pow(spe, vec3(8.))*fre*2.; + albedo = 1.; } else if(dmat.y == PANEL) { vec3 p = p-panelWarningPos; - sss = vec3(0.); - spe = pow(spe, vec3(8.))*fre*10.; if (n.z > .5) { float tri = triangle(p-vec3(0.,7.5,-5.), vec2(1.3,.2), .01); - albedo = vec3(1.5,0.,0.); + albedo = .5; float symbol = smoothstep(0.13,0.1295, distance(p,vec3(0.,7.1,-4.9))); symbol += smoothstep(0.005,0.,UnevenCapsule2d(p.xy-vec2(0.,7.34), .06,.14,1.)); - albedo = mix(albedo, vec3(2.), smoothstep(0.005,.0, tri)); - albedo = mix(albedo, vec3(0.), symbol); + albedo = mix(albedo, 2., smoothstep(0.005,.0, tri)); + albedo = mix(albedo, 0., symbol); } else { - albedo = vec3(1.); + albedo = 1.; } } else if(dmat.y == PANEL_FOOD) { vec3 p = p-panelPos; - sss = vec3(0.); - spe = pow(spe, vec3(8.))*fre*10.; if (n.z > .5) { - albedo = vec3(0.,0.,1.5); + albedo = .5; p.y -= 7.4; float squ = box(p-vec3(0.,.1,-5.), vec3(0.8,.8, 1)); float symbol = 0.; @@ -576,66 +558,43 @@ vec3 shade(vec3 ro, vec3 rd, vec3 p, vec3 n, vec2 uv) { p.xy = rot(-1.6) * p.xy; symbol += smoothstep(0.01,0.,UnevenCapsule2d(p.xy-vec2(x,-.6), .1,.05,1.)); symbol += smoothstep(0.01,0.,UnevenCapsule2d(p.xy-vec2(x,.5), .16,.1,0.15)); - albedo = mix(albedo, vec3(2.), smoothstep(0.01,.0, squ)); - albedo = mix(albedo, vec3(0.), symbol); + albedo = mix(albedo, 2., smoothstep(0.01,.0, squ)); + albedo = mix(albedo, 0., symbol); } else { - albedo = vec3(1.); + albedo = 1.; } } else if (dmat.y == PISTIL) { vec3 pr = p - flowerPos; pr.x += cos(3.1*.25+iTime)*3.1*.2; pr.y -= 2.8; pr.zy = rot(.75) * pr.zy; - albedo = mix(vec3(2.,.75,.0), vec3(2.,2.,.0), smoothstep(0.,.45, length(pr-vec3(0.,.3,0.))))*1.8; - sss = vec3(0.01); - spe = vec3(0.); + albedo = mix(.9 /*vec3(2.,.75,.0)*/, 1.3 /*vec3(2.,2.,.0)*/, smoothstep(0.,.45, length(pr-vec3(0.,.3,0.))))*1.8; } else if (dmat.y == TIGE) { - albedo = vec3(0.,.05,.0); - sss *= vec3(1.); - spe *= vec3(1.)*fre; + albedo = .02; } else if (dmat.y == PETAL) { vec3 pr = p - flowerPos; pr.x += cos(3.1*.25+iTime)*3.1*.2; pr.y -= 2.8; pr.zy = rot(.75) * pr.zy; - albedo = mix(vec3(1.,1.,1.)+.5, vec3(.75,0.5,1.), smoothstep(0.5,1.1, length(pr-vec3(0.,.3,0.))))*2.; - // albedo = vec3(1.,1.,1.)*3.; - sss *=0.0; - spe = pow(spe, vec3(4.))*fre*1.0; + albedo = mix( 1.5, .7 /*vec3(.75,0.5,1.)*/, smoothstep(0.5,1.1, length(pr-vec3(0.,.3,0.))))*2.; } else if(dmat.y == BLACK_METAL) { - albedo = vec3(1.); - diff *= vec3(.1)*fre; - amb *= vec3(.1)*fre; - bnc *= vec3(0.0)*fre; - sss = vec3(0.); - spe = pow(spe, vec3(100.))*fre*2.; + albedo = 1.; + diff *= .1*fre; + amb *= .1*fre; + bnc = 0.; } else if(dmat.y == BLOOD) { - albedo = vec3(1.,.01,.01)*.3; + albedo = .7; float fre2 = fre*fre; - diff *= vec3(3.); - amb *= vec3(2.)*fre2; - bnc *= vec3(1.); - sss *= vec3(.0); - spe = vec3(1.,.3,.3) * pow(spe, vec3(500.))*5.; + diff *= 3.; + amb *= 2.*fre2; } if (dmat.y == SKIN) { - albedo = vec3(1.,.7,.5)*1.; - amb *= vec3(1.,.75,.75); - sss = pow(sss, vec3(.5,2.5,5.0)+2.)*2.;// * fre;// * pow(fre, 1.); - spe = pow(spe, vec3(4.))*fre*.02; + albedo = .8; + amb *= .8; } - sss = vec3(0.); - spe = vec3(0.); - //emi = vec3(0.); - //bnc = vec3(0.); - // diff = mix(diff, vec3(1.), 0.2); // vec3(1.); - vec3 col = (albedo * (amb*1. + diff*.5 + bnc*2. + sss*2. ) + spe*shad + emi) * night;//* (saturate(sunDir.y)*.95+.05); - //col = diff;//diff + bnc + amb + sss; - //col = albedo * spe; - //col = diff; - //col = amb; - // col = sss; + float col = (albedo * (amb*1. + diff*.5 + bnc*2. ) + emi) * night; + // fog float t = length(p-ro); col = mix(col, skyColor(rd,uv, night), smoothstep(90.,100.,t)); @@ -644,7 +603,7 @@ vec3 shade(vec3 ro, vec3 rd, vec3 p, vec3 n, vec2 uv) { if(dmat.y == GROUND) { float theta = cos(atan(uv.x, uv.y)*15.+iTime*3.); float r = length(uv)*.5; - col = mix(col, mix(vec3(1.,0.5,00), vec3(1.,1.,1.), smoothstep(-r, r, theta)), excited); + col = mix(col, mix(.5, 1., smoothstep(-r, r, theta)) , excited); } return clamp(col,0.,1.); @@ -666,7 +625,7 @@ void main() float t = fastTrace(ro,rd); vec3 p = ro + rd * t; vec3 n = normal(p); - vec3 col = shade(ro, rd, p, n, v); + float col = shade(ro, rd, p, n, v); // Excited stars { @@ -677,16 +636,16 @@ void main() float size = 1.4+0.2*sin(iTime*20.); size *= smoothstep(0.5,1.,excited); float star = star2d(p, size, .5); - vec3 starColor = mix(vec3(1.,.6,0.), vec3(1.,.2,0.), smoothstep(-.1,.6, star2d(p, size*.5, .5)))*1.3; + float starColor = mix(.55, .4, smoothstep(-.1,.6, star2d(p, size*.5, .5)))*1.3; col = mix(col, starColor, smoothstep(0.,-0.01, star) * excited); } // vignetting - col /= (1.+pow(length(uv*2.-1.),4.)*.04); + col /= 1.+pow(length(uv*2.-1.),4.)*.04; // gamma correction - fragColor = vec4( pow(col, vec3(1./2.2)), 1.); + fragColor = vec4( pow(col, 1./2.2) ); } diff --git a/Intro/src/shaders/mouton.frag.klproj b/Intro/src/shaders/mouton.frag.klproj index 0daa5af0db910fa911269a2325d00bbf2273905c..20976a69d02ef05f792ffc4b4b83330bcbb2e744 100644 GIT binary patch delta 43 zcmV+`0M!4ch5@UF0kB8`7sKM94VWvkWSM_NlQfP-7ycv|u`DMmvswYjK?K6e_r!*$ B5_A9n delta 38 wcmV+>0NMYmh5@FA0kB8`5(A;A%93UN5lzxK8eRC4U{olxUjfKL1kJwp!8T_R9{>OV diff --git a/Intro/src/shaders/postprocess.frag b/Intro/src/shaders/postprocess.frag index 114fdb6..8792a52 100644 --- a/Intro/src/shaders/postprocess.frag +++ b/Intro/src/shaders/postprocess.frag @@ -5,55 +5,6 @@ const vec2 iResolution = vec2(1280.,720.); uniform sampler2D prevPass; uniform float iTime; -/* -vec3 hash3(vec3 p) { - uvec3 x = uvec3((p)*100000.); - const uint k = 1103515245U; - x = ((x>>8U)^x.yzx)*k; - x = ((x>>8U)^x.yzx)*k; - x = ((x>>8U)^x.yzx)*k; - - return vec3(x)*(1.0/float(0xffffffffU))-.5; -} - - -float simplex3d(vec3 p) { - const float F3 = 0.3333333; - const float G3 = 0.1666667; - - vec3 s = floor(p + dot(p, vec3(F3))); - vec3 x = p - s + dot(s, vec3(G3)); - - vec3 e = step(vec3(0.0), x - x.yzx); - vec3 i1 = e*(1.0 - e.zxy); - vec3 i2 = 1.0 - e.zxy*(1.0 - e); - - vec3 x1 = x - i1 + G3; - vec3 x2 = x - i2 + 2.0*G3; - vec3 x3 = x - 1.0 + 3.0*G3; - - vec4 w, d; - - w.x = dot(x, x); - w.y = dot(x1, x1); - w.z = dot(x2, x2); - w.w = dot(x3, x3); - - w = max(0.6 - w, 0.0); - - d.x = dot(hash3(s), x); - d.y = dot(hash3(s + i1), x1); - d.z = dot(hash3(s + i2), x2); - d.w = dot(hash3(s + 1.0), x3); - - w *= w; - w *= w; - d *= w; - - return dot(d, vec4(52.0)); -} -*/ - vec2 uv; float rand(vec2 co){ @@ -73,12 +24,13 @@ float randomLine(float seed) float l = 1.0; - if ( mu > 0.2) - l = pow( abs(a * uv.x + b * uv.y + c ), 1.0/16.0 ); - else - l = 2.0 - pow( abs(a * uv.x + b * uv.y + c), 1.0/8.0 ); + l = pow( abs(a * uv.x + b * uv.y + c ), 1.0/16.0 ); + //if ( mu > 0.2) + + // else +// l = 2.0 - pow( abs(a * uv.x + b * uv.y + c), 1.0/16.0 ); - return mix(0.5, 1.0, l); + return mix(0.5, 1.0, mu > 0.2 ? l : 2. - l); } // Generate some blotches. @@ -115,28 +67,13 @@ void main(void) vec2 suv = uv + 0.004 * vec2( rand(t), rand(t + 23.0)); vec2 offset = (suv*2.-1.)*invRes.x*.5; - - // chromatic aberration - vec3 col = texture(prevPass,suv+offset).rgb; - - - //col.r = texture(prevPass,suv+offset).r; - //col.g = texture(prevPass,suv).g; - //col.b = texture(prevPass,suv-offset).b; - - // filmic grain - /* - vec3 grain = vec3(simplex3d(vec3( gl_FragCoord.xy * invRes.y * 250., iTime*5.))); - float luminance = dot(col, vec3(0.2126,0.7152,0.0722)); - col += (grain) * (1.-pow(luminance,.25)) * .1; - */ + float col = texture(prevPass,suv+offset).r; // fade in col *= smoothstep(0.,10., iTime); const float endTime = 160.; - { // Circle to black float circle = length(gl_FragCoord.xy/iResolution.xx - vec2(.5,.3)); float t2 = max(.137, smoothstep(endTime+1., endTime, iTime)); @@ -147,9 +84,8 @@ void main(void) float alpha = smoothstep(0.135, .136, f) * smoothstep(endTime+1., endTime+2., iTime); f = fract(23. * pow(f, .25)); f -= smoothstep(0.95, 0.99, f); - vec3 col2 = mix(vec3(1.,.6,.0), vec3(1.,.0,0.), pow(f,1.)); + float col2 = mix(.55, .35, pow(f,1.)); col = mix(col, col2, alpha); - } // Create a time-varying vignetting effect float vI = 16.0 * (uv.x * (1.0-uv.x) * uv.y * (1.0-uv.y)); @@ -173,15 +109,10 @@ void main(void) // Add some grain col *= 1.0+(rand(uv+t*.01)-.2)*.15; - // Monochrome - float luma = dot( vec3(0.2126, 0.7152, 0.0722), col); - col = luma * vec3(0.7, 0.7, 0.7); - // col = mix(col, luma * vec3(0.7, 0.7, 0.7), 1.); // desaturated - - col.b = pow(col.r, 0.9); // slightly blue-ish + col *= .7; // Fade out col *= smoothstep(endTime+5., endTime+4., iTime); - fragColor = vec4(col,1.); + fragColor = vec4(col, col, col, 1.); } diff --git a/Intro/src/shaders/shaders.inl b/Intro/src/shaders/shaders.inl index b3c56ca..9e88dbd 100644 --- a/Intro/src/shaders/shaders.inl +++ b/Intro/src/shaders/shaders.inl @@ -61,25 +61,20 @@ const char *mouton_frag = "y=(y>>8U^y.yzx)*1103515245U;" "return vec3(y)*(1./float(-1U));" "}" - "vec3 g(vec3 v,vec2 m,float y)" + "float g(vec3 i,vec2 v,float m)" "{" - "vec3 f=vec3(1);" - "float i=max(dot(v,r),0.);" - "f+=vec3(1,.7,.3)*pow(i,1.);" - "f+=vec3(1,.5,.1)*pow(i,52.);" - "f=vec3(1)*y*y;" - "float c=int(t*12)/12.;" + "float y=m*m,c=int(t*12)/12.;" "vec2 x=vec2(cos(c*.7+2.4),sin(c*.7+2.4)*.75);" - "float s=smoothstep(.151,.15,length(m-x));" - "s*=smoothstep(.15,.1501,length(m-x-vec2(.1,.025)));" - "s+=exp(-length(m-x)*2.)*.1;" - "s*=smoothstep(.5,0.,r.y);" - "vec2 d=m*2e2,a=fract(d)-.5,z=floor(d);" - "vec3 l=g(vec3(abs(z),abs(z.x)));" - "float u=l.z*.1;" - "s+=smoothstep(u,u*.01,length(l.xy-.5+a))*(cos(c*l.y+l.z*3.14)*.5+.5);" - "f+=s*smoothstep(.5,-1.,r.y);" - "return f;" + "float f=smoothstep(.151,.15,length(v-x));" + "f*=smoothstep(.15,.1501,length(v-x-vec2(.1,.025)));" + "f+=exp(-length(v-x)*2.)*.1;" + "f*=smoothstep(.5,0.,r.y);" + "vec2 d=v*2e2,a=fract(d)-.5,s=floor(d);" + "vec3 l=g(vec3(abs(s),abs(s.x)));" + "float z=l.z*.1;" + "f+=smoothstep(z,z*.01,length(l.xy-.5+a))*(cos(c*l.y+l.z*3.14)*.5+.5);" + "y+=f*smoothstep(.5,-1.,r.y);" + "return y;" "}" "float h(float v)" "{" @@ -88,8 +83,8 @@ const char *mouton_frag = "float C(vec3 v)" "{" "vec3 m=floor(v),s=fract(v),y=s*s*s*(s*(s*6.-15.)+10.);" - "float x=m.x+317.*m.y+157.*m.z,z=h(x),c=h(x+1.),d=h(x+317.),a=h(x+318.),f=h(x+157.),u=h(x+158.),p=h(x+474.),r=h(x+475.);" - "return-1.+2.*(z+(c-z)*y.x+(d-z)*y.y+(f-z)*y.z+(z-c-d+a)*y.x*y.y+(z-d-f+p)*y.y*y.z+(z-c-f+u)*y.z*y.x+(-z+c+d-a+f-u-p+r)*y.x*y.y*y.z);" + "float x=m.x+317.*m.y+157.*m.z,c=h(x),d=h(x+1.),a=h(x+317.),z=h(x+318.),f=h(x+157.),u=h(x+158.),p=h(x+474.),t=h(x+475.);" + "return-1.+2.*(c+(d-c)*y.x+(a-c)*y.y+(f-c)*y.z+(c-d-a+z)*y.x*y.y+(c-a-f+p)*y.y*y.z+(c-d-f+u)*y.z*y.x+(-c+d+a-z+f-u-p+t)*y.x*y.y*y.z);" "}" "vec2 B(vec3 v)" "{" @@ -108,8 +103,8 @@ const char *mouton_frag = "}" "mat2 A(float v)" "{" - "float y=cos(v),x=sin(v);" - "return mat2(y,x,-x,y);" + "float y=cos(v),c=sin(v);" + "return mat2(y,c,-c,y);" "}" "float A(vec3 v,vec3 y)" "{" @@ -149,18 +144,18 @@ const char *mouton_frag = "}" "float A(vec3 v,float y,float i,float x)" "{" - "vec2 m=vec2(length(v.xz),v.y),c=vec2(x,y),z=vec2(x-i,2.*y),d=vec2(m.x-min(m.x,m.y<0.?" + "vec2 m=vec2(length(v.xz),v.y),c=vec2(x,y),d=vec2(x-i,2.*y),f=vec2(m.x-min(m.x,m.y<0.?" "i:" - "x),abs(m.y)-y),f=m-c+z*clamp(dot(c-m,z)/dot(z,z),0.,1.);" - "return(f.x<0.&&d.y<0.?" + "x),abs(m.y)-y),z=m-c+d*clamp(dot(c-m,d)/dot(d,d),0.,1.);" + "return(z.x<0.&&f.y<0.?" "-1.:" - "1.)*sqrt(min(dot(d,d),dot(f,f)));" + "1.)*sqrt(min(dot(f,f),dot(z,z)));" "}" "float B(vec3 v,vec3 y,vec3 m,float x)" "{" - "vec3 c=v-y,z=m-y;" - "float i=clamp(dot(c,z)/dot(z,z),0.,1.);" - "return length(c-z*i)-x;" + "vec3 c=v-y,d=m-y;" + "float i=clamp(dot(c,d)/dot(d,d),0.,1.);" + "return length(c-d*i)-x;" "}" "float C(vec3 v,vec2 y)" "{" @@ -169,8 +164,8 @@ const char *mouton_frag = "}" "float D(vec3 v,vec3 y)" "{" - "float c=length(v/y),x=length(v/(y*y));" - "return c*(c-1.)/x;" + "float c=length(v/y),d=length(v/(y*y));" + "return c*(c-1.)/d;" "}" "vec2 F(vec3 v)" "{" @@ -215,12 +210,12 @@ const char *mouton_frag = "v.y-=1.;" "v.z-=-2.;" "float x=c*y.x;" - "vec3 z=vec3(cos(x*U),cos(x*U*2.)*.1,0)*.025*m.x;" - "float i=length(v*vec3(1,1,.825)-vec3(0,1.5,2.55)-z)-2.;" - "if(i<3.)" + "vec3 i=vec3(cos(x*U),cos(x*U*2.)*.1,0)*.025*m.x;" + "float d=length(v*vec3(1,1,.825)-vec3(0,1.5,2.55)-i)-2.;" + "if(d<3.)" "{" - "float d=pow(C((v-z-vec3(.05,0,0))*2.)*.5+.5,.75)*2.-1.;" - "i=i+.05-d*.2;" + "float z=pow(C((v-i-vec3(.05,0,0))*2.)*.5+.5,.75)*2.-1.;" + "d=d+.05-z*.2;" "float a=mod(c*y.x,2.);" "vec4 u=vec4(0),r=vec4(0);" "float n=smoothstep(0.,.5,a),p=smoothstep(.5,1.,a),w=smoothstep(1.,1.5,a),I=smoothstep(1.5,2.,a);" @@ -266,7 +261,7 @@ const char *mouton_frag = "F*=vec3(.7,1,.7);" "float H=length(D-vec3(0,.35,-.1))-.55;" "H-=(cos(D.z*8.+D.y*4.5+D.x*4.)+cos(D.z*4.+D.y*6.5+D.x*8.))*.05;" - "H=A(H,i,.1);" + "H=A(H,d,.1);" "F=D;" "F.yz=A(-.6)*F.yz;" "F.x=abs(v.x)-.8;" @@ -281,8 +276,8 @@ const char *mouton_frag = "F.xz=A(-.45)*F.xz;" "float L=C(F-vec3(-.7,-1.2,-2),vec2(.15*k,.05)),M=B(v-vec3(0,-.1,cos(v.y-.7)*.5),vec3(cos(c*y.z)*m.z,.2,5),vec3(0,2,4.9),.2);" "M-=(cos(v.z*8.+v.y*4.5+v.x*4.)+cos(v.z*4.+v.y*6.5+v.x*3.))*.02;" - "M=A(i,M,.1);" - "vec2 N=vec2(i,1);" + "M=A(d,M,.1);" + "vec2 N=vec2(d,1);" "N=h(N,vec2(M,1));" "N=h(N,vec2(H,1));" "N=h(N,vec2(g,2));" @@ -293,12 +288,12 @@ const char *mouton_frag = "N=h(N,vec2(J,2));" "return N;" "}" - "return vec2(i,1);" + "return vec2(d,1);" "}" - "float C(vec3 v,vec2 y,float f)" + "float C(vec3 v,vec2 y,float c)" "{" - "vec3 c=abs(v);" - "return max(c.z-y.y,B(B(v.x*.866025+v.y*.5,-v.x*.866025+v.y*.5,f),-v.y,f)-y.x*.5);" + "vec3 m=abs(v);" + "return max(m.z-y.y,B(B(v.x*.866025+v.y*.5,-v.x*.866025+v.y*.5,c),-v.y,c)-y.x*.5);" "}" "vec2 H(vec3 v)" "{" @@ -333,8 +328,8 @@ const char *mouton_frag = "float f=0.,c=1.;" "for(int d=1;d<=2;d++)" "{" - "float m=float(d)/2*i,z=I(v+m*y).x;" - "f+=(m-z)*c;" + "float m=float(d)/2*i,a=I(v+m*y).x;" + "f+=(m-a)*c;" "c*=.95;" "}" "return max(0.,1.-x*1.5*f);" @@ -342,77 +337,77 @@ const char *mouton_frag = "float E(vec3 v,vec3 y)" "{" "vec3 c=1./y;" - "float m=9e7,f;" - "vec2 d=g(v-s-vec3(0,3,-2),y,vec3(3,3,7),c);" - "if(d.y>0.)" + "float d=9e7,f;" + "vec2 m=g(v-s-vec3(0,3,-2),y,vec3(3,3,7),c);" + "if(m.y>0.)" "{" - "f=max(d.x,0.);" + "f=max(m.x,0.);" "for(int u=0;u<128;u++)" "{" "vec3 a=v+y*f;" "float t=h(vec2(a.y,0),G(a)).x;" "f+=t;" - "if(f>d.y||abs(t)<.001)" + "if(f>m.y||abs(t)<.001)" "break;" "}" - "if(f0.)" + "m=g(v-i-vec3(0,5,-5),y,vec3(1.5,5,1),c);" + "if(m.y>0.)" "{" - "f=max(d.x,0.);" + "f=max(m.x,0.);" "for(int u=0;u<128;u++)" "{" "float a=E(v+y*f).x;" "f+=a;" - "if(f>d.y||abs(a)<.001)" + "if(f>m.y||abs(a)<.001)" "break;" "}" - "if(f0.)" + "m=g(v-z-vec3(0,5,-5),y,vec3(1.5,5,1),c);" + "if(m.y>0.)" "{" - "f=max(d.x,0.);" + "f=max(m.x,0.);" "for(int u=0;u<128;u++)" "{" "float a=H(v+y*f).x;" "f+=a;" - "if(f>d.y||abs(a)<.001)" + "if(f>m.y||abs(a)<.001)" "break;" "}" - "if(f0.)" + "m=g(v-x-vec3(0,5,0),y,vec3(2,5,1),c);" + "if(m.y>0.)" "{" - "f=max(d.x,0.);" + "f=max(m.x,0.);" "for(int u=0;u<128;u++)" "{" "float a=F(v+y*f).x;" "f+=a;" - "if(f>d.y||abs(a)<.001)" + "if(f>m.y||abs(a)<.001)" "break;" "}" - "if(f0.)" + "m=g(v-n-vec3(0,3,2),y,vec3(4,4,5),c);" + "if(m.y>0.)" "{" - "f=max(d.x,0.);" + "f=max(m.x,0.);" "for(int u=0;u<128;u++)" "{" "float a=D(v+y*f).x;" "f+=a;" - "if(f>d.y||abs(a)<.001)" + "if(f>m.y||abs(a)<.001)" "break;" "}" - "if(f0.&&length((v+y*f).xz-n.xz)<10.)" @@ -423,16 +418,16 @@ const char *mouton_frag = "vec3 a=v+y*f;" "float t=min(a.y,B(a).x);" "f+=t;" - "if(f>d.y||abs(t)<.001)" + "if(f>m.y||abs(t)<.001)" "break;" "}" "if(f<1e2)" - "m=min(m,f);" + "d=min(d,f);" "}" "f=-v.y*c.y;" "if(f>0.)" - "m=min(m,f);" - "return m;" + "d=min(d,f);" + "return d;" "}" "vec3 J(vec3 v)" "{" @@ -457,140 +452,121 @@ const char *mouton_frag = "}" "return clamp(f,0.,1.);" "}" - "float E(vec2 v,float y,float x,float f)" + "float E(vec2 v,float y,float i,float c)" "{" "v.x=abs(v.x);" - "float c=(y-x)/f,d=sqrt(1.-c*c),m=dot(v,vec2(-c,d));" + "float f=(y-i)/c,d=sqrt(1.-f*f),m=dot(v,vec2(-f,d));" "return m<0.?" "length(v)-y:" - "m>d*f?" - "length(v-vec2(0,f))-x:" - "dot(v,vec2(d,c))-y;" + "m>d*c?" + "length(v-vec2(0,c))-i:" + "dot(v,vec2(d,f))-y;" "}" - "vec3 A(vec3 v,vec3 f,vec3 y,vec3 c,vec2 m)" + "float A(vec3 v,vec3 y,vec3 m,vec3 c,vec2 f)" "{" - "vec2 a=I(y);" - "float s=smoothstep(0.,.3,r.y)+.1,u=C(y,c,.15,1.);" - "u*=C(y,c,1.,.1)*.5;" - "float l=D(y,r,.08,50.),n=clamp(1.+dot(f,c),0.,5.);" - "vec3 F=vec3(1,.8,.7)*max(dot(c,r),0.)*pow(vec3(l),vec3(1,1.2,1.5)),N=vec3(1,.8,.7)*.1*max(dot(c,-r),0.)*u,G=vec3(.5)*mix(C(y,f,.3,.75),C(y,r,.3,.75),.5),w=vec3(1)*max(dot(reflect(f,c),r),0.),k=vec3(.4,.45,.5)*u,M=vec3(0),H=vec3(0);" + "vec2 a=I(m);" + "float s=smoothstep(0.,.3,r.y)+.1,u=C(m,c,.15,1.);" + "u*=C(m,c,1.,.1)*.5;" + "float l=D(m,r,.08,50.),n=clamp(1.+dot(y,c),0.,5.),F=.85*max(dot(c,r),0.)*pow(l,1.2),N=.085*max(dot(c,-r),0.)*u,G=.45*u,w=0.,H=0.;" "if(a.y==0.)" - "H=vec3(3),G=vec3(0),w=vec3(0);" + "H=3.;" "else" " if(a.y==1.)" - "H=vec3(.4),G*=vec3(1)*(n*.5+.5),M=vec3(.35),w=pow(w,vec3(4))*n*.25;" + "H=.4,w=.35;" "else" " if(a.y==4.)" - "H=vec3(.025),G=vec3(0),w=pow(w,vec3(80))*n*10.;" + "H=.025;" "else" " if(a.y==3.)" "{" - "G*=.5;" - "H=vec3(1);" - "float J=dot(c,normalize(vec3(0,0,1))),B=dot(c,d),h=smoothstep(-.953,-.952,B-o/2.);" - "H*=h;" - "w*=h;" + "float J=dot(c,normalize(vec3(0,0,1))),M=dot(c,d),h=smoothstep(-.953,-.952,M-o/2.);" + "H=h;" "if(J>0.||e>.95)" "a.y=2.;" - "w=pow(w,vec3(80))*n*3.;" "}" "else" " if(a.y==5.)" - "H=vec3(1),G=vec3(0),w=pow(w,vec3(8))*n*2.;" + "H=1.;" "else" " if(a.y==6.)" "{" - "vec3 J=y-z;" - "G=vec3(0);" - "w=pow(w,vec3(8))*n*10.;" + "vec3 J=m-z;" "if(c.z>.5)" "{" - "float B=C(J-vec3(0,7.5,-5),vec2(1.3,.2),.01);" - "H=vec3(1.5,0,0);" - "float U=smoothstep(.13,.1295,distance(J,vec3(0,7.1,-4.9)));" - "U+=smoothstep(.005,0.,E(J.xy-vec2(0,7.34),.06,.14,1.));" - "H=mix(H,vec3(2),smoothstep(.005,0.,B));" - "H=mix(H,vec3(0),U);" + "float M=C(J-vec3(0,7.5,-5),vec2(1.3,.2),.01);" + "H=.5;" + "float k=smoothstep(.13,.1295,distance(J,vec3(0,7.1,-4.9)));" + "k+=smoothstep(.005,0.,E(J.xy-vec2(0,7.34),.06,.14,1.));" + "H=mix(H,2.,smoothstep(.005,0.,M));" + "H=mix(H,0.,k);" "}" "else" - " H=vec3(1);" + " H=1.;" "}" "else" " if(a.y==7.)" "{" - "vec3 J=y-i;" - "G=vec3(0);" - "w=pow(w,vec3(8))*n*10.;" + "vec3 J=m-i;" "if(c.z>.5)" "{" - "H=vec3(0,0,1.5);" + "H=.5;" "J.y-=7.4;" - "float B=A(J-vec3(0,.1,-5),vec3(.8,.8,1)),U=0.;" + "float M=A(J-vec3(0,.1,-5),vec3(.8,.8,1)),k=0.;" "J.xy=A(.8)*J.xy;" "float K=.04;" - "U+=smoothstep(.01,0.,E(J.xy-vec2(-K,-.6),.1,.05,1.));" - "U+=smoothstep(.01,0.,E(J.xy-vec2(-K,.5),.16,.135,.15));" - "U*=smoothstep(0.,.01,E(J.xy-vec2(-K-.08,.56),.001,.02,.2));" - "U*=smoothstep(0.,.01,E(J.xy-vec2(-K+.04,.56),.001,.02,.2));" + "k+=smoothstep(.01,0.,E(J.xy-vec2(-K,-.6),.1,.05,1.));" + "k+=smoothstep(.01,0.,E(J.xy-vec2(-K,.5),.16,.135,.15));" + "k*=smoothstep(0.,.01,E(J.xy-vec2(-K-.08,.56),.001,.02,.2));" + "k*=smoothstep(0.,.01,E(J.xy-vec2(-K+.04,.56),.001,.02,.2));" "J.xy=A(-1.6)*J.xy;" - "U+=smoothstep(.01,0.,E(J.xy-vec2(K,-.6),.1,.05,1.));" - "U+=smoothstep(.01,0.,E(J.xy-vec2(K,.5),.16,.1,.15));" - "H=mix(H,vec3(2),smoothstep(.01,0.,B));" - "H=mix(H,vec3(0),U);" + "k+=smoothstep(.01,0.,E(J.xy-vec2(K,-.6),.1,.05,1.));" + "k+=smoothstep(.01,0.,E(J.xy-vec2(K,.5),.16,.1,.15));" + "H=mix(H,2.,smoothstep(.01,0.,M));" + "H=mix(H,0.,k);" "}" "else" - " H=vec3(1);" + " H=1.;" "}" "else" " if(a.y==8.)" "{" - "vec3 J=y-x;" + "vec3 J=m-x;" "J.x+=cos(.775+t)*3.1*.2;" "J.y-=2.8;" "J.zy=A(.75)*J.zy;" - "H=mix(vec3(2,.75,0),vec3(2,2,0),smoothstep(0.,.45,length(J-vec3(0,.3,0))))*1.8;" - "G=vec3(.01);" - "w=vec3(0);" + "H=mix(.9,1.3,smoothstep(0.,.45,length(J-vec3(0,.3,0))))*1.8;" "}" "else" " if(a.y==10.)" - "H=vec3(0,.05,0),G*=vec3(1),w*=vec3(1)*n;" + "H=.02;" "else" " if(a.y==9.)" "{" - "vec3 J=y-x;" + "vec3 J=m-x;" "J.x+=cos(.775+t)*3.1*.2;" "J.y-=2.8;" "J.zy=A(.75)*J.zy;" - "H=mix(vec3(1)+.5,vec3(.75,.5,1),smoothstep(.5,1.1,length(J-vec3(0,.3,0))))*2.;" - "G*=0.;" - "w=pow(w,vec3(4))*n;" + "H=mix(1.5,.7,smoothstep(.5,1.1,length(J-vec3(0,.3,0))))*2.;" "}" "else" " if(a.y==11.)" - "H=vec3(1),F*=vec3(.1)*n,k*=vec3(.1)*n,N*=vec3(0)*n,G=vec3(0),w=pow(w,vec3(100))*n*2.;" + "H=1.,F*=.1*n,G*=.1*n,N=0.;" "else" " if(a.y==12.)" "{" - "H=vec3(1,.01,.01)*.3;" + "H=.7;" "float J=n*n;" - "F*=vec3(3);" - "k*=vec3(2)*J;" - "N*=vec3(1);" - "G*=vec3(0);" - "w=vec3(1,.3,.3)*pow(w,vec3(500))*5.;" + "F*=3.;" + "G*=2.*J;" "}" "if(a.y==2.)" - "H=vec3(1,.7,.5),k*=vec3(1,.75,.75),G=pow(G,vec3(.5,2.5,5)+2.)*2.,w=pow(w,vec3(4))*n*.02;" - "G=vec3(0);" - "w=vec3(0);" - "vec3 J=(H*(k+F*.5+N*2.+G*2.)+w*l+M)*s;" - "float B=length(y-v);" - "J=mix(J,g(f,m,s),smoothstep(90.,1e2,B));" + "H=.8,G*=.8;" + "float J=(H*(G+F*.5+N*2.)+w)*s,M=length(m-v);" + "J=mix(J,g(y,f,s),smoothstep(90.,1e2,M));" "if(a.y==0.)" "{" - "float U=cos(atan(m.x,m.y)*15.+t*3.),K=length(m)*.5;" - "J=mix(J,mix(vec3(1,.5,0),vec3(1),smoothstep(-K,K,U)),p);" + "float k=cos(atan(f.x,f.y)*15.+t*3.),K=length(f)*.5;" + "J=mix(J,mix(.5,1.,smoothstep(-K,K,k)),p);" "}" "return clamp(J,0.,1.);" "}" @@ -602,9 +578,9 @@ const char *mouton_frag = "v-=2.*max(dot(f,v),0.)*f;" "v.x=abs(v.x);" "v.y-=y;" - "vec2 x=m*vec2(-c.y,c.x)-vec2(0,1);" - "float i=clamp(dot(v,x)/dot(x,x),0.,y);" - "return length(v-x*i)*sign(v.y*x.x-v.x*x.y);" + "vec2 d=m*vec2(-c.y,c.x)-vec2(0,1);" + "float x=clamp(dot(v,d)/dot(d,d),0.,y);" + "return length(v-d*x)*sign(v.y*d.x-v.x*d.y);" "}" "void main()" "{" @@ -612,7 +588,8 @@ const char *mouton_frag = "d.x*=v.x*y.y;" "vec3 i=c,x=a,z=B(i,x)*normalize(vec3(d,u-length(d)*w));" "float s=E(i,z);" - "vec3 H=i+z*s,G=J(H),e=A(i,z,H,G,d);" + "vec3 H=i+z*s,G=J(H);" + "float e=A(i,z,H,G,d);" "{" "vec2 r=d*5.;" "r.x=abs(r.x-.3)-1.5;" @@ -620,12 +597,11 @@ const char *mouton_frag = "r=A(t*5.)*r;" "float N=1.4+.2*sin(t*20.);" "N*=smoothstep(.5,1.,p);" - "float l=D(r,N,.5);" - "vec3 n=mix(vec3(1,.6,0),vec3(1,.2,0),smoothstep(-.1,.6,D(r,N*.5,.5)))*1.3;" - "e=mix(e,n,smoothstep(0.,-.01,l)*p);" + "float M=D(r,N,.5),n=mix(.55,.4,smoothstep(-.1,.6,D(r,N*.5,.5)))*1.3;" + "e=mix(e,n,smoothstep(0.,-.01,M)*p);" "}" "e/=1.+pow(length(m*2.-1.),4.)*.04;" - "f=vec4(pow(e,vec3(1./2.2)),1);" + "f=vec4(pow(e,1./2.2));" "}"; const char *mouton_vert = @@ -697,11 +673,11 @@ const char *mouton_vert = "else" " if(v<55.)" "{" - "float f=v-50.,G=smoothstep(2.,2.5,f);" - "l.y=mix(.25,0.,G);" - "m=vec3(1.-G,.2*(1.-G),1);" + "float f=v-50.,H=smoothstep(2.,2.5,f);" + "l.y=mix(.25,0.,H);" + "m=vec3(1.-H,.2*(1.-H),1);" "y=vec3(1,1,.5);" - "d=normalize(vec3(G*.3,.3-G*.3,1));" + "d=normalize(vec3(H*.3,.3-H*.3,1));" "o=smoothstep(4.6,4.8,f)*.2;" "u=4.;" "c=vec3(0,3,-4);" @@ -719,10 +695,10 @@ const char *mouton_vert = "o=.2;" "m=vec3(0,0,1);" "y=vec3(3,1.5,6);" - "float G=smoothstep(0.,.5,f);" - "u=mix(4.,3.,G);" + "float H=smoothstep(0.,.5,f);" + "u=mix(4.,3.,H);" "c=vec3(0,3,-4);" - "a=mix(vec3(0,3,0),vec3(-5,5,-9),G);" + "a=mix(vec3(0,3,0),vec3(-5,5,-9),H);" "}" "else" " if(v<65.)" @@ -755,24 +731,24 @@ const char *mouton_vert = "float f=v-70.;" "m=vec3(1);" "y=vec3(3,1.5,8);" - "float G=mod(f,8.),H=smoothstep(.5,1.,G)*smoothstep(2.8,2.5,G)-smoothstep(4.,4.5,G)*smoothstep(5.8,5.5,G)+cos(t)*.2;" - "d=normalize(vec3(H,cos(t*.5)*.1+.1,1));" + "float H=mod(f,8.),J=smoothstep(.5,1.,H)*smoothstep(2.8,2.5,H)-smoothstep(4.,4.5,H)*smoothstep(5.8,5.5,H)+cos(t)*.2;" + "d=normalize(vec3(J,cos(t*.5)*.1+.1,1));" "w=.3;" "u=2.5;" "c=vec3(2.75,1,-5.25);" "a=vec3(0,2.3,0);" - "float J=mod(f,2.);" - "k+=smoothstep(.5,.6,J)*smoothstep(.7,.6,J)*.3;" - "J=mod(f+.3,3.);" - "k+=smoothstep(.5,.6,J)*smoothstep(.7,.6,J)*.3;" + "float F=mod(f,2.);" + "k+=smoothstep(.5,.6,F)*smoothstep(.7,.6,F)*.3;" + "F=mod(f+.3,3.);" + "k+=smoothstep(.5,.6,F)*smoothstep(.7,.6,F)*.3;" "}" "else" " if(v<85.)" "{" - "float f=v-80.,G=smoothstep(1.,3.,f);" - "m=vec3(0,1.-G*.5,1);" + "float f=v-80.,H=smoothstep(1.,3.,f);" + "m=vec3(0,1.-H*.5,1);" "y=vec3(3,1.5,6);" - "d=normalize(vec3(G*.5,.3-G*.45,1));" + "d=normalize(vec3(H*.5,.3-H*.45,1));" "u=4.;" "c=vec3(0,3,-4);" "a=vec3(0,3,0);" @@ -788,10 +764,10 @@ const char *mouton_vert = "d=normalize(vec3(.5,-.15,1));" "m=vec3(0,.5,1);" "y=vec3(3,1.5,6);" - "float G=smoothstep(0.,1.,f);" - "u=mix(4.,3.,G);" + "float H=smoothstep(0.,1.,f);" + "u=mix(4.,3.,H);" "c=vec3(0,3,-4);" - "a=mix(vec3(0,3,0),vec3(-5,5,-9),G);" + "a=mix(vec3(0,3,0),vec3(-5,5,-9),H);" "}" "else" " if(v<97.)" @@ -812,11 +788,11 @@ const char *mouton_vert = "else" " if(v<107.)" "{" - "float f=v-98.,G=smoothstep(6.,9.,f);" + "float f=v-98.,H=smoothstep(6.,9.,f);" "s=vec3(0,0,f*.25-11.);" "z=vec3(-2,0,-8);" - "d=normalize(vec3(-.5,.25-G,1));" - "l.y=.5-G;" + "d=normalize(vec3(-.5,.25-H,1));" + "l.y=.5-H;" "m=vec3(1,.2,.5);" "y=vec3(-1,1,1)*.5;" "c=vec3(18,5,-5);" @@ -839,12 +815,12 @@ const char *mouton_vert = "else" " if(v<116.)" "{" - "float f=v-109.,G=sin(min(f,5.));" + "float f=v-109.,H=sin(min(f,5.));" "m=vec3(0);" "y=vec3(0);" - "d=normalize(vec3(G*.7,0,1));" + "d=normalize(vec3(H*.7,0,1));" "d=normalize(mix(d,vec3(-.3,.2,1),smoothstep(5.2,5.4,f)));" - "l.x=G*.25;" + "l.x=H*.25;" "o=smoothstep(6.,6.2,f)*.2;" "s=vec3(0,(smoothstep(6.,6.2,f)-smoothstep(6.2,6.4,f))*.4,0);" "u=3.5;" @@ -858,11 +834,11 @@ const char *mouton_vert = "s=vec3(9e7);" "z=vec3(-2,0,-8);" "x=vec3(5,0,-20);" - "float G=smoothstep(.5,1.5,f);" - "u=mix(3.5,5.,G);" + "float H=smoothstep(.5,1.5,f);" + "u=mix(3.5,5.,H);" "c=vec3(0,5.5,2);" - "a=mix(vec3(-.5,5.75,0),vec3(5,2,-20),G);" - "p=G*.3;" + "a=mix(vec3(-.5,5.75,0),vec3(5,2,-20),H);" + "p=H*.3;" "}" "else" " if(v<137.)" @@ -871,19 +847,19 @@ const char *mouton_vert = "m=vec3(.1);" "y=vec3(.2);" "u=2.8+f*.15;" - "int J=int(f);" - "if(J%4==1)" + "int H=int(f);" + "if(H%4==1)" "z=vec3(0,0,-8),c=vec3(2.5,2,-1),a=vec3(1,5.25,-8),u=2.8+pow(f*.3,1.2);" "else" - " if(J%4==3)" + " if(H%4==3)" "x=vec3(4,0,-8),c=vec3(0,5.5,2),a=vec3(4,3,-8),p=.3;" "else" " c=vec3(0,2.4,-8),a=vec3(0,3,0);" - "float G=smoothstep(.3,.7,fract(f));" - "if(J%4==0)" - "G=1.-G;" - "l.x=-G*.1;" - "d=normalize(mix(vec3(.1,-.25,1),vec3(-.2,.2,1),G));" + "float F=smoothstep(.3,.7,fract(f));" + "if(H%4==0)" + "F=1.-F;" + "l.x=-F*.1;" + "d=normalize(mix(vec3(.1,-.25,1),vec3(-.2,.2,1),F));" "d=normalize(d+vec3(cos(f*10.),cos(f*5.),1)*.01);" "}" "else" @@ -909,8 +885,8 @@ const char *mouton_vert = "x=vec3(0,-.5,-30);" "m=vec3(1,1,.5);" "y=vec3(3,1.5,8);" - "float G=smoothstep(0.,10.,f);" - "c=vec3(-2,3.5,mix(-10.,-33.,G));" + "float H=smoothstep(0.,10.,f);" + "c=vec3(-2,3.5,mix(-10.,-33.,H));" "a=vec3(2,2,-3.-f*2.);" "u=3.;" "}" @@ -926,8 +902,8 @@ const char *mouton_vert = "c=vec3(-20,6,-13)+vec3(cos(f*72.),cos(f*64.),sin(f*48.))*3.*smoothstep(.09,.1,f)*smoothstep(.7,.1,f);" "a=vec3(3,2,-23);" "u=mix(4.,4.2,smoothstep(0.,5.,f));" - "float G=smoothstep(.1,0.,f)*13.;" - "n=vec3(0,G,-22);" + "float H=smoothstep(.1,0.,f)*13.;" + "n=vec3(0,H,-22);" "}" "else" "{" @@ -938,10 +914,10 @@ const char *mouton_vert = "x=vec3(1,0,-25);" "a=vec3(2,3.8,-18);" "c=vec3(5,5,2);" - "float G=smoothstep(1.5,2.,f);" - "u=2.5+G*3.5;" + "float H=smoothstep(1.5,2.,f);" + "u=2.5+H*3.5;" "n=vec3(7,0,-20);" - "p=G*.5;" + "p=H*.5;" "}" "}"; @@ -952,25 +928,25 @@ const char *fxaa_frag = "uniform sampler2D M;" "vec3 E(vec4 v,sampler2D f,vec2 y)" "{" - "vec3 c=textureLod(f,v.zw,0.).xyz,d=textureLod(f,v.zw+vec2(1,0)*y.xy,0.).xyz,m=textureLod(f,v.zw+vec2(0,1)*y.xy,0.).xyz,a=textureLod(f,v.zw+vec2(1)*y.xy,0.).xyz,x=textureLod(f,v.xy,0.).xyz,G=vec3(.299,.587,.114);" - "float i=dot(c,G),z=dot(d,G),s=dot(m,G),u=dot(a,G),w=dot(x,G),H=min(w,min(min(i,z),min(s,u))),J=max(w,max(max(i,z),max(s,u)));" + "vec3 c=textureLod(f,v.zw,0.).xyz,d=textureLod(f,v.zw+vec2(1,0)*y.xy,0.).xyz,m=textureLod(f,v.zw+vec2(0,1)*y.xy,0.).xyz,a=textureLod(f,v.zw+vec2(1)*y.xy,0.).xyz,H=textureLod(f,v.xy,0.).xyz,x=vec3(.299,.587,.114);" + "float i=dot(c,x),z=dot(d,x),s=dot(m,x),u=dot(a,x),J=dot(H,x),M=min(J,min(min(i,z),min(s,u))),p=max(J,max(max(i,z),max(s,u)));" "vec2 r;" "r.x=-(i+z-s-u);" "r.y=i+s-z-u;" - "float n=1./(min(abs(r.x),abs(r.y))+1./128.);" - "r=min(vec2(8),max(vec2(-8),r*n))*y.xy;" - "vec3 t=.5*(textureLod(f,v.xy+r*(1./3.-.5),0.).xyz+textureLod(f,v.xy+r*(2./3.-.5),0.).xyz),N=t*.5+.25*(textureLod(f,v.xy+r*-.5,0.).xyz+textureLod(f,v.xy+r*.5,0.).xyz);" - "float e=dot(N,G);" - "return eJ?" - "t:" + "float F=1./(min(abs(r.x),abs(r.y))+1./128.);" + "r=min(vec2(8),max(vec2(-8),r*F))*y.xy;" + "vec3 n=.5*(textureLod(f,v.xy+r*(1./3.-.5),0.).xyz+textureLod(f,v.xy+r*(2./3.-.5),0.).xyz),N=n*.5+.25*(textureLod(f,v.xy+r*-.5,0.).xyz+textureLod(f,v.xy+r*.5,0.).xyz);" + "float e=dot(N,x);" + "return ep?" + "n:" "N;" "}" "void main()" "{" - "vec2 v=1./K,y=gl_FragCoord.xy*v;" - "vec4 c=vec4(y,y-v*.5);" - "vec3 m=E(c,M,v);" - "f=vec4(m,1);" + "vec2 y=1./K,v=gl_FragCoord.xy*y;" + "vec4 c=vec4(v,v-y*.5);" + "vec3 d=E(c,M,y);" + "f=vec4(d,1);" "}"; const char *postprocess_frag = @@ -990,21 +966,21 @@ const char *postprocess_frag = "}" "float P(float v)" "{" - "float y=.01*O(v),f=O(v+1.),c=O(v+2.)-.5,m=O(v+3.),u=1.;" - "u=m>.2?" - "pow(abs(f*b.x+y*b.y+c),.0625):" - "2.-pow(abs(f*b.x+y*b.y+c),.125);" - "return mix(.5,1.,u);" + "float y=.01*O(v),f=O(v+1.),c=O(v+2.)-.5,d=O(v+3.),u=1.;" + "u=pow(abs(f*b.x+y*b.y+c),.0625);" + "return mix(.5,1.,d>.2?" + "u:" + "2.-u);" "}" "float Q(float v)" "{" "float y=O(v),f=O(v+1.),m=.01*O(v+2.);" "vec2 c=vec2(y,f)-b;" "c.x*=L.x/L.y;" - "float x=atan(c.y,c.x),u=1.,G=m*m*(sin(6.2831*x*y)*.1+1.);" - "u=dot(c,c) Date: Fri, 24 Feb 2023 02:14:46 +0100 Subject: [PATCH 3/9] Add hand-drawn edges + code simplification & polish (6179 bytes) - The size increases with the new shader, edges.frag. NOTE: main.cpp still need to be updated. - Fix bug with the anvil. It was simple, I just had to remove the line with the WTF??? comment. - Blood animation uses 12 fps too - Adjust the anvil fall timing - Adjust and simplify the postprocessing --- Intro/leviathan.vcxproj | 10 +- Intro/src/shaders/edges.frag | 44 ++ Intro/src/shaders/mouton.frag | 43 +- Intro/src/shaders/mouton.vert | 4 +- Intro/src/shaders/postprocess.frag | 63 +- Intro/src/shaders/shaders.inl | 991 +++++++++++++++-------------- mouton.klproj | Bin 16171 -> 16790 bytes 7 files changed, 611 insertions(+), 544 deletions(-) create mode 100644 Intro/src/shaders/edges.frag diff --git a/Intro/leviathan.vcxproj b/Intro/leviathan.vcxproj index b04474e..e3178c6 100644 --- a/Intro/leviathan.vcxproj +++ b/Intro/leviathan.vcxproj @@ -192,7 +192,7 @@ Minify user-supplied shader files. - shader_minifier.exe -v -o src\shaders\shaders.inl src\shaders\mouton.frag src\shaders\mouton.vert src\shaders\fxaa.frag src\shaders\postprocess.frag + shader_minifier.exe -v -o src\shaders\shaders.inl src\shaders\mouton.frag src\shaders\mouton.vert src\shaders\edges.frag src\shaders\fxaa.frag src\shaders\postprocess.frag @@ -267,7 +267,7 @@ Minify user-supplied shader files. - shader_minifier.exe -v -o src\shaders\shaders.inl src\shaders\mouton.frag src\shaders\mouton.vert src\shaders\fxaa.frag src\shaders\postprocess.frag + shader_minifier.exe -v -o src\shaders\shaders.inl src\shaders\mouton.frag src\shaders\mouton.vert src\shaders\edges.frag src\shaders\fxaa.frag src\shaders\postprocess.frag @@ -357,7 +357,7 @@ Minify user-supplied shader files. - shader_minifier.exe -v -o src\shaders\shaders.inl src\shaders\mouton.frag src\shaders\mouton.vert src\shaders\fxaa.frag src\shaders\postprocess.frag + shader_minifier.exe -v -o src\shaders\shaders.inl src\shaders\mouton.frag src\shaders\mouton.vert src\shaders\edges.frag src\shaders\fxaa.frag src\shaders\postprocess.frag @@ -450,7 +450,7 @@ Minify user-supplied shader files. - shader_minifier.exe -v -o src\shaders\shaders.inl src\shaders\mouton.frag src\shaders\mouton.vert src\shaders\fxaa.frag src\shaders\postprocess.frag + shader_minifier.exe -v -o src\shaders\shaders.inl src\shaders\mouton.frag src\shaders\mouton.vert src\shaders\edges.frag src\shaders\fxaa.frag src\shaders\postprocess.frag @@ -549,7 +549,7 @@ Minify user-supplied shader files. - shader_minifier.exe -v -o src\shaders\shaders.inl src\shaders\mouton.frag src\shaders\mouton.vert src\shaders\fxaa.frag src\shaders\postprocess.frag + shader_minifier.exe -v -o src\shaders\shaders.inl src\shaders\mouton.frag src\shaders\mouton.vert src\shaders\edges.frag src\shaders\fxaa.frag src\shaders\postprocess.frag diff --git a/Intro/src/shaders/edges.frag b/Intro/src/shaders/edges.frag new file mode 100644 index 0000000..e9a7ccf --- /dev/null +++ b/Intro/src/shaders/edges.frag @@ -0,0 +1,44 @@ +#version 150 +out vec4 fragColor; +const vec2 iResolution = vec2(1280.,720.); + +uniform sampler2D prevPass; +uniform float iTime; + +// Edge detection Pass +#define Sensitivity (vec2(0.3, 1.5) * iResolution.y / 400.0) + +float checkSame(vec4 center, vec4 samplef) +{ + vec2 centerNormal = center.xy; + float centerDepth = center.z; + vec2 sampleNormal = samplef.xy; + float sampleDepth = samplef.z; + + // Less sensitive when it's far away; more edge details when it's closer. + float sensitivity = mix(1.2, 0.4, smoothstep(1., 12., centerDepth)); + + vec2 diffNormal = abs(centerNormal - sampleNormal) * Sensitivity.x * sensitivity; + bool isSameNormal = (diffNormal.x + diffNormal.y) < 0.15; + float diffDepth = abs(centerDepth - sampleDepth) * Sensitivity.y * sensitivity; + bool isSameDepth = diffDepth < 1.9; + + if (sampleDepth > 35.) return 1.; + + return (isSameNormal && isSameDepth) ? 1.0 : 0.7; +} + +void main(void) +{ + vec4 sample0 = texture(prevPass, gl_FragCoord.xy / iResolution.xy); + vec4 sample1 = texture(prevPass, (gl_FragCoord.xy + vec2(1.0, 1.0)) / iResolution.xy); + vec4 sample2 = texture(prevPass, (gl_FragCoord.xy + vec2(-1.0, -1.0)) / iResolution.xy); + vec4 sample3 = texture(prevPass, (gl_FragCoord.xy + vec2(-1.0, 1.0)) / iResolution.xy); + vec4 sample4 = texture(prevPass, (gl_FragCoord.xy + vec2(1.0, -1.0)) / iResolution.xy); + + float edge = checkSame(sample1, sample2) * checkSame(sample3, sample4); + + // edge, base color, depth + fragColor = vec4(edge, sample0.w, sample0.z, 1.); +} + diff --git a/Intro/src/shaders/mouton.frag b/Intro/src/shaders/mouton.frag index 075d2ba..751eb15 100644 --- a/Intro/src/shaders/mouton.frag +++ b/Intro/src/shaders/mouton.frag @@ -99,6 +99,7 @@ vec2 moda (vec2 p, float per) } vec2 blood(vec3 p) { + float iTime = int(iTime * 12) / 12.; p.xz -= anvilPos.xz; p.y -= -anvilPos.y; float d = p.y+smoothstep(1.,20.,length(p.xz)); @@ -106,7 +107,7 @@ vec2 blood(vec3 p) { d -= pow((noise(p*.7+1.)*.5+noise(p*1.7+100.)*.3+noise(p*2.7+100.)*.1)*.5+.5, 3.)*.45 * (1.-exp(-(iTime-150.)*4.))+.03; return vec2(d, BLOOD); } - else return vec2(INFINITE, GROUND); + return vec2(INFINITE, GROUND); } @@ -125,9 +126,8 @@ vec2 anvil(vec3 p) { vec2 dmat = vec2(d-.1, BLACK_METAL); return dmat; - } else { - return vec2(INFINITE,GROUND); } + return vec2(INFINITE,GROUND); } vec2 flower(vec3 p) { @@ -470,7 +470,7 @@ float fastTrace(vec3 ro, vec3 rd) { // Blood t = -(ro.y+.4) * m.y;// -(dot(ro,p.xyz)+p.w)/dot(rd,p.xyz); if (t > 0. && length((ro+rd*t).xz-anvilPos.xz)<10.) { - t = -t; // ???? WTF ???? + // t = -t; // ???? WTF ???? for(int i=0; i<128; i++) { vec3 p = ro+rd*t; float d = min(p.y,blood(p).x); @@ -491,7 +491,7 @@ float fastTrace(vec3 ro, vec3 rd) { // /!\ Not energy conservative! float shade(vec3 ro, vec3 rd, vec3 p, vec3 n, vec2 uv) { vec2 dmat = map(p); - + float iTime = int(iTime * 12) / 12.; float night = smoothstep(0.,.3, sunDir.y)+.1; @@ -501,16 +501,10 @@ float shade(vec3 ro, vec3 rd, vec3 p, vec3 n, vec2 uv) { float shad = shadow(p, sunDir, .08, 50.); float fre = clamp(1.0+dot(rd,n), 0., 5.); - // vec3 diff = vec3(1.,.8,.7) * max(dot(n,sunDir), 0.) * pow(vec3(shad), vec3(1.,1.2,1.5)); float diff = .85 * max(dot(n,sunDir), 0.) * pow(shad, 1.2) ; - // vec3 bnc = vec3(1.,.8,.7)*.1 * max(dot(n,-sunDir), 0.) * ao; float bnc = .085 * max(dot(n,-sunDir), 0.) * ao ; - // vec3 sss = vec3(.5) * mix(fastAO(p, rd, .3, .75), fastAO(p, sunDir, .3, .75), 0.5); - // float spe = vec3(1.) * max(dot(reflect(rd,n), sunDir),0.); - - //sss = vec3(1.) * calcSSS(p,rd); - float amb = .45 * ao; // vec3(.4,.45,.5)*1. * ao; + float amb = .45 * ao; float emi = 0.; float albedo = 0.; @@ -525,7 +519,7 @@ float shade(vec3 ro, vec3 rd, vec3 p, vec3 n, vec2 uv) { float ndz = dot(n, normalize(vec3(0.,0.,1.))); float nde = dot(n, eyeDir); float pupil = smoothstep(-0.953,-.952, nde-eyesSurprise/2.); - albedo = pupil; + albedo = mix(0.1, 1.5, pupil); if (ndz > 0. || blink > .95) dmat.y = SKIN; } else if(dmat.y == METAL) { albedo = 1.; @@ -534,11 +528,10 @@ float shade(vec3 ro, vec3 rd, vec3 p, vec3 n, vec2 uv) { if (n.z > .5) { float tri = triangle(p-vec3(0.,7.5,-5.), vec2(1.3,.2), .01); - albedo = .5; - float symbol = smoothstep(0.13,0.1295, distance(p,vec3(0.,7.1,-4.9))); - symbol += smoothstep(0.005,0.,UnevenCapsule2d(p.xy-vec2(0.,7.34), .06,.14,1.)); - albedo = mix(albedo, 2., smoothstep(0.005,.0, tri)); - albedo = mix(albedo, 0., symbol); + float symbol = smoothstep(0.13,0.1295, distance(p,vec3(0.,7.06,-4.9))); + symbol += smoothstep(0.005,0.,UnevenCapsule2d(p.xy-vec2(0.,7.3), .06,.14,1.)); + albedo = mix(.5, 2., smoothstep(0.005,.0, tri)); + albedo = mix(albedo, 0.1, symbol); } else { albedo = 1.; } @@ -583,7 +576,7 @@ float shade(vec3 ro, vec3 rd, vec3 p, vec3 n, vec2 uv) { amb *= .1*fre; bnc = 0.; } else if(dmat.y == BLOOD) { - albedo = .7; + albedo = .4; float fre2 = fre*fre; diff *= 3.; amb *= 2.*fre2; @@ -615,7 +608,8 @@ void main() vec2 uv = (gl_FragCoord.xy) * invRes; vec2 v = uv*2.-1.; v.x *= iResolution.x * invRes.y; - + float iTime = int(iTime * 12) / 12.; + // Setup ray vec3 ro = camPos; vec3 ta = camTa; @@ -638,15 +632,12 @@ void main() float star = star2d(p, size, .5); float starColor = mix(.55, .4, smoothstep(-.1,.6, star2d(p, size*.5, .5)))*1.3; col = mix(col, starColor, smoothstep(0.,-0.01, star) * excited); + t = mix(100., t, smoothstep(0.,0.01, star)); } - - // vignetting - col /= 1.+pow(length(uv*2.-1.),4.)*.04; - + vec2 norm = n.xz; // fixme // gamma correction - fragColor = vec4( pow(col, 1./2.2) ); - + fragColor = vec4( norm, t, pow(col, 1./2.2) ); } diff --git a/Intro/src/shaders/mouton.vert b/Intro/src/shaders/mouton.vert index 9927696..c9b4ef4 100644 --- a/Intro/src/shaders/mouton.vert +++ b/Intro/src/shaders/mouton.vert @@ -330,7 +330,7 @@ void main(void) float time = time-150.; eyeDir = normalize(vec3(0.,0.,1.)); - sheepPos = vec3(0.,-smoothstep(0.05,0.1,time)*4.5,-22.); + sheepPos = vec3(0.,-smoothstep(0.25,0.4,time)*4.5,-22.); flowerPos = vec3(2.,0.,-30.); animationAmp = vec3(1.,1.,.5); animationSpeed = vec3(3.,1.5,8.); @@ -339,7 +339,7 @@ void main(void) camTa = vec3(3., 2., -23.); camFocal = mix(4.,4.2, smoothstep(0.,5.,time)); - float fall = smoothstep(.1,0.,time)*13.; + float fall = smoothstep(.4,.1,time)*13.; anvilPos = vec3(0.,fall+0.,-22.); } else { // ending screen diff --git a/Intro/src/shaders/postprocess.frag b/Intro/src/shaders/postprocess.frag index 8792a52..18c6ce7 100644 --- a/Intro/src/shaders/postprocess.frag +++ b/Intro/src/shaders/postprocess.frag @@ -25,10 +25,6 @@ float randomLine(float seed) float l = 1.0; l = pow( abs(a * uv.x + b * uv.y + c ), 1.0/16.0 ); - //if ( mu > 0.2) - - // else -// l = 2.0 - pow( abs(a * uv.x + b * uv.y + c), 1.0/16.0 ); return mix(0.5, 1.0, mu > 0.2 ? l : 2. - l); } @@ -53,11 +49,13 @@ float randomBlotch(float seed) return mix(0.3 + 0.2 * (1.0 - (s / 0.02)), 1.0, v); } +#define ErrorPeriod 30.0 +#define ErrorRange 0.003 void main(void) { // Set frequency of global effect (12 / second). - float t = float(int(iTime * 12)); + float t = int(iTime * 12) / 12.; vec2 invRes = 1./iResolution; uv = gl_FragCoord.xy * invRes; @@ -65,54 +63,55 @@ void main(void) if (rand(t) < .01) uv += vec2(0.1); // Get some image movement vec2 suv = uv + 0.004 * vec2( rand(t), rand(t + 23.0)); - vec2 offset = (suv*2.-1.)*invRes.x*.5; + suv += (suv*2.-1.)*invRes.x*.5; + + float sens = mix(1.2, 0.3, smoothstep(1., 10., texture(prevPass,suv).z)); + float noise = rand(t+9.)*.005*sens; // (texture(prevPass, suv * 0.5).r - 0.5) * NoiseAmount; + vec2 uvs[3]; + uvs[0] = suv + vec2(ErrorRange * sin(ErrorPeriod * suv.y + 0.0) + noise, ErrorRange * sin(ErrorPeriod * suv.x + 0.0) + noise); + uvs[1] = suv + vec2(ErrorRange * sin(ErrorPeriod * suv.y + 1.047) + noise, ErrorRange * sin(ErrorPeriod * suv.x + 3.142) + noise); + uvs[2] = suv + vec2(ErrorRange * sin(ErrorPeriod * suv.y + 2.094) + noise, ErrorRange * sin(ErrorPeriod * suv.x + 1.571) + noise); + + float edge = texture(prevPass, uvs[0]).r * texture(prevPass, uvs[1]).r * texture(prevPass, uvs[2]).r; - float col = texture(prevPass,suv+offset).r; + float col = texture(prevPass,suv).g; + col *= mix(.2, 1., edge); + // fade in - col *= smoothstep(0.,10., iTime); + col *= smoothstep(0.,10., t); const float endTime = 160.; + // Circle to black float circle = length(gl_FragCoord.xy/iResolution.xx - vec2(.5,.3)); - float t2 = max(.137, smoothstep(endTime+1., endTime, iTime)); + float t2 = max(.137, smoothstep(endTime+1., endTime, t)); col *= smoothstep(t2, t2-.005, circle); // Looney tunes float f = circle; - float alpha = smoothstep(0.135, .136, f) * smoothstep(endTime+1., endTime+2., iTime); + float alpha = smoothstep(0.135, .136, f) * smoothstep(endTime+1., endTime+2., t); f = fract(23. * pow(f, .25)); f -= smoothstep(0.95, 0.99, f); float col2 = mix(.55, .35, pow(f,1.)); col = mix(col, col2, alpha); - // Create a time-varying vignetting effect - float vI = 16.0 * (uv.x * (1.0-uv.x) * uv.y * (1.0-uv.y)); - vI *= mix( 0.7, 1.0, rand(t + 0.5)); - - // Add additive flicker - //vI += 0. + 0.2 * rand(t+8.); - - // Add a fixed vignetting (independent of the flicker) - vI *= pow(16.0 * uv.x * (1.0-uv.x) * uv.y * (1.0-uv.y), 0.14); - - int l = int(8.0 * rand(t+7.0)); - int s = int( max(8.0 * rand(t+18.0) -2.0, 0.0 )); - for (int i = 1; i < 8; i++) { - if ( i < l ) vI *= randomLine( t+6.0+17.* i); - if ( i < s ) vI *= randomBlotch( t+6.0+19.* i); + // vignetting + float vI = 12.0 * (uv.x * (1.0-uv.x) * uv.y * (1.0-uv.y)); + + int l = int(8. * rand(t+7.) - 1.); + int s = int(8. * rand(t+18.) - 2.); + for (int i = 0; i < 8; i++) { + if (i < l) vI *= randomLine(t + i); + if (i < s) vI *= randomBlotch(t - i); } - - // Show the image modulated by the defects col *= vI; - // Add some grain - col *= 1.0+(rand(uv+t*.01)-.2)*.15; - - col *= .7; + col -= rand(uv+t)*.05; // grain // Fade out - col *= smoothstep(endTime+5., endTime+4., iTime); + col *= smoothstep(endTime+5., endTime+4., t); fragColor = vec4(col, col, col, 1.); } + diff --git a/Intro/src/shaders/shaders.inl b/Intro/src/shaders/shaders.inl index 9e88dbd..b20b845 100644 --- a/Intro/src/shaders/shaders.inl +++ b/Intro/src/shaders/shaders.inl @@ -1,7 +1,7 @@ // Generated with Shader Minifier 1.3.3 (https://github.com/laurentlb/Shader_Minifier/) #ifndef SHADERS_INL_ # define SHADERS_INL_ -# define VAR_a_position "N" +# define VAR_a_position "U" # define VAR_animationAmp "m" # define VAR_animationSpeed "y" # define VAR_anvilPos "n" @@ -10,17 +10,17 @@ # define VAR_camPos "c" # define VAR_camTa "a" # define VAR_excited "p" -# define VAR_eyeDir "d" +# define VAR_eyeDir "E" # define VAR_eyesSurprise "o" -# define VAR_fishEyeFactor "w" +# define VAR_fishEyeFactor "t" # define VAR_flowerPos "x" # define VAR_fragColor "f" # define VAR_headRot "l" -# define VAR_iTime "t" +# define VAR_iTime "d" # define VAR_noseSize "k" # define VAR_panelPos "i" # define VAR_panelWarningPos "z" -# define VAR_prevPass "M" +# define VAR_prevPass "K" # define VAR_sheepPos "s" # define VAR_sunDir "r" @@ -28,90 +28,91 @@ const char *mouton_frag = "#version 150\n" "out vec4 f;" "const vec2 v=vec2(1280,720);" - "in vec3 m,y,s,x,i,z,n,r,c,a,d;" + "in vec3 m,y,s,x,i,z,n,r,c,a,E;" "in vec2 l;" - "in float e,u,o,p,w,k;" - "uniform float t;" - "const float U=acos(-1.);" + "in float e,u,o,p,t,k;" + "uniform float d;" + "const float S=acos(-1.);" "vec2 h(vec2 i,vec2 y)" "{" "return i.xa||a<0.?" + "vec3 y=m*i,x=abs(m)*s,c=-y-x,f=-y+x;" + "float E=max(max(c.x,c.y),c.z),a=min(min(f.x,f.y),f.z);" + "return E>a||a<0.?" "vec2(-1):" - "vec2(z,a);" + "vec2(E,a);" "}" - "vec3 g(vec3 v)" + "vec3 h(vec3 v)" "{" - "uvec3 y=uvec3(v*1e5);" - "y=(y>>8U^y.yzx)*1103515245U;" - "y=(y>>8U^y.yzx)*1103515245U;" - "y=(y>>8U^y.yzx)*1103515245U;" - "return vec3(y)*(1./float(-1U));" + "uvec3 f=uvec3(v*1e5);" + "f=(f>>8U^f.yzx)*1103515245U;" + "f=(f>>8U^f.yzx)*1103515245U;" + "f=(f>>8U^f.yzx)*1103515245U;" + "return vec3(f)*(1./float(-1U));" "}" - "float g(vec3 i,vec2 v,float m)" + "float h(vec3 i,vec2 v,float m)" "{" - "float y=m*m,c=int(t*12)/12.;" - "vec2 x=vec2(cos(c*.7+2.4),sin(c*.7+2.4)*.75);" - "float f=smoothstep(.151,.15,length(v-x));" - "f*=smoothstep(.15,.1501,length(v-x-vec2(.1,.025)));" - "f+=exp(-length(v-x)*2.)*.1;" - "f*=smoothstep(.5,0.,r.y);" - "vec2 d=v*2e2,a=fract(d)-.5,s=floor(d);" - "vec3 l=g(vec3(abs(s),abs(s.x)));" - "float z=l.z*.1;" - "f+=smoothstep(z,z*.01,length(l.xy-.5+a))*(cos(c*l.y+l.z*3.14)*.5+.5);" - "y+=f*smoothstep(.5,-1.,r.y);" - "return y;" + "float f=m*m,y=int(d*12)/12.;" + "vec2 x=vec2(cos(y*.7+2.4),sin(y*.7+2.4)*.75);" + "float s=smoothstep(.151,.15,length(v-x));" + "s*=smoothstep(.15,.1501,length(v-x-vec2(.1,.025)));" + "s+=exp(-length(v-x)*2.)*.1;" + "s*=smoothstep(.5,0.,r.y);" + "vec2 c=v*2e2,a=fract(c)-.5,E=floor(c);" + "vec3 n=h(vec3(abs(E),abs(E.x)));" + "float z=n.z*.1;" + "s+=smoothstep(z,z*.01,length(n.xy-.5+a))*(cos(y*n.y+n.z*3.14)*.5+.5);" + "f+=s*smoothstep(.5,-1.,r.y);" + "return f;" "}" - "float h(float v)" + "float w(float v)" "{" "return fract(v*17.*fract(v*.3183099));" "}" - "float C(vec3 v)" + "float g(vec3 v)" "{" "vec3 m=floor(v),s=fract(v),y=s*s*s*(s*(s*6.-15.)+10.);" - "float x=m.x+317.*m.y+157.*m.z,c=h(x),d=h(x+1.),a=h(x+317.),z=h(x+318.),f=h(x+157.),u=h(x+158.),p=h(x+474.),t=h(x+475.);" - "return-1.+2.*(c+(d-c)*y.x+(a-c)*y.y+(f-c)*y.z+(c-d-a+z)*y.x*y.y+(c-a-f+p)*y.y*y.z+(c-d-f+u)*y.z*y.x+(-c+d+a-z+f-u-p+t)*y.x*y.y*y.z);" + "float x=m.x+317.*m.y+157.*m.z,f=w(x),c=w(x+1.),E=w(x+317.),a=w(x+318.),z=w(x+157.),u=w(x+158.),p=w(x+474.),r=w(x+475.);" + "return-1.+2.*(f+(c-f)*y.x+(E-f)*y.y+(z-f)*y.z+(f-c-E+a)*y.x*y.y+(f-E-z+p)*y.y*y.z+(f-c-z+u)*y.z*y.x+(-f+c+E-a+z-u-p+r)*y.x*y.y*y.z);" "}" "vec2 B(vec3 v)" "{" + "float y=int(d*12)/12.;" "v.xz-=n.xz;" "v.y-=-n.y;" - "float y=v.y+smoothstep(1.,20.,length(v.xz));" - "return y<.4?" - "(y-=pow((C(v*.7+1.)*.5+C(v*1.7+1e2)*.3+C(v*2.7+1e2)*.1)*.5+.5,3.)*.45*(1.-exp(-(t-150.)*4.))+.03,vec2(y,12)):" + "float x=v.y+smoothstep(1.,20.,length(v.xz));" + "return x<.4?" + "(x-=pow((g(v*.7+1.)*.5+g(v*1.7+1e2)*.3+g(v*2.7+1e2)*.1)*.5+.5,3.)*.45*(1.-exp(-(y-150.)*4.))+.03,vec2(x,12)):" "vec2(9e7,0);" "}" "mat3 B(vec3 v,vec3 y)" "{" "const vec3 x=vec3(0,1,0);" - "vec3 c=normalize(y-v),d=normalize(cross(c,normalize(x)));" - "return mat3(d,cross(d,c),c);" + "vec3 f=normalize(y-v),c=normalize(cross(f,normalize(x)));" + "return mat3(c,cross(c,f),f);" "}" "mat2 A(float v)" "{" - "float y=cos(v),c=sin(v);" - "return mat2(y,c,-c,y);" + "float y=cos(v),x=sin(v);" + "return mat2(y,x,-x,y);" "}" "float A(vec3 v,vec3 y)" "{" - "vec3 c=abs(v)-y;" - "return length(max(c,0.))+min(max(c.x,max(c.y,c.z)),0.);" + "vec3 f=abs(v)-y;" + "return length(max(f,0.))+min(max(f.x,max(f.y,f.z)),0.);" "}" - "vec2 D(vec3 v)" + "vec2 C(vec3 v)" "{" "v-=n;" "v.xz=A(1.)*v.xz;" @@ -119,315 +120,314 @@ const char *mouton_frag = "if(f<10.)" "{" "f=min(f,A(v-vec3(0,3,0),vec3(2,1,3)));" - "float c=length((v.yz-vec2(4.5,3))*vec2(1,.8))-2.;" - "c=max(c,abs(v.x)-.5);" - "c=max(c,v.y-3.5);" - "f=min(f,c);" - "vec2 x=vec2(f-.1,11);" - "return x;" + "float x=length((v.yz-vec2(4.5,3))*vec2(1,.8))-2.;" + "x=max(x,abs(v.x)-.5);" + "x=max(x,v.y-3.5);" + "f=min(f,x);" + "vec2 i=vec2(f-.1,11);" + "return i;" "}" "return vec2(9e7,0);" "}" - "vec2 E(vec3 v)" + "vec2 D(vec3 v)" "{" "v-=i;" - "float y=A(v-vec3(0,7.5,-5),vec3(.8,.8,.1))-.2;" - "if(y<7.)" + "float f=A(v-vec3(0,7.5,-5),vec3(.8,.8,.1))-.2;" + "if(f<7.)" "{" - "y=max(y,abs(v.z+5.)-.1);" - "float c=A(v-vec3(0,4,-5.1),vec3(.11,4,.08));" - "vec2 f=vec2(c,5);" - "f=h(f,vec2(y,7));" - "return f;" + "f=max(f,abs(v.z+5.)-.1);" + "float y=A(v-vec3(0,4,-5.1),vec3(.11,4,.08));" + "vec2 x=vec2(y,5);" + "x=h(x,vec2(f,7));" + "return x;" "}" "return vec2(9e7,0);" "}" "float A(vec3 v,float y,float i,float x)" "{" - "vec2 m=vec2(length(v.xz),v.y),c=vec2(x,y),d=vec2(x-i,2.*y),f=vec2(m.x-min(m.x,m.y<0.?" + "vec2 m=vec2(length(v.xz),v.y),f=vec2(x,y),c=vec2(x-i,2.*y),E=vec2(m.x-min(m.x,m.y<0.?" "i:" - "x),abs(m.y)-y),z=m-c+d*clamp(dot(c-m,d)/dot(d,d),0.,1.);" - "return(z.x<0.&&f.y<0.?" + "x),abs(m.y)-y),z=m-f+c*clamp(dot(f-m,c)/dot(c,c),0.,1.);" + "return(z.x<0.&&E.y<0.?" "-1.:" - "1.)*sqrt(min(dot(f,f),dot(z,z)));" + "1.)*sqrt(min(dot(E,E),dot(z,z)));" "}" - "float B(vec3 v,vec3 y,vec3 m,float x)" + "float B(vec3 v,vec3 x,vec3 m,float y)" "{" - "vec3 c=v-y,d=m-y;" - "float i=clamp(dot(c,d)/dot(d,d),0.,1.);" - "return length(c-d*i)-x;" + "vec3 f=v-x,c=m-x;" + "float i=clamp(dot(f,c)/dot(c,c),0.,1.);" + "return length(f-c*i)-y;" "}" "float C(vec3 v,vec2 y)" "{" - "vec2 c=vec2(length(v.xy)-y.x,v.z);" - "return length(c)-y.y;" + "vec2 f=vec2(length(v.xy)-y.x,v.z);" + "return length(f)-y.y;" "}" "float D(vec3 v,vec3 y)" "{" - "float c=length(v/y),d=length(v/(y*y));" - "return c*(c-1.)/d;" + "float f=length(v/y),x=length(v/(y*y));" + "return f*(f-1.)/x;" "}" "vec2 F(vec3 v)" "{" - "float y=int(t*12)/12.;" + "float y=int(d*12)/12.;" "v-=x;" - "vec3 m=v;" - "m.x+=cos(.775+y)*3.1*.2;" - "m.y-=2.8;" - "m.zy=A(.7)*m.zy;" - "float c=D(m-vec3(0,.3,0),vec3(1,.2+cos(m.x*150.)*sin(m.z*150.)*.05,1)*.25);" + "vec3 f=v;" + "f.x+=cos(.775+y)*3.1*.2;" + "f.y-=2.8;" + "f.zy=A(.7)*f.zy;" + "float c=D(f-vec3(0,.3,0),vec3(1,.2+cos(f.x*150.)*sin(f.z*150.)*.05,1)*.25);" "if(c<5.)" "{" - "vec2 i=vec2(c,8);" - "vec3 f=m;" - "f.xz=g(f.xz,U*.2);" - "float d=D(f-vec3(.5,.2+sin(f.x*2.)*.2,0),vec3(2,.1+sin(f.z*40.)*.02,.75)*.25);" - "if(d0.)" + "vec3 f=1./y;" + "float m=9e7,c;" + "vec2 E=h(v-s-vec3(0,3,-2),y,vec3(3,3,7),f);" + "if(E.y>0.)" "{" - "f=max(m.x,0.);" + "c=max(E.x,0.);" "for(int u=0;u<128;u++)" "{" - "vec3 a=v+y*f;" - "float t=h(vec2(a.y,0),G(a)).x;" - "f+=t;" - "if(f>m.y||abs(t)<.001)" + "vec3 a=v+y*c;" + "float d=h(vec2(a.y,0),G(a)).x;" + "c+=d;" + "if(c>E.y||abs(d)<.001)" "break;" "}" - "if(f0.)" + "E=h(v-i-vec3(0,5,-5),y,vec3(1.5,5,1),f);" + "if(E.y>0.)" "{" - "f=max(m.x,0.);" + "c=max(E.x,0.);" "for(int u=0;u<128;u++)" "{" - "float a=E(v+y*f).x;" - "f+=a;" - "if(f>m.y||abs(a)<.001)" + "float a=D(v+y*c).x;" + "c+=a;" + "if(c>E.y||abs(a)<.001)" "break;" "}" - "if(f0.)" + "E=h(v-z-vec3(0,5,-5),y,vec3(1.5,5,1),f);" + "if(E.y>0.)" "{" - "f=max(m.x,0.);" + "c=max(E.x,0.);" "for(int u=0;u<128;u++)" "{" - "float a=H(v+y*f).x;" - "f+=a;" - "if(f>m.y||abs(a)<.001)" + "float a=H(v+y*c).x;" + "c+=a;" + "if(c>E.y||abs(a)<.001)" "break;" "}" - "if(f0.)" + "E=h(v-x-vec3(0,5,0),y,vec3(2,5,1),f);" + "if(E.y>0.)" "{" - "f=max(m.x,0.);" + "c=max(E.x,0.);" "for(int u=0;u<128;u++)" "{" - "float a=F(v+y*f).x;" - "f+=a;" - "if(f>m.y||abs(a)<.001)" + "float a=F(v+y*c).x;" + "c+=a;" + "if(c>E.y||abs(a)<.001)" "break;" "}" - "if(f0.)" + "E=h(v-n-vec3(0,3,2),y,vec3(4,4,5),f);" + "if(E.y>0.)" "{" - "f=max(m.x,0.);" + "c=max(E.x,0.);" "for(int u=0;u<128;u++)" "{" - "float a=D(v+y*f).x;" - "f+=a;" - "if(f>m.y||abs(a)<.001)" + "float a=C(v+y*c).x;" + "c+=a;" + "if(c>E.y||abs(a)<.001)" "break;" "}" - "if(f0.&&length((v+y*f).xz-n.xz)<10.)" + "c=-(v.y+.4)*f.y;" + "if(c>0.&&length((v+y*c).xz-n.xz)<10.)" "{" - "f=-f;" "for(int u=0;u<128;u++)" "{" - "vec3 a=v+y*f;" - "float t=min(a.y,B(a).x);" - "f+=t;" - "if(f>m.y||abs(t)<.001)" + "vec3 a=v+y*c;" + "float d=min(a.y,B(a).x);" + "c+=d;" + "if(c>E.y||abs(d)<.001)" "break;" "}" - "if(f<1e2)" - "d=min(d,f);" + "if(c<1e2)" + "m=min(m,c);" "}" - "f=-v.y*c.y;" - "if(f>0.)" - "d=min(d,f);" - "return d;" + "c=-v.y*f.y;" + "if(c>0.)" + "m=min(m,c);" + "return m;" "}" "vec3 J(vec3 v)" "{" @@ -439,182 +439,181 @@ const char *mouton_frag = "f.z=m-I(v-y.yyx).x;" "return normalize(f);" "}" - "float D(vec3 v,vec3 y,float m,float i)" + "float D(vec3 v,vec3 y,float m,float f)" "{" - "float f=1.,c=m;" - "for(int u=0;u<64;u++)" + "float c=1.,x=m;" + "for(int i=0;i<64;i++)" "{" - "float s=I(v+y*c).x;" - "f=min(f,30.*s/c);" - "c+=s;" - "if(f<1e-4||c>i)" + "float s=I(v+y*x).x;" + "c=min(c,30.*s/x);" + "x+=s;" + "if(c<1e-4||x>f)" "break;" "}" - "return clamp(f,0.,1.);" + "return clamp(c,0.,1.);" "}" - "float E(vec2 v,float y,float i,float c)" + "float F(vec2 v,float f,float y,float x)" "{" "v.x=abs(v.x);" - "float f=(y-i)/c,d=sqrt(1.-f*f),m=dot(v,vec2(-f,d));" + "float c=(f-y)/x,E=sqrt(1.-c*c),m=dot(v,vec2(-c,E));" "return m<0.?" - "length(v)-y:" - "m>d*c?" - "length(v-vec2(0,c))-i:" - "dot(v,vec2(d,f))-y;" + "length(v)-f:" + "m>E*x?" + "length(v-vec2(0,x))-y:" + "dot(v,vec2(E,c))-f;" "}" - "float A(vec3 v,vec3 y,vec3 m,vec3 c,vec2 f)" + "float A(vec3 v,vec3 f,vec3 m,vec3 y,vec2 c)" "{" "vec2 a=I(m);" - "float s=smoothstep(0.,.3,r.y)+.1,u=C(m,c,.15,1.);" - "u*=C(m,c,1.,.1)*.5;" - "float l=D(m,r,.08,50.),n=clamp(1.+dot(y,c),0.,5.),F=.85*max(dot(c,r),0.)*pow(l,1.2),N=.085*max(dot(c,-r),0.)*u,G=.45*u,w=0.,H=0.;" + "float u=int(d*12)/12.,s=smoothstep(0.,.3,r.y)+.1,U=C(m,y,.15,1.);" + "U*=C(m,y,1.,.1)*.5;" + "float w=D(m,r,.08,50.),n=clamp(1.+dot(f,y),0.,5.),l=.85*max(dot(y,r),0.)*pow(w,1.2),t=.085*max(dot(y,-r),0.)*U,H=.45*U,G=0.,J=0.;" "if(a.y==0.)" - "H=3.;" + "J=3.;" "else" " if(a.y==1.)" - "H=.4,w=.35;" + "J=.4,G=.35;" "else" " if(a.y==4.)" - "H=.025;" + "J=.025;" "else" " if(a.y==3.)" "{" - "float J=dot(c,normalize(vec3(0,0,1))),M=dot(c,d),h=smoothstep(-.953,-.952,M-o/2.);" - "H=h;" - "if(J>0.||e>.95)" + "float g=dot(y,normalize(vec3(0,0,1))),N=dot(y,E),S=smoothstep(-.953,-.952,N-o/2.);" + "J=mix(.1,1.5,S);" + "if(g>0.||e>.95)" "a.y=2.;" "}" "else" " if(a.y==5.)" - "H=1.;" + "J=1.;" "else" " if(a.y==6.)" "{" - "vec3 J=m-z;" - "if(c.z>.5)" + "vec3 g=m-z;" + "if(y.z>.5)" "{" - "float M=C(J-vec3(0,7.5,-5),vec2(1.3,.2),.01);" - "H=.5;" - "float k=smoothstep(.13,.1295,distance(J,vec3(0,7.1,-4.9)));" - "k+=smoothstep(.005,0.,E(J.xy-vec2(0,7.34),.06,.14,1.));" - "H=mix(H,2.,smoothstep(.005,0.,M));" - "H=mix(H,0.,k);" + "float S=C(g-vec3(0,7.5,-5),vec2(1.3,.2),.01),N=smoothstep(.13,.1295,distance(g,vec3(0,7.06,-4.9)));" + "N+=smoothstep(.005,0.,F(g.xy-vec2(0,7.3),.06,.14,1.));" + "J=mix(.5,2.,smoothstep(.005,0.,S));" + "J=mix(J,.1,N);" "}" "else" - " H=1.;" + " J=1.;" "}" "else" " if(a.y==7.)" "{" - "vec3 J=m-i;" - "if(c.z>.5)" + "vec3 g=m-i;" + "if(y.z>.5)" "{" - "H=.5;" - "J.y-=7.4;" - "float M=A(J-vec3(0,.1,-5),vec3(.8,.8,1)),k=0.;" - "J.xy=A(.8)*J.xy;" + "J=.5;" + "g.y-=7.4;" + "float S=A(g-vec3(0,.1,-5),vec3(.8,.8,1)),N=0.;" + "g.xy=A(.8)*g.xy;" "float K=.04;" - "k+=smoothstep(.01,0.,E(J.xy-vec2(-K,-.6),.1,.05,1.));" - "k+=smoothstep(.01,0.,E(J.xy-vec2(-K,.5),.16,.135,.15));" - "k*=smoothstep(0.,.01,E(J.xy-vec2(-K-.08,.56),.001,.02,.2));" - "k*=smoothstep(0.,.01,E(J.xy-vec2(-K+.04,.56),.001,.02,.2));" - "J.xy=A(-1.6)*J.xy;" - "k+=smoothstep(.01,0.,E(J.xy-vec2(K,-.6),.1,.05,1.));" - "k+=smoothstep(.01,0.,E(J.xy-vec2(K,.5),.16,.1,.15));" - "H=mix(H,2.,smoothstep(.01,0.,M));" - "H=mix(H,0.,k);" + "N+=smoothstep(.01,0.,F(g.xy-vec2(-K,-.6),.1,.05,1.));" + "N+=smoothstep(.01,0.,F(g.xy-vec2(-K,.5),.16,.135,.15));" + "N*=smoothstep(0.,.01,F(g.xy-vec2(-K-.08,.56),.001,.02,.2));" + "N*=smoothstep(0.,.01,F(g.xy-vec2(-K+.04,.56),.001,.02,.2));" + "g.xy=A(-1.6)*g.xy;" + "N+=smoothstep(.01,0.,F(g.xy-vec2(K,-.6),.1,.05,1.));" + "N+=smoothstep(.01,0.,F(g.xy-vec2(K,.5),.16,.1,.15));" + "J=mix(J,2.,smoothstep(.01,0.,S));" + "J=mix(J,0.,N);" "}" "else" - " H=1.;" + " J=1.;" "}" "else" " if(a.y==8.)" "{" - "vec3 J=m-x;" - "J.x+=cos(.775+t)*3.1*.2;" - "J.y-=2.8;" - "J.zy=A(.75)*J.zy;" - "H=mix(.9,1.3,smoothstep(0.,.45,length(J-vec3(0,.3,0))))*1.8;" + "vec3 g=m-x;" + "g.x+=cos(.775+u)*3.1*.2;" + "g.y-=2.8;" + "g.zy=A(.75)*g.zy;" + "J=mix(.9,1.3,smoothstep(0.,.45,length(g-vec3(0,.3,0))))*1.8;" "}" "else" " if(a.y==10.)" - "H=.02;" + "J=.02;" "else" " if(a.y==9.)" "{" - "vec3 J=m-x;" - "J.x+=cos(.775+t)*3.1*.2;" - "J.y-=2.8;" - "J.zy=A(.75)*J.zy;" - "H=mix(1.5,.7,smoothstep(.5,1.1,length(J-vec3(0,.3,0))))*2.;" + "vec3 g=m-x;" + "g.x+=cos(.775+u)*3.1*.2;" + "g.y-=2.8;" + "g.zy=A(.75)*g.zy;" + "J=mix(1.5,.7,smoothstep(.5,1.1,length(g-vec3(0,.3,0))))*2.;" "}" "else" " if(a.y==11.)" - "H=1.,F*=.1*n,G*=.1*n,N=0.;" + "J=1.,l*=.1*n,H*=.1*n,t=0.;" "else" " if(a.y==12.)" "{" - "H=.7;" - "float J=n*n;" - "F*=3.;" - "G*=2.*J;" + "J=.4;" + "float g=n*n;" + "l*=3.;" + "H*=2.*g;" "}" "if(a.y==2.)" - "H=.8,G*=.8;" - "float J=(H*(G+F*.5+N*2.)+w)*s,M=length(m-v);" - "J=mix(J,g(y,f,s),smoothstep(90.,1e2,M));" + "J=.8,H*=.8;" + "float g=(J*(H+l*.5+t*2.)+G)*s,N=length(m-v);" + "g=mix(g,h(f,c,s),smoothstep(90.,1e2,N));" "if(a.y==0.)" "{" - "float k=cos(atan(f.x,f.y)*15.+t*3.),K=length(f)*.5;" - "J=mix(J,mix(.5,1.,smoothstep(-K,K,k)),p);" + "float S=cos(atan(c.x,c.y)*15.+u*3.),K=length(c)*.5;" + "g=mix(g,mix(.5,1.,smoothstep(-K,K,S)),p);" "}" - "return clamp(J,0.,1.);" + "return clamp(g,0.,1.);" "}" "float D(vec2 v,float y,float m)" "{" - "const vec2 c=vec2(.809016994375,-.587785252292),f=vec2(-c.x,c.y);" + "const vec2 f=vec2(.809016994375,-.587785252292),c=vec2(-f.x,f.y);" "v.x=abs(v.x);" - "v-=2.*max(dot(c,v),0.)*c;" "v-=2.*max(dot(f,v),0.)*f;" + "v-=2.*max(dot(c,v),0.)*c;" "v.x=abs(v.x);" "v.y-=y;" - "vec2 d=m*vec2(-c.y,c.x)-vec2(0,1);" - "float x=clamp(dot(v,d)/dot(d,d),0.,y);" - "return length(v-d*x)*sign(v.y*d.x-v.x*d.y);" + "vec2 x=m*vec2(-f.y,f.x)-vec2(0,1);" + "float i=clamp(dot(v,x)/dot(x,x),0.,y);" + "return length(v-x*i)*sign(v.y*x.x-v.x*x.y);" "}" "void main()" "{" - "vec2 y=vec2(1)/v,m=gl_FragCoord.xy*y,d=m*2.-1.;" - "d.x*=v.x*y.y;" - "vec3 i=c,x=a,z=B(i,x)*normalize(vec3(d,u-length(d)*w));" - "float s=E(i,z);" - "vec3 H=i+z*s,G=J(H);" - "float e=A(i,z,H,G,d);" + "vec2 y=vec2(1)/v,m=gl_FragCoord.xy*y,x=m*2.-1.;" + "x.x*=v.x*y.y;" + "float i=int(d*12)/12.;" + "vec3 s=c,E=a,z=B(s,E)*normalize(vec3(x,u-length(x)*t));" + "float r=F(s,z);" + "vec3 g=s+z*r,w=J(g);" + "float U=A(s,z,g,w,x);" "{" - "vec2 r=d*5.;" - "r.x=abs(r.x-.3)-1.5;" - "r.y-=1.4;" - "r=A(t*5.)*r;" - "float N=1.4+.2*sin(t*20.);" + "vec2 l=x*5.;" + "l.x=abs(l.x-.3)-1.5;" + "l.y-=1.4;" + "l=A(i*5.)*l;" + "float N=1.4+.2*sin(i*20.);" "N*=smoothstep(.5,1.,p);" - "float M=D(r,N,.5),n=mix(.55,.4,smoothstep(-.1,.6,D(r,N*.5,.5)))*1.3;" - "e=mix(e,n,smoothstep(0.,-.01,M)*p);" + "float S=D(l,N,.5),n=mix(.55,.4,smoothstep(-.1,.6,D(l,N*.5,.5)))*1.3;" + "U=mix(U,n,smoothstep(0.,-.01,S)*p);" + "r=mix(1e2,r,smoothstep(0.,.01,S));" "}" - "e/=1.+pow(length(m*2.-1.),4.)*.04;" - "f=vec4(pow(e,1./2.2));" + "f=vec4(w.xz,r,pow(U,1./2.2));" "}"; const char *mouton_vert = "#version 150\n" - "in vec4 N;" - "out vec3 m,y,s,x,i,z,n,r,c,a,d;" + "in vec4 U;" + "out vec3 m,y,s,x,i,z,n,r,c,a,E;" "out vec2 l;" - "out float e,u,o,p,w,k;" - "uniform float t;" + "out float e,u,o,p,t,k;" + "uniform float d;" "void main()" "{" - "gl_Position=N;" - "float v=t;" + "gl_Position=U;" + "float v=d;" "v=int(v*12)/12.;" "s=vec3(0);" "i=vec3(9e7);" @@ -622,23 +621,23 @@ const char *mouton_vert = "z=vec3(9e7);" "n=vec3(9e7);" "u=2.;" - "e=max(fract(t*.333),fract(t*.123+.1));" + "e=max(fract(d*.333),fract(d*.123+.1));" "p=0.;" "r=normalize(vec3(3.5,1,-1));" "y=vec3(1);" - "w=0.;" + "t=0.;" "l=vec2(0);" "k=1.;" "o=0.;" "if(v<10.)" - "m=vec3(1,.2,1),y=vec3(1,1,.5),d=normalize(vec3(0,.5,1)),l.y=.25,u=4.,c=vec3(0,2.5,-3.7),a=vec3(0,3,0);" + "m=vec3(1,.2,1),y=vec3(1,1,.5),E=normalize(vec3(0,.5,1)),l.y=.25,u=4.,c=vec3(0,2.5,-3.7),a=vec3(0,3,0);" "else" " if(v<20.)" "{" "float f=v-10.;" "m=vec3(1,.2,.25);" "y=vec3(1,1,2);" - "d=normalize(vec3(0,.5,1));" + "E=normalize(vec3(0,.5,1));" "l.y=.25;" "u=4.;" "c=vec3(5,.5,0);" @@ -650,7 +649,7 @@ const char *mouton_vert = "float f=v-20.;" "m=vec3(1,.2,.25);" "y=vec3(1,1,2);" - "d=normalize(vec3(0,.5,1));" + "E=normalize(vec3(0,.5,1));" "l.y=.25;" "u=2.;" "c=vec3(5.+f*.5,2,f*.5);" @@ -662,10 +661,10 @@ const char *mouton_vert = "float f=v-30.;" "m=vec3(1,.2,.25);" "y=vec3(1,1,2);" - "d=normalize(vec3(0,.5,1));" + "E=normalize(vec3(0,.5,1));" "l.y=.25;" - "float J=f*.35+.3;" - "r=normalize(vec3(cos(J),sin(J),-.3));" + "float g=f*.35+.3;" + "r=normalize(vec3(cos(g),sin(g),-.3));" "u=1.5;" "c=vec3(22,2,f*.6-10.);" "a=vec3(0,2,f*.6-10.);" @@ -673,17 +672,17 @@ const char *mouton_vert = "else" " if(v<55.)" "{" - "float f=v-50.,H=smoothstep(2.,2.5,f);" - "l.y=mix(.25,0.,H);" - "m=vec3(1.-H,.2*(1.-H),1);" + "float f=v-50.,g=smoothstep(2.,2.5,f);" + "l.y=mix(.25,0.,g);" + "m=vec3(1.-g,.2*(1.-g),1);" "y=vec3(1,1,.5);" - "d=normalize(vec3(H*.3,.3-H*.3,1));" + "E=normalize(vec3(g*.3,.3-g*.3,1));" "o=smoothstep(4.6,4.8,f)*.2;" "u=4.;" "c=vec3(0,3,-4);" "a=vec3(0,3,0);" "if(f>3.)" - "e=max(fract(t*.333),fract(t*.333+.08));" + "e=max(fract(d*.333),fract(d*.333+.08));" "}" "else" " if(v<58.)" @@ -691,14 +690,14 @@ const char *mouton_vert = "float f=v-55.;" "s=vec3(0);" "i=vec3(-5,0,-8);" - "d=normalize(vec3(.3,0,1));" + "E=normalize(vec3(.3,0,1));" "o=.2;" "m=vec3(0,0,1);" "y=vec3(3,1.5,6);" - "float H=smoothstep(0.,.5,f);" - "u=mix(4.,3.,H);" + "float g=smoothstep(0.,.5,f);" + "u=mix(4.,3.,g);" "c=vec3(0,3,-4);" - "a=mix(vec3(0,3,0),vec3(-5,5,-9),H);" + "a=mix(vec3(0,3,0),vec3(-5,5,-9),g);" "}" "else" " if(v<65.)" @@ -707,7 +706,7 @@ const char *mouton_vert = "p=smoothstep(0.,.5,f);" "m=vec3(0);" "e=0.;" - "d=normalize(vec3(.3,0,1));" + "E=normalize(vec3(.3,0,1));" "c=mix(vec3(0,3,-4),vec3(0,2,-6),p);" "a=vec3(0,3,0);" "u=mix(4.,3.,p)+smoothstep(0.,7.,f)*.5;" @@ -716,7 +715,7 @@ const char *mouton_vert = " if(v<70.)" "{" "float f=v-65.;" - "d=normalize(vec3(0,0,1));" + "E=normalize(vec3(0,0,1));" "s=vec3(0,0,-f*3.-2.);" "i=vec3(-5,0,-8);" "m=vec3(1,1,.5);" @@ -731,29 +730,29 @@ const char *mouton_vert = "float f=v-70.;" "m=vec3(1);" "y=vec3(3,1.5,8);" - "float H=mod(f,8.),J=smoothstep(.5,1.,H)*smoothstep(2.8,2.5,H)-smoothstep(4.,4.5,H)*smoothstep(5.8,5.5,H)+cos(t)*.2;" - "d=normalize(vec3(J,cos(t*.5)*.1+.1,1));" - "w=.3;" + "float g=mod(f,8.),J=smoothstep(.5,1.,g)*smoothstep(2.8,2.5,g)-smoothstep(4.,4.5,g)*smoothstep(5.8,5.5,g)+cos(d)*.2;" + "E=normalize(vec3(J,cos(d*.5)*.1+.1,1));" + "t=.3;" "u=2.5;" "c=vec3(2.75,1,-5.25);" "a=vec3(0,2.3,0);" - "float F=mod(f,2.);" - "k+=smoothstep(.5,.6,F)*smoothstep(.7,.6,F)*.3;" - "F=mod(f+.3,3.);" - "k+=smoothstep(.5,.6,F)*smoothstep(.7,.6,F)*.3;" + "float N=mod(f,2.);" + "k+=smoothstep(.5,.6,N)*smoothstep(.7,.6,N)*.3;" + "N=mod(f+.3,3.);" + "k+=smoothstep(.5,.6,N)*smoothstep(.7,.6,N)*.3;" "}" "else" " if(v<85.)" "{" - "float f=v-80.,H=smoothstep(1.,3.,f);" - "m=vec3(0,1.-H*.5,1);" + "float f=v-80.,g=smoothstep(1.,3.,f);" + "m=vec3(0,1.-g*.5,1);" "y=vec3(3,1.5,6);" - "d=normalize(vec3(H*.5,.3-H*.45,1));" + "E=normalize(vec3(g*.5,.3-g*.45,1));" "u=4.;" "c=vec3(0,3,-4);" "a=vec3(0,3,0);" "if(f>3.)" - "e=max(fract(t*.333),fract(t*.333+.08));" + "e=max(fract(d*.333),fract(d*.333+.08));" "}" "else" " if(v<89.)" @@ -761,13 +760,13 @@ const char *mouton_vert = "float f=v-85.;" "s=vec3(0);" "z=vec3(-5,0,-8);" - "d=normalize(vec3(.5,-.15,1));" + "E=normalize(vec3(.5,-.15,1));" "m=vec3(0,.5,1);" "y=vec3(3,1.5,6);" - "float H=smoothstep(0.,1.,f);" - "u=mix(4.,3.,H);" + "float g=smoothstep(0.,1.,f);" + "u=mix(4.,3.,g);" "c=vec3(0,3,-4);" - "a=mix(vec3(0,3,0),vec3(-5,5,-9),H);" + "a=mix(vec3(0,3,0),vec3(-5,5,-9),g);" "}" "else" " if(v<97.)" @@ -775,8 +774,8 @@ const char *mouton_vert = "float f=v-89.;" "s=vec3(0,0,-11);" "z=vec3(-5,0,-8);" - "d=normalize(mix(vec3(1,-.5,1),vec3(0,.5,1),smoothstep(3.,3.5,f)));" - "d=normalize(mix(d,vec3(1,-.5,1),smoothstep(6.5,7.,f)));" + "E=normalize(mix(vec3(1,-.5,1),vec3(0,.5,1),smoothstep(3.,3.5,f)));" + "E=normalize(mix(E,vec3(1,-.5,1),smoothstep(6.5,7.,f)));" "l.y=smoothstep(3.,3.5,f)*.6;" "l.x=smoothstep(3.,3.5,f)*smoothstep(8.,6.,f)*.25*sin(f*3.);" "m=vec3(1,.2,.5);" @@ -788,11 +787,11 @@ const char *mouton_vert = "else" " if(v<107.)" "{" - "float f=v-98.,H=smoothstep(6.,9.,f);" + "float f=v-98.,g=smoothstep(6.,9.,f);" "s=vec3(0,0,f*.25-11.);" "z=vec3(-2,0,-8);" - "d=normalize(vec3(-.5,.25-H,1));" - "l.y=.5-H;" + "E=normalize(vec3(-.5,.25-g,1));" + "l.y=.5-g;" "m=vec3(1,.2,.5);" "y=vec3(-1,1,1)*.5;" "c=vec3(18,5,-5);" @@ -809,18 +808,18 @@ const char *mouton_vert = "a=mod(f,2.)<1.?" "(c=vec3(0,2,-8),vec3(0,3,0)):" "(c=vec3(0,5.5,2),vec3(0,5.75,0));" - "d=normalize(vec3(0,-.1,1));" + "E=normalize(vec3(0,-.1,1));" "u=3.+f*.1;" "}" "else" " if(v<116.)" "{" - "float f=v-109.,H=sin(min(f,5.));" + "float f=v-109.,g=sin(min(f,5.));" "m=vec3(0);" "y=vec3(0);" - "d=normalize(vec3(H*.7,0,1));" - "d=normalize(mix(d,vec3(-.3,.2,1),smoothstep(5.2,5.4,f)));" - "l.x=H*.25;" + "E=normalize(vec3(g*.7,0,1));" + "E=normalize(mix(E,vec3(-.3,.2,1),smoothstep(5.2,5.4,f)));" + "l.x=g*.25;" "o=smoothstep(6.,6.2,f)*.2;" "s=vec3(0,(smoothstep(6.,6.2,f)-smoothstep(6.2,6.4,f))*.4,0);" "u=3.5;" @@ -834,11 +833,11 @@ const char *mouton_vert = "s=vec3(9e7);" "z=vec3(-2,0,-8);" "x=vec3(5,0,-20);" - "float H=smoothstep(.5,1.5,f);" - "u=mix(3.5,5.,H);" + "float g=smoothstep(.5,1.5,f);" + "u=mix(3.5,5.,g);" "c=vec3(0,5.5,2);" - "a=mix(vec3(-.5,5.75,0),vec3(5,2,-20),H);" - "p=H*.3;" + "a=mix(vec3(-.5,5.75,0),vec3(5,2,-20),g);" + "p=g*.3;" "}" "else" " if(v<137.)" @@ -847,20 +846,20 @@ const char *mouton_vert = "m=vec3(.1);" "y=vec3(.2);" "u=2.8+f*.15;" - "int H=int(f);" - "if(H%4==1)" + "int g=int(f);" + "if(g%4==1)" "z=vec3(0,0,-8),c=vec3(2.5,2,-1),a=vec3(1,5.25,-8),u=2.8+pow(f*.3,1.2);" "else" - " if(H%4==3)" + " if(g%4==3)" "x=vec3(4,0,-8),c=vec3(0,5.5,2),a=vec3(4,3,-8),p=.3;" "else" " c=vec3(0,2.4,-8),a=vec3(0,3,0);" - "float F=smoothstep(.3,.7,fract(f));" - "if(H%4==0)" - "F=1.-F;" - "l.x=-F*.1;" - "d=normalize(mix(vec3(.1,-.25,1),vec3(-.2,.2,1),F));" - "d=normalize(d+vec3(cos(f*10.),cos(f*5.),1)*.01);" + "float J=smoothstep(.3,.7,fract(f));" + "if(g%4==0)" + "J=1.-J;" + "l.x=-J*.1;" + "E=normalize(mix(vec3(.1,-.25,1),vec3(-.2,.2,1),J));" + "E=normalize(E+vec3(cos(f*10.),cos(f*5.),1)*.01);" "}" "else" " if(v<140.)" @@ -873,20 +872,20 @@ const char *mouton_vert = "l.x=-.1;" "l.y=sin(f*2.)*.1;" "o=smoothstep(0.,3.,f)*.1;" - "d=normalize(vec3(-.2,.2,1));" + "E=normalize(vec3(-.2,.2,1));" "u=3.2-f*.15;" "}" "else" " if(v<150.)" "{" "float f=v-140.;" - "d=normalize(vec3(0,0,1));" + "E=normalize(vec3(0,0,1));" "s=vec3(0,0,-f*2.-2.);" "x=vec3(0,-.5,-30);" "m=vec3(1,1,.5);" "y=vec3(3,1.5,8);" - "float H=smoothstep(0.,10.,f);" - "c=vec3(-2,3.5,mix(-10.,-33.,H));" + "float g=smoothstep(0.,10.,f);" + "c=vec3(-2,3.5,mix(-10.,-33.,g));" "a=vec3(2,2,-3.-f*2.);" "u=3.;" "}" @@ -894,67 +893,95 @@ const char *mouton_vert = " if(v<155.)" "{" "float f=v-150.;" - "d=normalize(vec3(0,0,1));" - "s=vec3(0,-smoothstep(.05,.1,f)*4.5,-22);" + "E=normalize(vec3(0,0,1));" + "s=vec3(0,-smoothstep(.25,.4,f)*4.5,-22);" "x=vec3(2,0,-30);" "m=vec3(1,1,.5);" "y=vec3(3,1.5,8);" "c=vec3(-20,6,-13)+vec3(cos(f*72.),cos(f*64.),sin(f*48.))*3.*smoothstep(.09,.1,f)*smoothstep(.7,.1,f);" "a=vec3(3,2,-23);" "u=mix(4.,4.2,smoothstep(0.,5.,f));" - "float H=smoothstep(.1,0.,f)*13.;" - "n=vec3(0,H,-22);" + "float g=smoothstep(.4,.1,f)*13.;" + "n=vec3(0,g,-22);" "}" "else" "{" "float f=v-155.;" - "d=normalize(vec3(0,0,1));" + "E=normalize(vec3(0,0,1));" "s=vec3(9e7);" "z=vec3(-1,0,-8);" "x=vec3(1,0,-25);" "a=vec3(2,3.8,-18);" "c=vec3(5,5,2);" - "float H=smoothstep(1.5,2.,f);" - "u=2.5+H*3.5;" + "float g=smoothstep(1.5,2.,f);" + "u=2.5+g*3.5;" "n=vec3(7,0,-20);" - "p=H*.5;" + "p=g*.5;" "}" "}"; +const char *edges_frag = + "#version 150\n" + "out vec4 f;" + "const vec2 N=vec2(1280,720);" + "uniform sampler2D K;" + "uniform float d;\n" + "#define Sensitivity (vec2(0.3,1.5)*iResolution.y/400.0)\n" + "float G(vec4 v,vec4 f)" + "{" + "vec2 y=v.xy;" + "float c=v.z;" + "vec2 x=f.xy;" + "float m=f.z,s=mix(1.2,.4,smoothstep(1.,12.,c));" + "vec2 E=abs(y-x)*Sensitivity.x*s;" + "float i=abs(c-m)*Sensitivity.y*s;" + "return m>35.?" + "1.:" + "E.x+E.y<.15&&i<1.9?" + "1.:" + ".7;" + "}" + "void main()" + "{" + "vec4 v=texture(K,gl_FragCoord.xy/N.xy),c=texture(K,(gl_FragCoord.xy+vec2(1))/N.xy),y=texture(K,(gl_FragCoord.xy+vec2(-1))/N.xy),x=texture(K,(gl_FragCoord.xy+vec2(-1,1))/N.xy),a=texture(K,(gl_FragCoord.xy+vec2(1,-1))/N.xy);" + "float m=G(c,y)*G(x,a);" + "f=vec4(m,v.wz,1);" + "}"; + const char *fxaa_frag = "#version 150\n" "out vec4 f;" - "const vec2 K=vec2(1280,720);" - "uniform sampler2D M;" - "vec3 E(vec4 v,sampler2D f,vec2 y)" - "{" - "vec3 c=textureLod(f,v.zw,0.).xyz,d=textureLod(f,v.zw+vec2(1,0)*y.xy,0.).xyz,m=textureLod(f,v.zw+vec2(0,1)*y.xy,0.).xyz,a=textureLod(f,v.zw+vec2(1)*y.xy,0.).xyz,H=textureLod(f,v.xy,0.).xyz,x=vec3(.299,.587,.114);" - "float i=dot(c,x),z=dot(d,x),s=dot(m,x),u=dot(a,x),J=dot(H,x),M=min(J,min(min(i,z),min(s,u))),p=max(J,max(max(i,z),max(s,u)));" - "vec2 r;" - "r.x=-(i+z-s-u);" - "r.y=i+s-z-u;" - "float F=1./(min(abs(r.x),abs(r.y))+1./128.);" - "r=min(vec2(8),max(vec2(-8),r*F))*y.xy;" - "vec3 n=.5*(textureLod(f,v.xy+r*(1./3.-.5),0.).xyz+textureLod(f,v.xy+r*(2./3.-.5),0.).xyz),N=n*.5+.25*(textureLod(f,v.xy+r*-.5,0.).xyz+textureLod(f,v.xy+r*.5,0.).xyz);" - "float e=dot(N,x);" - "return ep?" + "const vec2 L=vec2(1280,720);" + "uniform sampler2D K;" + "vec3 F(vec4 v,sampler2D f,vec2 y)" + "{" + "vec3 c=textureLod(f,v.zw,0.).xyz,x=textureLod(f,v.zw+vec2(1,0)*y.xy,0.).xyz,m=textureLod(f,v.zw+vec2(0,1)*y.xy,0.).xyz,E=textureLod(f,v.zw+vec2(1)*y.xy,0.).xyz,a=textureLod(f,v.xy,0.).xyz,g=vec3(.299,.587,.114);" + "float i=dot(c,g),z=dot(x,g),s=dot(m,g),u=dot(E,g),J=dot(a,g),N=min(J,min(min(i,z),min(s,u))),p=max(J,max(max(i,z),max(s,u)));" + "vec2 d;" + "d.x=-(i+z-s-u);" + "d.y=i+s-z-u;" + "float S=1./(min(abs(d.x),abs(d.y))+1./128.);" + "d=min(vec2(8),max(vec2(-8),d*S))*y.xy;" + "vec3 n=.5*(textureLod(f,v.xy+d*(1./3.-.5),0.).xyz+textureLod(f,v.xy+d*(2./3.-.5),0.).xyz),K=n*.5+.25*(textureLod(f,v.xy+d*-.5,0.).xyz+textureLod(f,v.xy+d*.5,0.).xyz);" + "float U=dot(K,g);" + "return Up?" "n:" - "N;" + "K;" "}" "void main()" "{" - "vec2 y=1./K,v=gl_FragCoord.xy*y;" + "vec2 y=1./L,v=gl_FragCoord.xy*y;" "vec4 c=vec4(v,v-y*.5);" - "vec3 d=E(c,M,y);" - "f=vec4(d,1);" + "vec3 m=F(c,K,y);" + "f=vec4(m,1);" "}"; const char *postprocess_frag = "#version 150\n" "out vec4 f;" - "const vec2 L=vec2(1280,720);" - "uniform sampler2D M;" - "uniform float t;" + "const vec2 M=vec2(1280,720);" + "uniform sampler2D K;" + "uniform float d;" "vec2 b;" "float O(vec2 v)" "{" @@ -966,56 +993,62 @@ const char *postprocess_frag = "}" "float P(float v)" "{" - "float y=.01*O(v),f=O(v+1.),c=O(v+2.)-.5,d=O(v+3.),u=1.;" - "u=pow(abs(f*b.x+y*b.y+c),.0625);" - "return mix(.5,1.,d>.2?" - "u:" - "2.-u);" + "float f=.01*O(v),c=O(v+1.),y=O(v+2.)-.5,a=O(v+3.),x=1.;" + "x=pow(abs(c*b.x+f*b.y+y),.0625);" + "return mix(.5,1.,a>.2?" + "x:" + "2.-x);" "}" "float Q(float v)" "{" - "float y=O(v),f=O(v+1.),m=.01*O(v+2.);" - "vec2 c=vec2(y,f)-b;" - "c.x*=L.x/L.y;" - "float d=atan(c.y,c.x),u=1.,H=m*m*(sin(6.2831*d*y)*.1+1.);" - "u=dot(c,c)NUSKN(mTw*-)`&x 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 u339DE*k2i~XS&S# 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 N+Mgd_SaG>u{|h>Y;r{>t From 98ebae95bda53639e428947d5f96e1d633229640 Mon Sep 17 00:00:00 2001 From: Laurent Le Brun Date: Sat, 25 Feb 2023 01:28:16 +0100 Subject: [PATCH 4/9] Add the new shader pass to main.cpp The output is slightly different from what I have in Kodelife, I don't know why. --- Intro/leviathan.vcxproj | 1 + Intro/leviathan.vcxproj.filters | 3 + Intro/src/main.cpp | 21 + Intro/src/shaders/edges.frag | 22 +- Intro/src/shaders/fxaa.frag | 23 +- Intro/src/shaders/mouton.frag | 1 + Intro/src/shaders/postprocess.frag | 11 +- Intro/src/shaders/shaders.inl | 1460 ++++++++++++++-------------- mouton.klproj | Bin 16790 -> 16719 bytes 9 files changed, 770 insertions(+), 772 deletions(-) diff --git a/Intro/leviathan.vcxproj b/Intro/leviathan.vcxproj index e3178c6..dfee9a7 100644 --- a/Intro/leviathan.vcxproj +++ b/Intro/leviathan.vcxproj @@ -565,6 +565,7 @@ + diff --git a/Intro/leviathan.vcxproj.filters b/Intro/leviathan.vcxproj.filters index 445f2a4..285d287 100644 --- a/Intro/leviathan.vcxproj.filters +++ b/Intro/leviathan.vcxproj.filters @@ -26,6 +26,9 @@ shaders + + shaders + diff --git a/Intro/src/main.cpp b/Intro/src/main.cpp index c78e710..be4402a 100644 --- a/Intro/src/main.cpp +++ b/Intro/src/main.cpp @@ -24,9 +24,11 @@ // static allocation saves a few bytes static int shaderMain; static int shaderFXAA; +static int shaderEdges; static int shaderPostProcess; // static HDC hDC; + #pragma code_seg(".main") void entrypoint(void) { @@ -66,6 +68,14 @@ void entrypoint(void) ((PFNGLATTACHSHADERPROC)wglGetProcAddress("glAttachShader"))(shaderFXAA, f); ((PFNGLLINKPROGRAMPROC)wglGetProcAddress("glLinkProgram"))(shaderFXAA); + // Edges + f = ((PFNGLCREATESHADERPROC)wglGetProcAddress("glCreateShader"))(GL_FRAGMENT_SHADER); + ((PFNGLSHADERSOURCEPROC)wglGetProcAddress("glShaderSource"))(f, 1, &edges_frag, 0); + ((PFNGLCOMPILESHADERPROC)wglGetProcAddress("glCompileShader"))(f); + + shaderEdges = ((PFNGLCREATEPROGRAMPROC)wglGetProcAddress("glCreateProgram"))(); + ((PFNGLATTACHSHADERPROC)wglGetProcAddress("glAttachShader"))(shaderEdges, f); + ((PFNGLLINKPROGRAMPROC)wglGetProcAddress("glLinkProgram"))(shaderEdges); // Post process f = ((PFNGLCREATESHADERPROC)wglGetProcAddress("glCreateShader"))(GL_FRAGMENT_SHADER); @@ -93,6 +103,7 @@ void entrypoint(void) PeekMessage(0, 0, 0, 0, PM_REMOVE); #endif + // main renderer ((PFNGLUSEPROGRAMPROC)wglGetProcAddress("glUseProgram"))(shaderMain); ((PFNGLUNIFORM1FPROC)wglGetProcAddress("glUniform1f"))(0, time); @@ -114,6 +125,16 @@ void entrypoint(void) ((PFNGLUSEPROGRAMPROC)wglGetProcAddress("glUseProgram"))(shaderFXAA); glRects(-1, -1, 1, 1); + // edges + + glBindTexture(GL_TEXTURE_2D, 1); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 0, 0, XRES, YRES, 0); + ((PFNGLACTIVETEXTUREPROC)wglGetProcAddress("glActiveTexture"))(GL_TEXTURE0); + ((PFNGLUSEPROGRAMPROC)wglGetProcAddress("glUseProgram"))(shaderEdges); + ((PFNGLUNIFORM1IPROC)wglGetProcAddress("glUniform1i"))(0, 0); + glRects(-1, -1, 1, 1); + // Post processing glBindTexture(GL_TEXTURE_2D, 1); diff --git a/Intro/src/shaders/edges.frag b/Intro/src/shaders/edges.frag index e9a7ccf..1192db7 100644 --- a/Intro/src/shaders/edges.frag +++ b/Intro/src/shaders/edges.frag @@ -3,10 +3,6 @@ out vec4 fragColor; const vec2 iResolution = vec2(1280.,720.); uniform sampler2D prevPass; -uniform float iTime; - -// Edge detection Pass -#define Sensitivity (vec2(0.3, 1.5) * iResolution.y / 400.0) float checkSame(vec4 center, vec4 samplef) { @@ -16,14 +12,14 @@ float checkSame(vec4 center, vec4 samplef) float sampleDepth = samplef.z; // Less sensitive when it's far away; more edge details when it's closer. - float sensitivity = mix(1.2, 0.4, smoothstep(1., 12., centerDepth)); + float sensitivity = mix(1.2, 0.3, smoothstep(1., 25., centerDepth)); - vec2 diffNormal = abs(centerNormal - sampleNormal) * Sensitivity.x * sensitivity; - bool isSameNormal = (diffNormal.x + diffNormal.y) < 0.15; - float diffDepth = abs(centerDepth - sampleDepth) * Sensitivity.y * sensitivity; + vec2 diffNormal = abs(centerNormal - sampleNormal) * sensitivity; + bool isSameNormal = (diffNormal.x + diffNormal.y) < 0.2; + float diffDepth = abs(centerDepth - sampleDepth) * sensitivity; bool isSameDepth = diffDepth < 1.9; - if (sampleDepth > 35.) return 1.; + if (centerDepth > 35. && sampleDepth > 35.) return 1.; return (isSameNormal && isSameDepth) ? 1.0 : 0.7; } @@ -31,10 +27,10 @@ float checkSame(vec4 center, vec4 samplef) void main(void) { vec4 sample0 = texture(prevPass, gl_FragCoord.xy / iResolution.xy); - vec4 sample1 = texture(prevPass, (gl_FragCoord.xy + vec2(1.0, 1.0)) / iResolution.xy); - vec4 sample2 = texture(prevPass, (gl_FragCoord.xy + vec2(-1.0, -1.0)) / iResolution.xy); - vec4 sample3 = texture(prevPass, (gl_FragCoord.xy + vec2(-1.0, 1.0)) / iResolution.xy); - vec4 sample4 = texture(prevPass, (gl_FragCoord.xy + vec2(1.0, -1.0)) / iResolution.xy); + vec4 sample1 = texture(prevPass, (gl_FragCoord.xy + vec2(1., 1.)) / iResolution.xy); + vec4 sample2 = texture(prevPass, (gl_FragCoord.xy + vec2(-1., -1.)) / iResolution.xy); + vec4 sample3 = texture(prevPass, (gl_FragCoord.xy + vec2(-1., 1.)) / iResolution.xy); + vec4 sample4 = texture(prevPass, (gl_FragCoord.xy + vec2(1., -1.)) / iResolution.xy); float edge = checkSame(sample1, sample2) * checkSame(sample3, sample4); diff --git a/Intro/src/shaders/fxaa.frag b/Intro/src/shaders/fxaa.frag index d7effbd..4b8011c 100644 --- a/Intro/src/shaders/fxaa.frag +++ b/Intro/src/shaders/fxaa.frag @@ -1,6 +1,6 @@ #version 150 out vec4 fragColor; -const vec2 iResolution = vec2(1280.,720.); +#define iResolution vec2(1280.,720.) uniform sampler2D prevPass; @@ -10,10 +10,10 @@ uniform sampler2D prevPass; vec3 FxaaPixelShader( vec4 uv, sampler2D tex, vec2 rcpFrame) { - vec3 rgbNW = textureLod(tex, uv.zw, 0.0).xyz; - vec3 rgbNE = textureLod(tex, uv.zw + vec2(1,0)*rcpFrame.xy, 0.0).xyz; - vec3 rgbSW = textureLod(tex, uv.zw + vec2(0,1)*rcpFrame.xy, 0.0).xyz; - vec3 rgbSE = textureLod(tex, uv.zw + vec2(1,1)*rcpFrame.xy, 0.0).xyz; + vec3 rgbNW = textureLod(tex, uv.zw, 0.0).www; + vec3 rgbNE = textureLod(tex, uv.zw + vec2(1,0)*rcpFrame.xy, 0.0).www; + vec3 rgbSW = textureLod(tex, uv.zw + vec2(0,1)*rcpFrame.xy, 0.0).www; + vec3 rgbSE = textureLod(tex, uv.zw + vec2(1,1)*rcpFrame.xy, 0.0).www; vec3 rgbM = textureLod(tex, uv.xy, 0.0).xyz; vec3 luma = vec3(0.299, 0.587, 0.114); @@ -37,11 +37,11 @@ vec3 FxaaPixelShader( vec4 uv, sampler2D tex, vec2 rcpFrame) { dir * rcpDirMin)) * rcpFrame.xy; vec3 rgbA = (1.0/2.0) * ( - textureLod(tex, uv.xy + dir * (1.0/3.0 - 0.5), 0.0).xyz + - textureLod(tex, uv.xy + dir * (2.0/3.0 - 0.5), 0.0).xyz); + textureLod(tex, uv.xy + dir * (1.0/3.0 - 0.5), 0.0).www + + textureLod(tex, uv.xy + dir * (2.0/3.0 - 0.5), 0.0).www); vec3 rgbB = rgbA * (1.0/2.0) + (1.0/4.0) * ( - textureLod(tex, uv.xy + dir * (0.0/3.0 - 0.5), 0.0).xyz + - textureLod(tex, uv.xy + dir * (3.0/3.0 - 0.5), 0.0).xyz); + textureLod(tex, uv.xy + dir * (0.0/3.0 - 0.5), 0.0).www + + textureLod(tex, uv.xy + dir * (3.0/3.0 - 0.5), 0.0).www); float lumaB = dot(rgbB, luma); @@ -57,5 +57,6 @@ void main(void) vec4 uv = vec4( texcoord, texcoord - (invRes * 0.5)); vec3 col = FxaaPixelShader(uv, prevPass, invRes); - fragColor = vec4(col,1.); -} \ No newline at end of file + vec4 orig = textureLod(prevPass, uv.xy, 0.0); + fragColor = vec4(orig.xyz, col.r); +} diff --git a/Intro/src/shaders/mouton.frag b/Intro/src/shaders/mouton.frag index 751eb15..afb714b 100644 --- a/Intro/src/shaders/mouton.frag +++ b/Intro/src/shaders/mouton.frag @@ -633,6 +633,7 @@ void main() float starColor = mix(.55, .4, smoothstep(-.1,.6, star2d(p, size*.5, .5)))*1.3; col = mix(col, starColor, smoothstep(0.,-0.01, star) * excited); t = mix(100., t, smoothstep(0.,0.01, star)); + n = mix(vec3(1.), n, smoothstep(0.,0.01, star)); } vec2 norm = n.xz; // fixme diff --git a/Intro/src/shaders/postprocess.frag b/Intro/src/shaders/postprocess.frag index 18c6ce7..24445bd 100644 --- a/Intro/src/shaders/postprocess.frag +++ b/Intro/src/shaders/postprocess.frag @@ -66,13 +66,12 @@ void main(void) suv += (suv*2.-1.)*invRes.x*.5; float sens = mix(1.2, 0.3, smoothstep(1., 10., texture(prevPass,suv).z)); - float noise = rand(t+9.)*.005*sens; // (texture(prevPass, suv * 0.5).r - 0.5) * NoiseAmount; - vec2 uvs[3]; - uvs[0] = suv + vec2(ErrorRange * sin(ErrorPeriod * suv.y + 0.0) + noise, ErrorRange * sin(ErrorPeriod * suv.x + 0.0) + noise); - uvs[1] = suv + vec2(ErrorRange * sin(ErrorPeriod * suv.y + 1.047) + noise, ErrorRange * sin(ErrorPeriod * suv.x + 3.142) + noise); - uvs[2] = suv + vec2(ErrorRange * sin(ErrorPeriod * suv.y + 2.094) + noise, ErrorRange * sin(ErrorPeriod * suv.x + 1.571) + noise); + float noise = rand(t+9.)*.005*sens; + vec2 uvs1 = suv + vec2(ErrorRange * sin(ErrorPeriod * suv.y + 0.0) + noise, ErrorRange * sin(ErrorPeriod * suv.x + 0.0) + noise); + vec2 uvs2 = suv + vec2(ErrorRange * sin(ErrorPeriod * suv.y + 1.047) + noise, ErrorRange * sin(ErrorPeriod * suv.x + 3.142) + noise); + vec2 uvs3 = suv + vec2(ErrorRange * sin(ErrorPeriod * suv.y + 2.094) + noise, ErrorRange * sin(ErrorPeriod * suv.x + 1.571) + noise); - float edge = texture(prevPass, uvs[0]).r * texture(prevPass, uvs[1]).r * texture(prevPass, uvs[2]).r; + float edge = texture(prevPass, uvs1).r * texture(prevPass, uvs2).r * texture(prevPass, uvs3).r; float col = texture(prevPass,suv).g; diff --git a/Intro/src/shaders/shaders.inl b/Intro/src/shaders/shaders.inl index b20b845..74b382f 100644 --- a/Intro/src/shaders/shaders.inl +++ b/Intro/src/shaders/shaders.inl @@ -1,59 +1,37 @@ // Generated with Shader Minifier 1.3.3 (https://github.com/laurentlb/Shader_Minifier/) #ifndef SHADERS_INL_ # define SHADERS_INL_ -# define VAR_a_position "U" -# define VAR_animationAmp "m" -# define VAR_animationSpeed "y" -# define VAR_anvilPos "n" -# define VAR_blink "e" -# define VAR_camFocal "u" -# define VAR_camPos "c" -# define VAR_camTa "a" -# define VAR_excited "p" -# define VAR_eyeDir "E" -# define VAR_eyesSurprise "o" -# define VAR_fishEyeFactor "t" -# define VAR_flowerPos "x" -# define VAR_fragColor "f" -# define VAR_headRot "l" -# define VAR_iTime "d" -# define VAR_noseSize "k" -# define VAR_panelPos "i" -# define VAR_panelWarningPos "z" -# define VAR_prevPass "K" -# define VAR_sheepPos "s" -# define VAR_sunDir "r" const char *mouton_frag = "#version 150\n" - "out vec4 f;" + "out vec4 fragColor;" "const vec2 v=vec2(1280,720);" - "in vec3 m,y,s,x,i,z,n,r,c,a,E;" - "in vec2 l;" - "in float e,u,o,p,t,k;" - "uniform float d;" - "const float S=acos(-1.);" - "vec2 h(vec2 i,vec2 y)" + "in vec3 animationAmp,animationSpeed,sheepPos,flowerPos,panelPos,panelWarningPos,anvilPos,sunDir,camPos,camTa,eyeDir;" + "in vec2 headRot;" + "in float blink,camFocal,eyesSurprise,excited,fishEyeFactor,noseSize;" + "uniform float iTime;" + "const float s=acos(-1.);" + "vec2 p(vec2 i,vec2 y)" "{" "return i.xa||a<0.?" + "vec3 y=m*s,x=abs(m)*v,d=-y-x,p=-y+x;" + "float r=max(max(d.x,d.y),d.z),a=min(min(p.x,p.y),p.z);" + "return r>a||a<0.?" "vec2(-1):" - "vec2(E,a);" + "vec2(r,a);" "}" - "vec3 h(vec3 v)" + "vec3 f(vec3 v)" "{" "uvec3 f=uvec3(v*1e5);" "f=(f>>8U^f.yzx)*1103515245U;" @@ -61,994 +39,992 @@ const char *mouton_frag = "f=(f>>8U^f.yzx)*1103515245U;" "return vec3(f)*(1./float(-1U));" "}" - "float h(vec3 i,vec2 v,float m)" + "float f(vec3 i,vec2 v,float m)" "{" - "float f=m*m,y=int(d*12)/12.;" + "float s=m*m,y=int(iTime*12)/12.;" "vec2 x=vec2(cos(y*.7+2.4),sin(y*.7+2.4)*.75);" - "float s=smoothstep(.151,.15,length(v-x));" - "s*=smoothstep(.15,.1501,length(v-x-vec2(.1,.025)));" - "s+=exp(-length(v-x)*2.)*.1;" - "s*=smoothstep(.5,0.,r.y);" - "vec2 c=v*2e2,a=fract(c)-.5,E=floor(c);" - "vec3 n=h(vec3(abs(E),abs(E.x)));" - "float z=n.z*.1;" - "s+=smoothstep(z,z*.01,length(n.xy-.5+a))*(cos(y*n.y+n.z*3.14)*.5+.5);" - "f+=s*smoothstep(.5,-1.,r.y);" - "return f;" + "float a=smoothstep(.151,.15,length(v-x));" + "a*=smoothstep(.15,.1501,length(v-x-vec2(.1,.025)));" + "a+=exp(-length(v-x)*2.)*.1;" + "a*=smoothstep(.5,0.,sunDir.y);" + "vec2 d=v*2e2,r=fract(d)-.5,p=floor(d);" + "vec3 l=f(vec3(abs(p),abs(p.x)));" + "float e=l.z*.1;" + "a+=smoothstep(e,e*.01,length(l.xy-.5+r))*(cos(y*l.y+l.z*3.14)*.5+.5);" + "s+=a*smoothstep(.5,-1.,sunDir.y);" + "return s;" "}" - "float w(float v)" + "float p(float v)" "{" "return fract(v*17.*fract(v*.3183099));" "}" - "float g(vec3 v)" + "float x(vec3 v)" "{" - "vec3 m=floor(v),s=fract(v),y=s*s*s*(s*(s*6.-15.)+10.);" - "float x=m.x+317.*m.y+157.*m.z,f=w(x),c=w(x+1.),E=w(x+317.),a=w(x+318.),z=w(x+157.),u=w(x+158.),p=w(x+474.),r=w(x+475.);" - "return-1.+2.*(f+(c-f)*y.x+(E-f)*y.y+(z-f)*y.z+(f-c-E+a)*y.x*y.y+(f-E-z+p)*y.y*y.z+(f-c-z+u)*y.z*y.x+(-f+c+E-a+z-u-p+r)*y.x*y.y*y.z);" + "vec3 s=floor(v),m=fract(v),d=m*m*m*(m*(m*6.-15.)+10.);" + "float y=s.x+317.*s.y+157.*s.z,x=p(y),f=p(y+1.),a=p(y+317.),r=p(y+318.),c=p(y+157.),l=p(y+158.),e=p(y+474.),z=p(y+475.);" + "return-1.+2.*(x+(f-x)*d.x+(a-x)*d.y+(c-x)*d.z+(x-f-a+r)*d.x*d.y+(x-a-c+e)*d.y*d.z+(x-f-c+l)*d.z*d.x+(-x+f+a-r+c-l-e+z)*d.x*d.y*d.z);" "}" - "vec2 B(vec3 v)" + "vec2 n(vec3 v)" "{" - "float y=int(d*12)/12.;" - "v.xz-=n.xz;" - "v.y-=-n.y;" - "float x=v.y+smoothstep(1.,20.,length(v.xz));" - "return x<.4?" - "(x-=pow((g(v*.7+1.)*.5+g(v*1.7+1e2)*.3+g(v*2.7+1e2)*.1)*.5+.5,3.)*.45*(1.-exp(-(y-150.)*4.))+.03,vec2(x,12)):" + "float s=int(iTime*12)/12.;" + "v.xz-=anvilPos.xz;" + "v.y-=-anvilPos.y;" + "float y=v.y+smoothstep(1.,20.,length(v.xz));" + "return y<.4?" + "(y-=pow((x(v*.7+1.)*.5+x(v*1.7+1e2)*.3+x(v*2.7+1e2)*.1)*.5+.5,3.)*.45*(1.-exp(-(s-150.)*4.))+.03,vec2(y,12)):" "vec2(9e7,0);" "}" - "mat3 B(vec3 v,vec3 y)" + "mat3 n(vec3 v,vec3 y)" "{" - "const vec3 x=vec3(0,1,0);" - "vec3 f=normalize(y-v),c=normalize(cross(f,normalize(x)));" - "return mat3(c,cross(c,f),f);" + "const vec3 s=vec3(0,1,0);" + "vec3 i=normalize(y-v),d=normalize(cross(i,normalize(s)));" + "return mat3(d,cross(d,i),i);" "}" - "mat2 A(float v)" + "mat2 m(float v)" "{" - "float y=cos(v),x=sin(v);" - "return mat2(y,x,-x,y);" + "float s=cos(v),y=sin(v);" + "return mat2(s,y,-y,s);" "}" - "float A(vec3 v,vec3 y)" + "float m(vec3 v,vec3 y)" "{" - "vec3 f=abs(v)-y;" - "return length(max(f,0.))+min(max(f.x,max(f.y,f.z)),0.);" + "vec3 s=abs(v)-y;" + "return length(max(s,0.))+min(max(s.x,max(s.y,s.z)),0.);" "}" - "vec2 C(vec3 v)" + "vec2 t(vec3 v)" "{" - "v-=n;" - "v.xz=A(1.)*v.xz;" - "float y=pow(clamp(v.y-1.,.004,1.),.5),f=A(v-vec3(0,1,0),vec3(1.5-y,1,2.5-y));" + "v-=anvilPos;" + "v.xz=m(1.)*v.xz;" + "float s=pow(clamp(v.y-1.,.004,1.),.5),f=m(v-vec3(0,1,0),vec3(1.5-s,1,2.5-s));" "if(f<10.)" "{" - "f=min(f,A(v-vec3(0,3,0),vec3(2,1,3)));" - "float x=length((v.yz-vec2(4.5,3))*vec2(1,.8))-2.;" - "x=max(x,abs(v.x)-.5);" - "x=max(x,v.y-3.5);" - "f=min(f,x);" - "vec2 i=vec2(f-.1,11);" - "return i;" + "f=min(f,m(v-vec3(0,3,0),vec3(2,1,3)));" + "float i=length((v.yz-vec2(4.5,3))*vec2(1,.8))-2.;" + "i=max(i,abs(v.x)-.5);" + "i=max(i,v.y-3.5);" + "f=min(f,i);" + "vec2 y=vec2(f-.1,11);" + "return y;" "}" "return vec2(9e7,0);" "}" - "vec2 D(vec3 v)" + "vec2 e(vec3 v)" "{" - "v-=i;" - "float f=A(v-vec3(0,7.5,-5),vec3(.8,.8,.1))-.2;" - "if(f<7.)" + "v-=panelPos;" + "float s=m(v-vec3(0,7.5,-5),vec3(.8,.8,.1))-.2;" + "if(s<7.)" "{" - "f=max(f,abs(v.z+5.)-.1);" - "float y=A(v-vec3(0,4,-5.1),vec3(.11,4,.08));" - "vec2 x=vec2(y,5);" - "x=h(x,vec2(f,7));" - "return x;" + "s=max(s,abs(v.z+5.)-.1);" + "float i=m(v-vec3(0,4,-5.1),vec3(.11,4,.08));" + "vec2 f=vec2(i,5);" + "f=p(f,vec2(s,7));" + "return f;" "}" "return vec2(9e7,0);" "}" - "float A(vec3 v,float y,float i,float x)" + "float e(vec3 v,float s,float i,float y)" "{" - "vec2 m=vec2(length(v.xz),v.y),f=vec2(x,y),c=vec2(x-i,2.*y),E=vec2(m.x-min(m.x,m.y<0.?" + "vec2 m=vec2(length(v.xz),v.y),f=vec2(y,s),x=vec2(y-i,2.*s),d=vec2(m.x-min(m.x,m.y<0.?" "i:" - "x),abs(m.y)-y),z=m-f+c*clamp(dot(f-m,c)/dot(c,c),0.,1.);" - "return(z.x<0.&&E.y<0.?" + "y),abs(m.y)-s),p=m-f+x*clamp(dot(f-m,x)/dot(x,x),0.,1.);" + "return(p.x<0.&&d.y<0.?" "-1.:" - "1.)*sqrt(min(dot(E,E),dot(z,z)));" + "1.)*sqrt(min(dot(d,d),dot(p,p)));" "}" - "float B(vec3 v,vec3 x,vec3 m,float y)" + "float m(vec3 v,vec3 s,vec3 m,float y)" "{" - "vec3 f=v-x,c=m-x;" - "float i=clamp(dot(f,c)/dot(c,c),0.,1.);" - "return length(f-c*i)-y;" + "vec3 i=v-s,x=m-s;" + "float d=clamp(dot(i,x)/dot(x,x),0.,1.);" + "return length(i-x*d)-y;" "}" - "float C(vec3 v,vec2 y)" + "float e(vec3 v,vec2 y)" "{" - "vec2 f=vec2(length(v.xy)-y.x,v.z);" - "return length(f)-y.y;" + "vec2 s=vec2(length(v.xy)-y.x,v.z);" + "return length(s)-y.y;" "}" - "float D(vec3 v,vec3 y)" + "float t(vec3 v,vec3 y)" "{" - "float f=length(v/y),x=length(v/(y*y));" - "return f*(f-1.)/x;" + "float s=length(v/y),f=length(v/(y*y));" + "return s*(s-1.)/f;" "}" - "vec2 F(vec3 v)" + "vec2 i(vec3 v)" "{" - "float y=int(d*12)/12.;" - "v-=x;" - "vec3 f=v;" - "f.x+=cos(.775+y)*3.1*.2;" - "f.y-=2.8;" - "f.zy=A(.7)*f.zy;" - "float c=D(f-vec3(0,.3,0),vec3(1,.2+cos(f.x*150.)*sin(f.z*150.)*.05,1)*.25);" - "if(c<5.)" + "float y=int(iTime*12)/12.;" + "v-=flowerPos;" + "vec3 i=v;" + "i.x+=cos(.775+y)*3.1*.2;" + "i.y-=2.8;" + "i.zy=m(.7)*i.zy;" + "float d=t(i-vec3(0,.3,0),vec3(1,.2+cos(i.x*150.)*sin(i.z*150.)*.05,1)*.25);" + "if(d<5.)" "{" - "vec2 m=vec2(c,8);" - "vec3 i=f;" - "i.xz=w(i.xz,S*.2);" - "float E=D(i-vec3(.5,.2+sin(i.x*2.)*.2,0),vec3(2,.1+sin(i.z*40.)*.02,.75)*.25);" - "if(E0.)" + "vec3 s=1./y;" + "float d=9e7,m;" + "vec2 r=f(v-sheepPos-vec3(0,3,-2),y,vec3(3,3,7),s);" + "if(r.y>0.)" "{" - "c=max(E.x,0.);" - "for(int u=0;u<128;u++)" + "m=max(r.x,0.);" + "for(int a=0;a<128;a++)" "{" - "vec3 a=v+y*c;" - "float d=h(vec2(a.y,0),G(a)).x;" - "c+=d;" - "if(c>E.y||abs(d)<.001)" + "vec3 x=v+y*m;" + "float l=p(vec2(x.y,0),h(x)).x;" + "m+=l;" + "if(m>r.y||abs(l)<.001)" "break;" "}" - "if(c0.)" + "r=f(v-panelPos-vec3(0,5,-5),y,vec3(1.5,5,1),s);" + "if(r.y>0.)" "{" - "c=max(E.x,0.);" - "for(int u=0;u<128;u++)" + "m=max(r.x,0.);" + "for(int a=0;a<128;a++)" "{" - "float a=D(v+y*c).x;" - "c+=a;" - "if(c>E.y||abs(a)<.001)" + "float x=e(v+y*m).x;" + "m+=x;" + "if(m>r.y||abs(x)<.001)" "break;" "}" - "if(c0.)" + "r=f(v-panelWarningPos-vec3(0,5,-5),y,vec3(1.5,5,1),s);" + "if(r.y>0.)" "{" - "c=max(E.x,0.);" - "for(int u=0;u<128;u++)" + "m=max(r.x,0.);" + "for(int a=0;a<128;a++)" "{" - "float a=H(v+y*c).x;" - "c+=a;" - "if(c>E.y||abs(a)<.001)" + "float x=c(v+y*m).x;" + "m+=x;" + "if(m>r.y||abs(x)<.001)" "break;" "}" - "if(c0.)" + "r=f(v-flowerPos-vec3(0,5,0),y,vec3(2,5,1),s);" + "if(r.y>0.)" "{" - "c=max(E.x,0.);" - "for(int u=0;u<128;u++)" + "m=max(r.x,0.);" + "for(int a=0;a<128;a++)" "{" - "float a=F(v+y*c).x;" - "c+=a;" - "if(c>E.y||abs(a)<.001)" + "float x=i(v+y*m).x;" + "m+=x;" + "if(m>r.y||abs(x)<.001)" "break;" "}" - "if(c0.)" + "r=f(v-anvilPos-vec3(0,3,2),y,vec3(4,4,5),s);" + "if(r.y>0.)" "{" - "c=max(E.x,0.);" - "for(int u=0;u<128;u++)" + "m=max(r.x,0.);" + "for(int a=0;a<128;a++)" "{" - "float a=C(v+y*c).x;" - "c+=a;" - "if(c>E.y||abs(a)<.001)" + "float x=t(v+y*m).x;" + "m+=x;" + "if(m>r.y||abs(x)<.001)" "break;" "}" - "if(c0.&&length((v+y*c).xz-n.xz)<10.)" + "m=-(v.y+.4)*s.y;" + "if(m>0.&&length((v+y*m).xz-anvilPos.xz)<10.)" "{" - "for(int u=0;u<128;u++)" + "for(int a=0;a<128;a++)" "{" - "vec3 a=v+y*c;" - "float d=min(a.y,B(a).x);" - "c+=d;" - "if(c>E.y||abs(d)<.001)" + "vec3 x=v+y*m;" + "float l=min(x.y,n(x).x);" + "m+=l;" + "if(m>r.y||abs(l)<.001)" "break;" "}" - "if(c<1e2)" - "m=min(m,c);" + "if(m<1e2)" + "d=min(d,m);" "}" - "c=-v.y*f.y;" - "if(c>0.)" - "m=min(m,c);" - "return m;" + "m=-v.y*s.y;" + "if(m>0.)" + "d=min(d,m);" + "return d;" "}" - "vec3 J(vec3 v)" + "vec3 d(vec3 v)" "{" - "vec2 y=vec2(1e-4,0);" - "float m=I(v).x;" + "vec2 s=vec2(1e-4,0);" + "float m=a(v).x;" "vec3 f;" - "f.x=m-I(v-y.xyy).x;" - "f.y=m-I(v-y.yxy).x;" - "f.z=m-I(v-y.yyx).x;" + "f.x=m-a(v-s.xyy).x;" + "f.y=m-a(v-s.yxy).x;" + "f.z=m-a(v-s.yyx).x;" "return normalize(f);" "}" - "float D(vec3 v,vec3 y,float m,float f)" + "float c(vec3 v,vec3 y,float s,float i)" "{" - "float c=1.,x=m;" - "for(int i=0;i<64;i++)" + "float f=1.,c=s;" + "for(int r=0;r<64;r++)" "{" - "float s=I(v+y*x).x;" - "c=min(c,30.*s/x);" - "x+=s;" - "if(c<1e-4||x>f)" + "float m=a(v+y*c).x;" + "f=min(f,30.*m/c);" + "c+=m;" + "if(f<1e-4||c>i)" "break;" "}" - "return clamp(c,0.,1.);" + "return clamp(f,0.,1.);" "}" - "float F(vec2 v,float f,float y,float x)" + "float d(vec2 v,float s,float y,float i)" "{" "v.x=abs(v.x);" - "float c=(f-y)/x,E=sqrt(1.-c*c),m=dot(v,vec2(-c,E));" - "return m<0.?" - "length(v)-f:" - "m>E*x?" - "length(v-vec2(0,x))-y:" - "dot(v,vec2(E,c))-f;" + "float x=(s-y)/i,d=sqrt(1.-x*x),f=dot(v,vec2(-x,d));" + "return f<0.?" + "length(v)-s:" + "f>d*i?" + "length(v-vec2(0,i))-y:" + "dot(v,vec2(d,x))-s;" "}" - "float A(vec3 v,vec3 f,vec3 m,vec3 y,vec2 c)" + "float a(vec3 v,vec3 i,vec3 s,vec3 y,vec2 x)" "{" - "vec2 a=I(m);" - "float u=int(d*12)/12.,s=smoothstep(0.,.3,r.y)+.1,U=C(m,y,.15,1.);" - "U*=C(m,y,1.,.1)*.5;" - "float w=D(m,r,.08,50.),n=clamp(1.+dot(f,y),0.,5.),l=.85*max(dot(y,r),0.)*pow(w,1.2),t=.085*max(dot(y,-r),0.)*U,H=.45*U,G=0.,J=0.;" - "if(a.y==0.)" - "J=3.;" + "vec2 r=a(s);" + "float l=int(iTime*12)/12.,p=smoothstep(0.,.3,sunDir.y)+.1,e=a(s,y,.15,1.);" + "e*=a(s,y,1.,.1)*.5;" + "float E=c(s,sunDir,.08,50.),z=clamp(1.+dot(i,y),0.,5.),o=.85*max(dot(y,sunDir),0.)*pow(E,1.2),n=.085*max(dot(y,-sunDir),0.)*e,g=.45*e,k=0.,b=0.;" + "if(r.y==0.)" + "b=3.;" "else" - " if(a.y==1.)" - "J=.4,G=.35;" + " if(r.y==1.)" + "b=.4,k=.35;" "else" - " if(a.y==4.)" - "J=.025;" + " if(r.y==4.)" + "b=.025;" "else" - " if(a.y==3.)" + " if(r.y==3.)" "{" - "float g=dot(y,normalize(vec3(0,0,1))),N=dot(y,E),S=smoothstep(-.953,-.952,N-o/2.);" - "J=mix(.1,1.5,S);" - "if(g>0.||e>.95)" - "a.y=2.;" + "float t=dot(y,normalize(vec3(0,0,1))),F=dot(y,eyeDir),w=smoothstep(-.953,-.952,F-eyesSurprise/2.);" + "b=mix(.1,1.5,w);" + "if(t>0.||blink>.95)" + "r.y=2.;" "}" "else" - " if(a.y==5.)" - "J=1.;" + " if(r.y==5.)" + "b=1.;" "else" - " if(a.y==6.)" + " if(r.y==6.)" "{" - "vec3 g=m-z;" + "vec3 t=s-panelWarningPos;" "if(y.z>.5)" "{" - "float S=C(g-vec3(0,7.5,-5),vec2(1.3,.2),.01),N=smoothstep(.13,.1295,distance(g,vec3(0,7.06,-4.9)));" - "N+=smoothstep(.005,0.,F(g.xy-vec2(0,7.3),.06,.14,1.));" - "J=mix(.5,2.,smoothstep(.005,0.,S));" - "J=mix(J,.1,N);" + "float w=h(t-vec3(0,7.5,-5),vec2(1.3,.2),.01),F=smoothstep(.13,.1295,distance(t,vec3(0,7.06,-4.9)));" + "F+=smoothstep(.005,0.,d(t.xy-vec2(0,7.3),.06,.14,1.));" + "b=mix(.5,2.,smoothstep(.005,0.,w));" + "b=mix(b,.1,F);" "}" "else" - " J=1.;" + " b=1.;" "}" "else" - " if(a.y==7.)" + " if(r.y==7.)" "{" - "vec3 g=m-i;" + "vec3 t=s-panelPos;" "if(y.z>.5)" "{" - "J=.5;" - "g.y-=7.4;" - "float S=A(g-vec3(0,.1,-5),vec3(.8,.8,1)),N=0.;" - "g.xy=A(.8)*g.xy;" - "float K=.04;" - "N+=smoothstep(.01,0.,F(g.xy-vec2(-K,-.6),.1,.05,1.));" - "N+=smoothstep(.01,0.,F(g.xy-vec2(-K,.5),.16,.135,.15));" - "N*=smoothstep(0.,.01,F(g.xy-vec2(-K-.08,.56),.001,.02,.2));" - "N*=smoothstep(0.,.01,F(g.xy-vec2(-K+.04,.56),.001,.02,.2));" - "g.xy=A(-1.6)*g.xy;" - "N+=smoothstep(.01,0.,F(g.xy-vec2(K,-.6),.1,.05,1.));" - "N+=smoothstep(.01,0.,F(g.xy-vec2(K,.5),.16,.1,.15));" - "J=mix(J,2.,smoothstep(.01,0.,S));" - "J=mix(J,0.,N);" + "b=.5;" + "t.y-=7.4;" + "float w=m(t-vec3(0,.1,-5),vec3(.8,.8,1)),F=0.;" + "t.xy=m(.8)*t.xy;" + "float G=.04;" + "F+=smoothstep(.01,0.,d(t.xy-vec2(-G,-.6),.1,.05,1.));" + "F+=smoothstep(.01,0.,d(t.xy-vec2(-G,.5),.16,.135,.15));" + "F*=smoothstep(0.,.01,d(t.xy-vec2(-G-.08,.56),.001,.02,.2));" + "F*=smoothstep(0.,.01,d(t.xy-vec2(-G+.04,.56),.001,.02,.2));" + "t.xy=m(-1.6)*t.xy;" + "F+=smoothstep(.01,0.,d(t.xy-vec2(G,-.6),.1,.05,1.));" + "F+=smoothstep(.01,0.,d(t.xy-vec2(G,.5),.16,.1,.15));" + "b=mix(b,2.,smoothstep(.01,0.,w));" + "b=mix(b,0.,F);" "}" "else" - " J=1.;" + " b=1.;" "}" "else" - " if(a.y==8.)" + " if(r.y==8.)" "{" - "vec3 g=m-x;" - "g.x+=cos(.775+u)*3.1*.2;" - "g.y-=2.8;" - "g.zy=A(.75)*g.zy;" - "J=mix(.9,1.3,smoothstep(0.,.45,length(g-vec3(0,.3,0))))*1.8;" + "vec3 t=s-flowerPos;" + "t.x+=cos(.775+l)*3.1*.2;" + "t.y-=2.8;" + "t.zy=m(.75)*t.zy;" + "b=mix(.9,1.3,smoothstep(0.,.45,length(t-vec3(0,.3,0))))*1.8;" "}" "else" - " if(a.y==10.)" - "J=.02;" + " if(r.y==10.)" + "b=.02;" "else" - " if(a.y==9.)" + " if(r.y==9.)" "{" - "vec3 g=m-x;" - "g.x+=cos(.775+u)*3.1*.2;" - "g.y-=2.8;" - "g.zy=A(.75)*g.zy;" - "J=mix(1.5,.7,smoothstep(.5,1.1,length(g-vec3(0,.3,0))))*2.;" + "vec3 t=s-flowerPos;" + "t.x+=cos(.775+l)*3.1*.2;" + "t.y-=2.8;" + "t.zy=m(.75)*t.zy;" + "b=mix(1.5,.7,smoothstep(.5,1.1,length(t-vec3(0,.3,0))))*2.;" "}" "else" - " if(a.y==11.)" - "J=1.,l*=.1*n,H*=.1*n,t=0.;" + " if(r.y==11.)" + "b=1.,o*=.1*z,g*=.1*z,n=0.;" "else" - " if(a.y==12.)" + " if(r.y==12.)" "{" - "J=.4;" - "float g=n*n;" - "l*=3.;" - "H*=2.*g;" + "b=.4;" + "float t=z*z;" + "o*=3.;" + "g*=2.*t;" "}" - "if(a.y==2.)" - "J=.8,H*=.8;" - "float g=(J*(H+l*.5+t*2.)+G)*s,N=length(m-v);" - "g=mix(g,h(f,c,s),smoothstep(90.,1e2,N));" - "if(a.y==0.)" + "if(r.y==2.)" + "b=.8,g*=.8;" + "float t=(b*(g+o*.5+n*2.)+k)*p,w=length(s-v);" + "t=mix(t,f(i,x,p),smoothstep(90.,1e2,w));" + "if(r.y==0.)" "{" - "float S=cos(atan(c.x,c.y)*15.+u*3.),K=length(c)*.5;" - "g=mix(g,mix(.5,1.,smoothstep(-K,K,S)),p);" + "float F=cos(atan(x.x,x.y)*15.+l*3.),G=length(x)*.5;" + "t=mix(t,mix(.5,1.,smoothstep(-G,G,F)),excited);" "}" - "return clamp(g,0.,1.);" + "return clamp(t,0.,1.);" "}" - "float D(vec2 v,float y,float m)" + "float a(vec2 v,float s,float m)" "{" - "const vec2 f=vec2(.809016994375,-.587785252292),c=vec2(-f.x,f.y);" + "const vec2 y=vec2(.809016994375,-.587785252292),d=vec2(-y.x,y.y);" "v.x=abs(v.x);" - "v-=2.*max(dot(f,v),0.)*f;" - "v-=2.*max(dot(c,v),0.)*c;" + "v-=2.*max(dot(y,v),0.)*y;" + "v-=2.*max(dot(d,v),0.)*d;" "v.x=abs(v.x);" - "v.y-=y;" - "vec2 x=m*vec2(-f.y,f.x)-vec2(0,1);" - "float i=clamp(dot(v,x)/dot(x,x),0.,y);" + "v.y-=s;" + "vec2 x=m*vec2(-y.y,y.x)-vec2(0,1);" + "float i=clamp(dot(v,x)/dot(x,x),0.,s);" "return length(v-x*i)*sign(v.y*x.x-v.x*x.y);" "}" "void main()" "{" - "vec2 y=vec2(1)/v,m=gl_FragCoord.xy*y,x=m*2.-1.;" - "x.x*=v.x*y.y;" - "float i=int(d*12)/12.;" - "vec3 s=c,E=a,z=B(s,E)*normalize(vec3(x,u-length(x)*t));" - "float r=F(s,z);" - "vec3 g=s+z*r,w=J(g);" - "float U=A(s,z,g,w,x);" + "vec2 s=vec2(1)/v,y=gl_FragCoord.xy*s,f=y*2.-1.;" + "f.x*=v.x*s.y;" + "float i=int(iTime*12)/12.;" + "vec3 x=camPos,r=camTa,l=n(x,r)*normalize(vec3(f,camFocal-length(f)*fishEyeFactor));" + "float c=a(x,l);" + "vec3 p=x+l*c,t=d(p);" + "float e=a(x,l,p,t,f);" "{" - "vec2 l=x*5.;" - "l.x=abs(l.x-.3)-1.5;" - "l.y-=1.4;" - "l=A(i*5.)*l;" - "float N=1.4+.2*sin(i*20.);" - "N*=smoothstep(.5,1.,p);" - "float S=D(l,N,.5),n=mix(.55,.4,smoothstep(-.1,.6,D(l,N*.5,.5)))*1.3;" - "U=mix(U,n,smoothstep(0.,-.01,S)*p);" - "r=mix(1e2,r,smoothstep(0.,.01,S));" + "vec2 h=f*5.;" + "h.x=abs(h.x-.3)-1.5;" + "h.y-=1.4;" + "h=m(i*5.)*h;" + "float b=1.4+.2*sin(i*20.);" + "b*=smoothstep(.5,1.,excited);" + "float z=a(h,b,.5),w=mix(.55,.4,smoothstep(-.1,.6,a(h,b*.5,.5)))*1.3;" + "e=mix(e,w,smoothstep(0.,-.01,z)*excited);" + "c=mix(1e2,c,smoothstep(0.,.01,z));" + "t=mix(vec3(1),t,smoothstep(0.,.01,z));" "}" - "f=vec4(w.xz,r,pow(U,1./2.2));" + "vec2 b=t.xz;" + "fragColor=vec4(b,c,pow(e,1./2.2));" "}"; const char *mouton_vert = "#version 150\n" - "in vec4 U;" - "out vec3 m,y,s,x,i,z,n,r,c,a,E;" - "out vec2 l;" - "out float e,u,o,p,t,k;" - "uniform float d;" + "in vec4 a_position;" + "out vec3 animationAmp,animationSpeed,sheepPos,flowerPos,panelPos,panelWarningPos,anvilPos,sunDir,camPos,camTa,eyeDir;" + "out vec2 headRot;" + "out float blink,camFocal,eyesSurprise,excited,fishEyeFactor,noseSize;" + "uniform float iTime;" "void main()" "{" - "gl_Position=U;" - "float v=d;" + "gl_Position=a_position;" + "float v=iTime;" "v=int(v*12)/12.;" - "s=vec3(0);" - "i=vec3(9e7);" - "x=vec3(9e7);" - "z=vec3(9e7);" - "n=vec3(9e7);" - "u=2.;" - "e=max(fract(d*.333),fract(d*.123+.1));" - "p=0.;" - "r=normalize(vec3(3.5,1,-1));" - "y=vec3(1);" - "t=0.;" - "l=vec2(0);" - "k=1.;" - "o=0.;" + "sheepPos=vec3(0);" + "panelPos=vec3(9e7);" + "flowerPos=vec3(9e7);" + "panelWarningPos=vec3(9e7);" + "anvilPos=vec3(9e7);" + "camFocal=2.;" + "blink=max(fract(iTime*.333),fract(iTime*.123+.1));" + "excited=0.;" + "sunDir=normalize(vec3(3.5,1,-1));" + "animationSpeed=vec3(1);" + "fishEyeFactor=0.;" + "headRot=vec2(0);" + "noseSize=1.;" + "eyesSurprise=0.;" "if(v<10.)" - "m=vec3(1,.2,1),y=vec3(1,1,.5),E=normalize(vec3(0,.5,1)),l.y=.25,u=4.,c=vec3(0,2.5,-3.7),a=vec3(0,3,0);" + "animationAmp=vec3(1,.2,1),animationSpeed=vec3(1,1,.5),eyeDir=normalize(vec3(0,.5,1)),headRot.y=.25,camFocal=4.,camPos=vec3(0,2.5,-3.7),camTa=vec3(0,3,0);" "else" " if(v<20.)" "{" - "float f=v-10.;" - "m=vec3(1,.2,.25);" - "y=vec3(1,1,2);" - "E=normalize(vec3(0,.5,1));" - "l.y=.25;" - "u=4.;" - "c=vec3(5,.5,0);" - "a=vec3(0,.5,1);" + "float s=v-10.;" + "animationAmp=vec3(1,.2,.25);" + "animationSpeed=vec3(1,1,2);" + "eyeDir=normalize(vec3(0,.5,1));" + "headRot.y=.25;" + "camFocal=4.;" + "camPos=vec3(5,.5,0);" + "camTa=vec3(0,.5,1);" "}" "else" " if(v<30.)" "{" - "float f=v-20.;" - "m=vec3(1,.2,.25);" - "y=vec3(1,1,2);" - "E=normalize(vec3(0,.5,1));" - "l.y=.25;" - "u=2.;" - "c=vec3(5.+f*.5,2,f*.5);" - "a=vec3(0,2,0);" + "float s=v-20.;" + "animationAmp=vec3(1,.2,.25);" + "animationSpeed=vec3(1,1,2);" + "eyeDir=normalize(vec3(0,.5,1));" + "headRot.y=.25;" + "camFocal=2.;" + "camPos=vec3(5.+s*.5,2,s*.5);" + "camTa=vec3(0,2,0);" "}" "else" " if(v<50.)" "{" - "float f=v-30.;" - "m=vec3(1,.2,.25);" - "y=vec3(1,1,2);" - "E=normalize(vec3(0,.5,1));" - "l.y=.25;" - "float g=f*.35+.3;" - "r=normalize(vec3(cos(g),sin(g),-.3));" - "u=1.5;" - "c=vec3(22,2,f*.6-10.);" - "a=vec3(0,2,f*.6-10.);" + "float s=v-30.;" + "animationAmp=vec3(1,.2,.25);" + "animationSpeed=vec3(1,1,2);" + "eyeDir=normalize(vec3(0,.5,1));" + "headRot.y=.25;" + "float y=s*.35+.3;" + "sunDir=normalize(vec3(cos(y),sin(y),-.3));" + "camFocal=1.5;" + "camPos=vec3(22,2,s*.6-10.);" + "camTa=vec3(0,2,s*.6-10.);" "}" "else" " if(v<55.)" "{" - "float f=v-50.,g=smoothstep(2.,2.5,f);" - "l.y=mix(.25,0.,g);" - "m=vec3(1.-g,.2*(1.-g),1);" - "y=vec3(1,1,.5);" - "E=normalize(vec3(g*.3,.3-g*.3,1));" - "o=smoothstep(4.6,4.8,f)*.2;" - "u=4.;" - "c=vec3(0,3,-4);" - "a=vec3(0,3,0);" - "if(f>3.)" - "e=max(fract(d*.333),fract(d*.333+.08));" + "float s=v-50.,y=smoothstep(2.,2.5,s);" + "headRot.y=mix(.25,0.,y);" + "animationAmp=vec3(1.-y,.2*(1.-y),1);" + "animationSpeed=vec3(1,1,.5);" + "eyeDir=normalize(vec3(y*.3,.3-y*.3,1));" + "eyesSurprise=smoothstep(4.6,4.8,s)*.2;" + "camFocal=4.;" + "camPos=vec3(0,3,-4);" + "camTa=vec3(0,3,0);" + "if(s>3.)" + "blink=max(fract(iTime*.333),fract(iTime*.333+.08));" "}" "else" " if(v<58.)" "{" - "float f=v-55.;" - "s=vec3(0);" - "i=vec3(-5,0,-8);" - "E=normalize(vec3(.3,0,1));" - "o=.2;" - "m=vec3(0,0,1);" - "y=vec3(3,1.5,6);" - "float g=smoothstep(0.,.5,f);" - "u=mix(4.,3.,g);" - "c=vec3(0,3,-4);" - "a=mix(vec3(0,3,0),vec3(-5,5,-9),g);" + "float s=v-55.;" + "sheepPos=vec3(0);" + "panelPos=vec3(-5,0,-8);" + "eyeDir=normalize(vec3(.3,0,1));" + "eyesSurprise=.2;" + "animationAmp=vec3(0,0,1);" + "animationSpeed=vec3(3,1.5,6);" + "float y=smoothstep(0.,.5,s);" + "camFocal=mix(4.,3.,y);" + "camPos=vec3(0,3,-4);" + "camTa=mix(vec3(0,3,0),vec3(-5,5,-9),y);" "}" "else" " if(v<65.)" "{" - "float f=v-58.;" - "p=smoothstep(0.,.5,f);" - "m=vec3(0);" - "e=0.;" - "E=normalize(vec3(.3,0,1));" - "c=mix(vec3(0,3,-4),vec3(0,2,-6),p);" - "a=vec3(0,3,0);" - "u=mix(4.,3.,p)+smoothstep(0.,7.,f)*.5;" + "float s=v-58.;" + "excited=smoothstep(0.,.5,s);" + "animationAmp=vec3(0);" + "blink=0.;" + "eyeDir=normalize(vec3(.3,0,1));" + "camPos=mix(vec3(0,3,-4),vec3(0,2,-6),excited);" + "camTa=vec3(0,3,0);" + "camFocal=mix(4.,3.,excited)+smoothstep(0.,7.,s)*.5;" "}" "else" " if(v<70.)" "{" - "float f=v-65.;" - "E=normalize(vec3(0,0,1));" - "s=vec3(0,0,-f*3.-2.);" - "i=vec3(-5,0,-8);" - "m=vec3(1,1,.5);" - "y=vec3(3,1.5,8)*1.5;" - "c=vec3(16,5,9);" - "a=vec3(3,5,-2.-f);" - "u=3.;" + "float y=v-65.;" + "eyeDir=normalize(vec3(0,0,1));" + "sheepPos=vec3(0,0,-y*3.-2.);" + "panelPos=vec3(-5,0,-8);" + "animationAmp=vec3(1,1,.5);" + "animationSpeed=vec3(3,1.5,8)*1.5;" + "camPos=vec3(16,5,9);" + "camTa=vec3(3,5,-2.-y);" + "camFocal=3.;" "}" "else" " if(v<80.)" "{" - "float f=v-70.;" - "m=vec3(1);" - "y=vec3(3,1.5,8);" - "float g=mod(f,8.),J=smoothstep(.5,1.,g)*smoothstep(2.8,2.5,g)-smoothstep(4.,4.5,g)*smoothstep(5.8,5.5,g)+cos(d)*.2;" - "E=normalize(vec3(J,cos(d*.5)*.1+.1,1));" - "t=.3;" - "u=2.5;" - "c=vec3(2.75,1,-5.25);" - "a=vec3(0,2.3,0);" - "float N=mod(f,2.);" - "k+=smoothstep(.5,.6,N)*smoothstep(.7,.6,N)*.3;" - "N=mod(f+.3,3.);" - "k+=smoothstep(.5,.6,N)*smoothstep(.7,.6,N)*.3;" + "float s=v-70.;" + "animationAmp=vec3(1);" + "animationSpeed=vec3(3,1.5,8);" + "float y=mod(s,8.),d=smoothstep(.5,1.,y)*smoothstep(2.8,2.5,y)-smoothstep(4.,4.5,y)*smoothstep(5.8,5.5,y)+cos(iTime)*.2;" + "eyeDir=normalize(vec3(d,cos(iTime*.5)*.1+.1,1));" + "fishEyeFactor=.3;" + "camFocal=2.5;" + "camPos=vec3(2.75,1,-5.25);" + "camTa=vec3(0,2.3,0);" + "float f=mod(s,2.);" + "noseSize+=smoothstep(.5,.6,f)*smoothstep(.7,.6,f)*.3;" + "f=mod(s+.3,3.);" + "noseSize+=smoothstep(.5,.6,f)*smoothstep(.7,.6,f)*.3;" "}" "else" " if(v<85.)" "{" - "float f=v-80.,g=smoothstep(1.,3.,f);" - "m=vec3(0,1.-g*.5,1);" - "y=vec3(3,1.5,6);" - "E=normalize(vec3(g*.5,.3-g*.45,1));" - "u=4.;" - "c=vec3(0,3,-4);" - "a=vec3(0,3,0);" - "if(f>3.)" - "e=max(fract(d*.333),fract(d*.333+.08));" + "float s=v-80.,y=smoothstep(1.,3.,s);" + "animationAmp=vec3(0,1.-y*.5,1);" + "animationSpeed=vec3(3,1.5,6);" + "eyeDir=normalize(vec3(y*.5,.3-y*.45,1));" + "camFocal=4.;" + "camPos=vec3(0,3,-4);" + "camTa=vec3(0,3,0);" + "if(s>3.)" + "blink=max(fract(iTime*.333),fract(iTime*.333+.08));" "}" "else" " if(v<89.)" "{" - "float f=v-85.;" - "s=vec3(0);" - "z=vec3(-5,0,-8);" - "E=normalize(vec3(.5,-.15,1));" - "m=vec3(0,.5,1);" - "y=vec3(3,1.5,6);" - "float g=smoothstep(0.,1.,f);" - "u=mix(4.,3.,g);" - "c=vec3(0,3,-4);" - "a=mix(vec3(0,3,0),vec3(-5,5,-9),g);" + "float s=v-85.;" + "sheepPos=vec3(0);" + "panelWarningPos=vec3(-5,0,-8);" + "eyeDir=normalize(vec3(.5,-.15,1));" + "animationAmp=vec3(0,.5,1);" + "animationSpeed=vec3(3,1.5,6);" + "float y=smoothstep(0.,1.,s);" + "camFocal=mix(4.,3.,y);" + "camPos=vec3(0,3,-4);" + "camTa=mix(vec3(0,3,0),vec3(-5,5,-9),y);" "}" "else" " if(v<97.)" "{" - "float f=v-89.;" - "s=vec3(0,0,-11);" - "z=vec3(-5,0,-8);" - "E=normalize(mix(vec3(1,-.5,1),vec3(0,.5,1),smoothstep(3.,3.5,f)));" - "E=normalize(mix(E,vec3(1,-.5,1),smoothstep(6.5,7.,f)));" - "l.y=smoothstep(3.,3.5,f)*.6;" - "l.x=smoothstep(3.,3.5,f)*smoothstep(8.,6.,f)*.25*sin(f*3.);" - "m=vec3(1,.2,.5);" - "y=vec3(0,.2,1);" - "c=vec3(-3,4.8,-30);" - "a=vec3(-3,4,0);" - "u=3.5;" + "float s=v-89.;" + "sheepPos=vec3(0,0,-11);" + "panelWarningPos=vec3(-5,0,-8);" + "eyeDir=normalize(mix(vec3(1,-.5,1),vec3(0,.5,1),smoothstep(3.,3.5,s)));" + "eyeDir=normalize(mix(eyeDir,vec3(1,-.5,1),smoothstep(6.5,7.,s)));" + "headRot.y=smoothstep(3.,3.5,s)*.6;" + "headRot.x=smoothstep(3.,3.5,s)*smoothstep(8.,6.,s)*.25*sin(s*3.);" + "animationAmp=vec3(1,.2,.5);" + "animationSpeed=vec3(0,.2,1);" + "camPos=vec3(-3,4.8,-30);" + "camTa=vec3(-3,4,0);" + "camFocal=3.5;" "}" "else" " if(v<107.)" "{" - "float f=v-98.,g=smoothstep(6.,9.,f);" - "s=vec3(0,0,f*.25-11.);" - "z=vec3(-2,0,-8);" - "E=normalize(vec3(-.5,.25-g,1));" - "l.y=.5-g;" - "m=vec3(1,.2,.5);" - "y=vec3(-1,1,1)*.5;" - "c=vec3(18,5,-5);" - "a=vec3(-5,5,-6);" - "u=3.;" + "float s=v-98.,y=smoothstep(6.,9.,s);" + "sheepPos=vec3(0,0,s*.25-11.);" + "panelWarningPos=vec3(-2,0,-8);" + "eyeDir=normalize(vec3(-.5,.25-y,1));" + "headRot.y=.5-y;" + "animationAmp=vec3(1,.2,.5);" + "animationSpeed=vec3(-1,1,1)*.5;" + "camPos=vec3(18,5,-5);" + "camTa=vec3(-5,5,-6);" + "camFocal=3.;" "}" "else" " if(v<109.)" "{" - "float f=v-107.;" - "m=vec3(0);" - "y=vec3(0);" - "z=vec3(0,0,-8);" - "a=mod(f,2.)<1.?" - "(c=vec3(0,2,-8),vec3(0,3,0)):" - "(c=vec3(0,5.5,2),vec3(0,5.75,0));" - "E=normalize(vec3(0,-.1,1));" - "u=3.+f*.1;" + "float s=v-107.;" + "animationAmp=vec3(0);" + "animationSpeed=vec3(0);" + "panelWarningPos=vec3(0,0,-8);" + "camTa=mod(s,2.)<1.?" + "(camPos=vec3(0,2,-8),vec3(0,3,0)):" + "(camPos=vec3(0,5.5,2),vec3(0,5.75,0));" + "eyeDir=normalize(vec3(0,-.1,1));" + "camFocal=3.+s*.1;" "}" "else" " if(v<116.)" "{" - "float f=v-109.,g=sin(min(f,5.));" - "m=vec3(0);" - "y=vec3(0);" - "E=normalize(vec3(g*.7,0,1));" - "E=normalize(mix(E,vec3(-.3,.2,1),smoothstep(5.2,5.4,f)));" - "l.x=g*.25;" - "o=smoothstep(6.,6.2,f)*.2;" - "s=vec3(0,(smoothstep(6.,6.2,f)-smoothstep(6.2,6.4,f))*.4,0);" - "u=3.5;" - "c=vec3(0,2,-8);" - "a=vec3(0,3,0);" + "float s=v-109.,m=sin(min(s,5.));" + "animationAmp=vec3(0);" + "animationSpeed=vec3(0);" + "eyeDir=normalize(vec3(m*.7,0,1));" + "eyeDir=normalize(mix(eyeDir,vec3(-.3,.2,1),smoothstep(5.2,5.4,s)));" + "headRot.x=m*.25;" + "eyesSurprise=smoothstep(6.,6.2,s)*.2;" + "sheepPos=vec3(0,(smoothstep(6.,6.2,s)-smoothstep(6.2,6.4,s))*.4,0);" + "camFocal=3.5;" + "camPos=vec3(0,2,-8);" + "camTa=vec3(0,3,0);" "}" "else" " if(v<125.)" "{" - "float f=v-116.;" - "s=vec3(9e7);" - "z=vec3(-2,0,-8);" - "x=vec3(5,0,-20);" - "float g=smoothstep(.5,1.5,f);" - "u=mix(3.5,5.,g);" - "c=vec3(0,5.5,2);" - "a=mix(vec3(-.5,5.75,0),vec3(5,2,-20),g);" - "p=g*.3;" + "float s=v-116.;" + "sheepPos=vec3(9e7);" + "panelWarningPos=vec3(-2,0,-8);" + "flowerPos=vec3(5,0,-20);" + "float y=smoothstep(.5,1.5,s);" + "camFocal=mix(3.5,5.,y);" + "camPos=vec3(0,5.5,2);" + "camTa=mix(vec3(-.5,5.75,0),vec3(5,2,-20),y);" + "excited=y*.3;" "}" "else" " if(v<137.)" "{" - "float f=v-125.;" - "m=vec3(.1);" - "y=vec3(.2);" - "u=2.8+f*.15;" - "int g=int(f);" - "if(g%4==1)" - "z=vec3(0,0,-8),c=vec3(2.5,2,-1),a=vec3(1,5.25,-8),u=2.8+pow(f*.3,1.2);" + "float y=v-125.;" + "animationAmp=vec3(.1);" + "animationSpeed=vec3(.2);" + "camFocal=2.8+y*.15;" + "int s=int(y);" + "if(s%4==1)" + "panelWarningPos=vec3(0,0,-8),camPos=vec3(2.5,2,-1),camTa=vec3(1,5.25,-8),camFocal=2.8+pow(y*.3,1.2);" "else" - " if(g%4==3)" - "x=vec3(4,0,-8),c=vec3(0,5.5,2),a=vec3(4,3,-8),p=.3;" + " if(s%4==3)" + "flowerPos=vec3(4,0,-8),camPos=vec3(0,5.5,2),camTa=vec3(4,3,-8),excited=.3;" "else" - " c=vec3(0,2.4,-8),a=vec3(0,3,0);" - "float J=smoothstep(.3,.7,fract(f));" - "if(g%4==0)" - "J=1.-J;" - "l.x=-J*.1;" - "E=normalize(mix(vec3(.1,-.25,1),vec3(-.2,.2,1),J));" - "E=normalize(E+vec3(cos(f*10.),cos(f*5.),1)*.01);" + " camPos=vec3(0,2.4,-8),camTa=vec3(0,3,0);" + "float x=smoothstep(.3,.7,fract(y));" + "if(s%4==0)" + "x=1.-x;" + "headRot.x=-x*.1;" + "eyeDir=normalize(mix(vec3(.1,-.25,1),vec3(-.2,.2,1),x));" + "eyeDir=normalize(eyeDir+vec3(cos(y*10.),cos(y*5.),1)*.01);" "}" "else" " if(v<140.)" "{" - "float f=v-137.;" - "m=vec3(0,.1,0);" - "y=vec3(0,.5,0);" - "c=vec3(0,2.4,-8);" - "a=vec3(0,3,0);" - "l.x=-.1;" - "l.y=sin(f*2.)*.1;" - "o=smoothstep(0.,3.,f)*.1;" - "E=normalize(vec3(-.2,.2,1));" - "u=3.2-f*.15;" + "float s=v-137.;" + "animationAmp=vec3(0,.1,0);" + "animationSpeed=vec3(0,.5,0);" + "camPos=vec3(0,2.4,-8);" + "camTa=vec3(0,3,0);" + "headRot.x=-.1;" + "headRot.y=sin(s*2.)*.1;" + "eyesSurprise=smoothstep(0.,3.,s)*.1;" + "eyeDir=normalize(vec3(-.2,.2,1));" + "camFocal=3.2-s*.15;" "}" "else" " if(v<150.)" "{" - "float f=v-140.;" - "E=normalize(vec3(0,0,1));" - "s=vec3(0,0,-f*2.-2.);" - "x=vec3(0,-.5,-30);" - "m=vec3(1,1,.5);" - "y=vec3(3,1.5,8);" - "float g=smoothstep(0.,10.,f);" - "c=vec3(-2,3.5,mix(-10.,-33.,g));" - "a=vec3(2,2,-3.-f*2.);" - "u=3.;" + "float s=v-140.;" + "eyeDir=normalize(vec3(0,0,1));" + "sheepPos=vec3(0,0,-s*2.-2.);" + "flowerPos=vec3(0,-.5,-30);" + "animationAmp=vec3(1,1,.5);" + "animationSpeed=vec3(3,1.5,8);" + "float y=smoothstep(0.,10.,s);" + "camPos=vec3(-2,3.5,mix(-10.,-33.,y));" + "camTa=vec3(2,2,-3.-s*2.);" + "camFocal=3.;" "}" "else" " if(v<155.)" "{" - "float f=v-150.;" - "E=normalize(vec3(0,0,1));" - "s=vec3(0,-smoothstep(.25,.4,f)*4.5,-22);" - "x=vec3(2,0,-30);" - "m=vec3(1,1,.5);" - "y=vec3(3,1.5,8);" - "c=vec3(-20,6,-13)+vec3(cos(f*72.),cos(f*64.),sin(f*48.))*3.*smoothstep(.09,.1,f)*smoothstep(.7,.1,f);" - "a=vec3(3,2,-23);" - "u=mix(4.,4.2,smoothstep(0.,5.,f));" - "float g=smoothstep(.4,.1,f)*13.;" - "n=vec3(0,g,-22);" + "float s=v-150.;" + "eyeDir=normalize(vec3(0,0,1));" + "sheepPos=vec3(0,-smoothstep(.25,.4,s)*4.5,-22);" + "flowerPos=vec3(2,0,-30);" + "animationAmp=vec3(1,1,.5);" + "animationSpeed=vec3(3,1.5,8);" + "camPos=vec3(-20,6,-13)+vec3(cos(s*72.),cos(s*64.),sin(s*48.))*3.*smoothstep(.09,.1,s)*smoothstep(.7,.1,s);" + "camTa=vec3(3,2,-23);" + "camFocal=mix(4.,4.2,smoothstep(0.,5.,s));" + "float y=smoothstep(.4,.1,s)*13.;" + "anvilPos=vec3(0,y,-22);" "}" "else" "{" - "float f=v-155.;" - "E=normalize(vec3(0,0,1));" - "s=vec3(9e7);" - "z=vec3(-1,0,-8);" - "x=vec3(1,0,-25);" - "a=vec3(2,3.8,-18);" - "c=vec3(5,5,2);" - "float g=smoothstep(1.5,2.,f);" - "u=2.5+g*3.5;" - "n=vec3(7,0,-20);" - "p=g*.5;" + "float s=v-155.;" + "eyeDir=normalize(vec3(0,0,1));" + "sheepPos=vec3(9e7);" + "panelWarningPos=vec3(-1,0,-8);" + "flowerPos=vec3(1,0,-25);" + "camTa=vec3(2,3.8,-18);" + "camPos=vec3(5,5,2);" + "float y=smoothstep(1.5,2.,s);" + "camFocal=2.5+y*3.5;" + "anvilPos=vec3(7,0,-20);" + "excited=y*.5;" "}" "}"; const char *edges_frag = "#version 150\n" - "out vec4 f;" - "const vec2 N=vec2(1280,720);" - "uniform sampler2D K;" - "uniform float d;\n" - "#define Sensitivity (vec2(0.3,1.5)*iResolution.y/400.0)\n" - "float G(vec4 v,vec4 f)" + "out vec4 fragColor;" + "const vec2 y=vec2(1280,720);" + "uniform sampler2D prevPass;" + "float c(vec4 v,vec4 s)" "{" "vec2 y=v.xy;" - "float c=v.z;" - "vec2 x=f.xy;" - "float m=f.z,s=mix(1.2,.4,smoothstep(1.,12.,c));" - "vec2 E=abs(y-x)*Sensitivity.x*s;" - "float i=abs(c-m)*Sensitivity.y*s;" - "return m>35.?" + "float x=v.z;" + "vec2 i=s.xy;" + "float f=s.z,d=mix(1.2,.3,smoothstep(1.,25.,x));" + "vec2 r=abs(y-i)*d;" + "float a=abs(x-f)*d;" + "return x>35.&&f>35.?" "1.:" - "E.x+E.y<.15&&i<1.9?" + "r.x+r.y<.2&&a<1.9?" "1.:" ".7;" "}" "void main()" "{" - "vec4 v=texture(K,gl_FragCoord.xy/N.xy),c=texture(K,(gl_FragCoord.xy+vec2(1))/N.xy),y=texture(K,(gl_FragCoord.xy+vec2(-1))/N.xy),x=texture(K,(gl_FragCoord.xy+vec2(-1,1))/N.xy),a=texture(K,(gl_FragCoord.xy+vec2(1,-1))/N.xy);" - "float m=G(c,y)*G(x,a);" - "f=vec4(m,v.wz,1);" + "vec4 s=texture(prevPass,gl_FragCoord.xy/y.xy),v=texture(prevPass,(gl_FragCoord.xy+vec2(1))/y.xy),x=texture(prevPass,(gl_FragCoord.xy+vec2(-1))/y.xy),d=texture(prevPass,(gl_FragCoord.xy+vec2(-1,1))/y.xy),f=texture(prevPass,(gl_FragCoord.xy+vec2(1,-1))/y.xy);" + "float i=c(v,x)*c(d,f);" + "fragColor=vec4(i,s.wz,1);" "}"; const char *fxaa_frag = "#version 150\n" - "out vec4 f;" - "const vec2 L=vec2(1280,720);" - "uniform sampler2D K;" - "vec3 F(vec4 v,sampler2D f,vec2 y)" + "out vec4 fragColor;\n" + "#define iResolution vec2(1280.,720.)\n" + "uniform sampler2D prevPass;" + "vec3 c(vec4 v,sampler2D s,vec2 y)" "{" - "vec3 c=textureLod(f,v.zw,0.).xyz,x=textureLod(f,v.zw+vec2(1,0)*y.xy,0.).xyz,m=textureLod(f,v.zw+vec2(0,1)*y.xy,0.).xyz,E=textureLod(f,v.zw+vec2(1)*y.xy,0.).xyz,a=textureLod(f,v.xy,0.).xyz,g=vec3(.299,.587,.114);" - "float i=dot(c,g),z=dot(x,g),s=dot(m,g),u=dot(E,g),J=dot(a,g),N=min(J,min(min(i,z),min(s,u))),p=max(J,max(max(i,z),max(s,u)));" - "vec2 d;" - "d.x=-(i+z-s-u);" - "d.y=i+s-z-u;" - "float S=1./(min(abs(d.x),abs(d.y))+1./128.);" - "d=min(vec2(8),max(vec2(-8),d*S))*y.xy;" - "vec3 n=.5*(textureLod(f,v.xy+d*(1./3.-.5),0.).xyz+textureLod(f,v.xy+d*(2./3.-.5),0.).xyz),K=n*.5+.25*(textureLod(f,v.xy+d*-.5,0.).xyz+textureLod(f,v.xy+d*.5,0.).xyz);" - "float U=dot(K,g);" - "return Up?" + "vec3 i=textureLod(s,v.zw,0.).www,d=textureLod(s,v.zw+vec2(1,0)*y.xy,0.).www,f=textureLod(s,v.zw+vec2(0,1)*y.xy,0.).www,x=textureLod(s,v.zw+vec2(1)*y.xy,0.).www,r=textureLod(s,v.xy,0.).xyz,l=vec3(.299,.587,.114);" + "float m=dot(i,l),a=dot(d,l),c=dot(f,l),p=dot(x,l),t=dot(r,l),e=min(t,min(min(m,a),min(c,p))),b=max(t,max(max(m,a),max(c,p)));" + "vec2 h;" + "h.x=-(m+a-c-p);" + "h.y=m+c-a-p;" + "float z=1./(min(abs(h.x),abs(h.y))+1./128.);" + "h=min(vec2(8),max(vec2(-8),h*z))*y.xy;" + "vec3 n=.5*(textureLod(s,v.xy+h*(1./3.-.5),0.).www+textureLod(s,v.xy+h*(2./3.-.5),0.).www),E=n*.5+.25*(textureLod(s,v.xy+h*-.5,0.).www+textureLod(s,v.xy+h*.5,0.).www);" + "float w=dot(E,l);" + "return wb?" "n:" - "K;" + "E;" "}" "void main()" "{" - "vec2 y=1./L,v=gl_FragCoord.xy*y;" - "vec4 c=vec4(v,v-y*.5);" - "vec3 m=F(c,K,y);" - "f=vec4(m,1);" + "vec2 s=1./y,v=gl_FragCoord.xy*s;" + "vec4 d=vec4(v,v-s*.5);" + "vec3 r=c(d,prevPass,s);" + "vec4 i=textureLod(prevPass,d.xy,0.);" + "fragColor=vec4(i.xyz,r.x);" "}"; const char *postprocess_frag = "#version 150\n" - "out vec4 f;" - "const vec2 M=vec2(1280,720);" - "uniform sampler2D K;" - "uniform float d;" - "vec2 b;" - "float O(vec2 v)" + "out vec4 fragColor;" + "const vec2 r=vec2(1280,720);" + "uniform sampler2D prevPass;" + "uniform float iTime;" + "vec2 l;" + "float w(vec2 v)" "{" "return fract(sin(dot(v.xy,vec2(12.9898,78.233)))*43758.5453);" "}" - "float O(float v)" + "float w(float v)" "{" - "return O(vec2(v,1));" + "return w(vec2(v,1));" "}" - "float P(float v)" + "float b(float v)" "{" - "float f=.01*O(v),c=O(v+1.),y=O(v+2.)-.5,a=O(v+3.),x=1.;" - "x=pow(abs(c*b.x+f*b.y+y),.0625);" - "return mix(.5,1.,a>.2?" - "x:" - "2.-x);" + "float s=.01*w(v),y=w(v+1.),x=w(v+2.)-.5,f=w(v+3.),a=1.;" + "a=pow(abs(y*l.x+s*l.y+x),.0625);" + "return mix(.5,1.,f>.2?" + "a:" + "2.-a);" "}" - "float Q(float v)" + "float u(float v)" "{" - "float f=O(v),y=O(v+1.),m=.01*O(v+2.);" - "vec2 c=vec2(f,y)-b;" - "c.x*=M.x/M.y;" - "float x=atan(c.y,c.x),a=1.,E=m*m*(sin(6.2831*x*f)*.1+1.);" - "a=dot(c,c)bq6l2^VM_txsTv{DYJIKRZoT=imA`(b$ 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 Xe)q%Pl&_jL?}zizaR2`U|KFs3LSxX? literal 16790 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 u33 Date: Sat, 25 Feb 2023 15:28:05 +0100 Subject: [PATCH 5/9] Fix edge detection in the demo (6099 bytes) Edge detection was broken when running the C++ executable, but worked in Kodelife. After investigation, it happened because the textures relied on values outside the [0; 1] range. I changed the values returned by the raymarching and adjusted the values in edge detection --- Intro/src/shaders/edges.frag | 19 +- Intro/src/shaders/mouton.frag | 13 +- Intro/src/shaders/postprocess.frag | 18 +- Intro/src/shaders/shaders.inl | 1466 ++++++++++++++-------------- 4 files changed, 771 insertions(+), 745 deletions(-) diff --git a/Intro/src/shaders/edges.frag b/Intro/src/shaders/edges.frag index 1192db7..5d06382 100644 --- a/Intro/src/shaders/edges.frag +++ b/Intro/src/shaders/edges.frag @@ -10,27 +10,28 @@ float checkSame(vec4 center, vec4 samplef) float centerDepth = center.z; vec2 sampleNormal = samplef.xy; float sampleDepth = samplef.z; + + if (centerDepth > 35. && sampleDepth > 35.) return 1.; // Less sensitive when it's far away; more edge details when it's closer. - float sensitivity = mix(1.2, 0.3, smoothstep(1., 25., centerDepth)); + float sensitivity = mix(1.2, .3, centerDepth); vec2 diffNormal = abs(centerNormal - sampleNormal) * sensitivity; - bool isSameNormal = (diffNormal.x + diffNormal.y) < 0.2; + bool isSameNormal = diffNormal.x + diffNormal.y < 0.2; float diffDepth = abs(centerDepth - sampleDepth) * sensitivity; - bool isSameDepth = diffDepth < 1.9; - - if (centerDepth > 35. && sampleDepth > 35.) return 1.; + bool isSameDepth = diffDepth < 0.03; return (isSameNormal && isSameDepth) ? 1.0 : 0.7; } void main(void) { + float width = .0015; vec4 sample0 = texture(prevPass, gl_FragCoord.xy / iResolution.xy); - vec4 sample1 = texture(prevPass, (gl_FragCoord.xy + vec2(1., 1.)) / iResolution.xy); - vec4 sample2 = texture(prevPass, (gl_FragCoord.xy + vec2(-1., -1.)) / iResolution.xy); - vec4 sample3 = texture(prevPass, (gl_FragCoord.xy + vec2(-1., 1.)) / iResolution.xy); - vec4 sample4 = texture(prevPass, (gl_FragCoord.xy + vec2(1., -1.)) / iResolution.xy); + vec4 sample1 = texture(prevPass, gl_FragCoord.xy / iResolution.xy + width*vec2(1., 1.)); + vec4 sample2 = texture(prevPass, gl_FragCoord.xy / iResolution.xy + width*vec2(-1., -1.)); + vec4 sample3 = texture(prevPass, gl_FragCoord.xy / iResolution.xy + width*vec2(-1., 1.)); + vec4 sample4 = texture(prevPass, gl_FragCoord.xy / iResolution.xy + width*vec2(1., -1.)); float edge = checkSame(sample1, sample2) * checkSame(sample3, sample4); diff --git a/Intro/src/shaders/mouton.frag b/Intro/src/shaders/mouton.frag index afb714b..1ec7acb 100644 --- a/Intro/src/shaders/mouton.frag +++ b/Intro/src/shaders/mouton.frag @@ -514,7 +514,7 @@ float shade(vec3 ro, vec3 rd, vec3 p, vec3 n, vec2 uv) { albedo = .4; emi = .35; } else if (dmat.y == CLOGS) { - albedo = .025; + albedo = .15; } else if (dmat.y == EYE) { float ndz = dot(n, normalize(vec3(0.,0.,1.))); float nde = dot(n, eyeDir); @@ -635,10 +635,17 @@ void main() t = mix(100., t, smoothstep(0.,0.01, star)); n = mix(vec3(1.), n, smoothstep(0.,0.01, star)); } + + // We return parts of the normal + depth information (used for edge detection), + // as well as the color (channel w).We make sure all components are restricted + // between 0 and 1. + + float nx = clamp(n.x, 0., 1.); + float ny = clamp(n.y, 0., 1.); + t = smoothstep(1., 30., t); - vec2 norm = n.xz; // fixme // gamma correction - fragColor = vec4( norm, t, pow(col, 1./2.2) ); + fragColor = vec4(nx, ny, t, pow(col, 1./2.2)); } diff --git a/Intro/src/shaders/postprocess.frag b/Intro/src/shaders/postprocess.frag index 24445bd..2566e25 100644 --- a/Intro/src/shaders/postprocess.frag +++ b/Intro/src/shaders/postprocess.frag @@ -24,7 +24,7 @@ float randomLine(float seed) float l = 1.0; - l = pow( abs(a * uv.x + b * uv.y + c ), 1.0/16.0 ); + l = pow(abs(a * uv.x + b * uv.y + c ), 1.0/16.0 ); return mix(0.5, 1.0, mu > 0.2 ? l : 2. - l); } @@ -49,9 +49,6 @@ float randomBlotch(float seed) return mix(0.3 + 0.2 * (1.0 - (s / 0.02)), 1.0, v); } -#define ErrorPeriod 30.0 -#define ErrorRange 0.003 - void main(void) { // Set frequency of global effect (12 / second). @@ -65,14 +62,13 @@ void main(void) vec2 suv = uv + 0.004 * vec2( rand(t), rand(t + 23.0)); suv += (suv*2.-1.)*invRes.x*.5; - float sens = mix(1.2, 0.3, smoothstep(1., 10., texture(prevPass,suv).z)); - float noise = rand(t+9.)*.005*sens; - vec2 uvs1 = suv + vec2(ErrorRange * sin(ErrorPeriod * suv.y + 0.0) + noise, ErrorRange * sin(ErrorPeriod * suv.x + 0.0) + noise); - vec2 uvs2 = suv + vec2(ErrorRange * sin(ErrorPeriod * suv.y + 1.047) + noise, ErrorRange * sin(ErrorPeriod * suv.x + 3.142) + noise); - vec2 uvs3 = suv + vec2(ErrorRange * sin(ErrorPeriod * suv.y + 2.094) + noise, ErrorRange * sin(ErrorPeriod * suv.x + 1.571) + noise); + const float errorFreq = 20.; + const float errorRange = 0.003; + vec2 uvs1 = suv + vec2(errorRange * sin(errorFreq * suv.y), errorRange * sin(errorFreq * suv.x)); + vec2 uvs2 = suv + vec2(errorRange * sin(errorFreq * suv.y + 1.), errorRange * sin(errorFreq * suv.x + 3.)); + vec2 uvs3 = suv + vec2(errorRange * sin(errorFreq * suv.y + 2.), errorRange * sin(errorFreq * suv.x + 1.)); - float edge = texture(prevPass, uvs1).r * texture(prevPass, uvs2).r * texture(prevPass, uvs3).r; - + float edge = texture(prevPass, uvs1).r * pow(texture(prevPass, uvs2).r,0.5) * pow(texture(prevPass, uvs3).r,0.25); float col = texture(prevPass,suv).g; col *= mix(.2, 1., edge); diff --git a/Intro/src/shaders/shaders.inl b/Intro/src/shaders/shaders.inl index 74b382f..9ddccb6 100644 --- a/Intro/src/shaders/shaders.inl +++ b/Intro/src/shaders/shaders.inl @@ -1,1030 +1,1052 @@ // Generated with Shader Minifier 1.3.3 (https://github.com/laurentlb/Shader_Minifier/) #ifndef SHADERS_INL_ # define SHADERS_INL_ +# define VAR_a_position "N" +# define VAR_animationAmp "m" +# define VAR_animationSpeed "y" +# define VAR_anvilPos "n" +# define VAR_blink "e" +# define VAR_camFocal "g" +# define VAR_camPos "c" +# define VAR_camTa "a" +# define VAR_excited "p" +# define VAR_eyeDir "w" +# define VAR_eyesSurprise "u" +# define VAR_fishEyeFactor "o" +# define VAR_flowerPos "x" +# define VAR_fragColor "f" +# define VAR_headRot "l" +# define VAR_iTime "d" +# define VAR_noseSize "k" +# define VAR_panelPos "i" +# define VAR_panelWarningPos "z" +# define VAR_prevPass "K" +# define VAR_sheepPos "s" +# define VAR_sunDir "r" const char *mouton_frag = "#version 150\n" - "out vec4 fragColor;" + "out vec4 f;" "const vec2 v=vec2(1280,720);" - "in vec3 animationAmp,animationSpeed,sheepPos,flowerPos,panelPos,panelWarningPos,anvilPos,sunDir,camPos,camTa,eyeDir;" - "in vec2 headRot;" - "in float blink,camFocal,eyesSurprise,excited,fishEyeFactor,noseSize;" - "uniform float iTime;" - "const float s=acos(-1.);" - "vec2 p(vec2 i,vec2 y)" + "in vec3 m,y,s,x,i,z,n,r,c,a,w;" + "in vec2 l;" + "in float e,g,u,p,o,k;" + "uniform float d;" + "const float U=acos(-1.);" + "vec2 t(vec2 i,vec2 y)" "{" "return i.xa||a<0.?" + "vec3 y=m*i,x=abs(m)*s,c=-y-x,a=-y+x;" + "float w=max(max(c.x,c.y),c.z),g=min(min(a.x,a.y),a.z);" + "return w>g||g<0.?" "vec2(-1):" - "vec2(r,a);" + "vec2(w,g);" "}" - "vec3 f(vec3 v)" + "vec3 h(vec3 v)" "{" - "uvec3 f=uvec3(v*1e5);" - "f=(f>>8U^f.yzx)*1103515245U;" - "f=(f>>8U^f.yzx)*1103515245U;" - "f=(f>>8U^f.yzx)*1103515245U;" - "return vec3(f)*(1./float(-1U));" + "uvec3 y=uvec3(v*1e5);" + "y=(y>>8U^y.yzx)*1103515245U;" + "y=(y>>8U^y.yzx)*1103515245U;" + "y=(y>>8U^y.yzx)*1103515245U;" + "return vec3(y)*(1./float(-1U));" "}" - "float f(vec3 i,vec2 v,float m)" + "float h(vec3 i,vec2 v,float m)" "{" - "float s=m*m,y=int(iTime*12)/12.;" - "vec2 x=vec2(cos(y*.7+2.4),sin(y*.7+2.4)*.75);" - "float a=smoothstep(.151,.15,length(v-x));" - "a*=smoothstep(.15,.1501,length(v-x-vec2(.1,.025)));" - "a+=exp(-length(v-x)*2.)*.1;" - "a*=smoothstep(.5,0.,sunDir.y);" - "vec2 d=v*2e2,r=fract(d)-.5,p=floor(d);" - "vec3 l=f(vec3(abs(p),abs(p.x)));" - "float e=l.z*.1;" - "a+=smoothstep(e,e*.01,length(l.xy-.5+r))*(cos(y*l.y+l.z*3.14)*.5+.5);" - "s+=a*smoothstep(.5,-1.,sunDir.y);" - "return s;" + "float y=m*m,c=int(d*12)/12.;" + "vec2 x=vec2(cos(c*.7+2.4),sin(c*.7+2.4)*.75);" + "float f=smoothstep(.151,.15,length(v-x));" + "f*=smoothstep(.15,.1501,length(v-x-vec2(.1,.025)));" + "f+=exp(-length(v-x)*2.)*.1;" + "f*=smoothstep(.5,0.,r.y);" + "vec2 w=v*2e2,a=fract(w)-.5,s=floor(w);" + "vec3 l=h(vec3(abs(s),abs(s.x)));" + "float g=l.z*.1;" + "f+=smoothstep(g,g*.01,length(l.xy-.5+a))*(cos(c*l.y+l.z*3.14)*.5+.5);" + "y+=f*smoothstep(.5,-1.,r.y);" + "return y;" "}" - "float p(float v)" + "float t(float v)" "{" "return fract(v*17.*fract(v*.3183099));" "}" - "float x(vec3 v)" + "float C(vec3 v)" "{" - "vec3 s=floor(v),m=fract(v),d=m*m*m*(m*(m*6.-15.)+10.);" - "float y=s.x+317.*s.y+157.*s.z,x=p(y),f=p(y+1.),a=p(y+317.),r=p(y+318.),c=p(y+157.),l=p(y+158.),e=p(y+474.),z=p(y+475.);" - "return-1.+2.*(x+(f-x)*d.x+(a-x)*d.y+(c-x)*d.z+(x-f-a+r)*d.x*d.y+(x-a-c+e)*d.y*d.z+(x-f-c+l)*d.z*d.x+(-x+f+a-r+c-l-e+z)*d.x*d.y*d.z);" + "vec3 m=floor(v),s=fract(v),y=s*s*s*(s*(s*6.-15.)+10.);" + "float x=m.x+317.*m.y+157.*m.z,c=t(x),a=t(x+1.),w=t(x+317.),g=t(x+318.),f=t(x+157.),z=t(x+158.),p=t(x+474.),l=t(x+475.);" + "return-1.+2.*(c+(a-c)*y.x+(w-c)*y.y+(f-c)*y.z+(c-a-w+g)*y.x*y.y+(c-w-f+p)*y.y*y.z+(c-a-f+z)*y.z*y.x+(-c+a+w-g+f-z-p+l)*y.x*y.y*y.z);" "}" - "vec2 n(vec3 v)" + "vec2 B(vec3 v)" "{" - "float s=int(iTime*12)/12.;" - "v.xz-=anvilPos.xz;" - "v.y-=-anvilPos.y;" - "float y=v.y+smoothstep(1.,20.,length(v.xz));" - "return y<.4?" - "(y-=pow((x(v*.7+1.)*.5+x(v*1.7+1e2)*.3+x(v*2.7+1e2)*.1)*.5+.5,3.)*.45*(1.-exp(-(s-150.)*4.))+.03,vec2(y,12)):" + "float y=int(d*12)/12.;" + "v.xz-=n.xz;" + "v.y-=-n.y;" + "float x=v.y+smoothstep(1.,20.,length(v.xz));" + "return x<.4?" + "(x-=pow((C(v*.7+1.)*.5+C(v*1.7+1e2)*.3+C(v*2.7+1e2)*.1)*.5+.5,3.)*.45*(1.-exp(-(y-150.)*4.))+.03,vec2(x,12)):" "vec2(9e7,0);" "}" - "mat3 n(vec3 v,vec3 y)" + "mat3 B(vec3 v,vec3 y)" "{" - "const vec3 s=vec3(0,1,0);" - "vec3 i=normalize(y-v),d=normalize(cross(i,normalize(s)));" - "return mat3(d,cross(d,i),i);" + "const vec3 x=vec3(0,1,0);" + "vec3 c=normalize(y-v),a=normalize(cross(c,normalize(x)));" + "return mat3(a,cross(a,c),c);" "}" - "mat2 m(float v)" + "mat2 A(float v)" "{" - "float s=cos(v),y=sin(v);" - "return mat2(s,y,-y,s);" + "float y=cos(v),x=sin(v);" + "return mat2(y,x,-x,y);" "}" - "float m(vec3 v,vec3 y)" + "float A(vec3 v,vec3 y)" "{" - "vec3 s=abs(v)-y;" - "return length(max(s,0.))+min(max(s.x,max(s.y,s.z)),0.);" + "vec3 c=abs(v)-y;" + "return length(max(c,0.))+min(max(c.x,max(c.y,c.z)),0.);" "}" - "vec2 t(vec3 v)" + "vec2 D(vec3 v)" "{" - "v-=anvilPos;" - "v.xz=m(1.)*v.xz;" - "float s=pow(clamp(v.y-1.,.004,1.),.5),f=m(v-vec3(0,1,0),vec3(1.5-s,1,2.5-s));" + "v-=n;" + "v.xz=A(1.)*v.xz;" + "float y=pow(clamp(v.y-1.,.004,1.),.5),f=A(v-vec3(0,1,0),vec3(1.5-y,1,2.5-y));" "if(f<10.)" "{" - "f=min(f,m(v-vec3(0,3,0),vec3(2,1,3)));" - "float i=length((v.yz-vec2(4.5,3))*vec2(1,.8))-2.;" - "i=max(i,abs(v.x)-.5);" - "i=max(i,v.y-3.5);" - "f=min(f,i);" - "vec2 y=vec2(f-.1,11);" - "return y;" + "f=min(f,A(v-vec3(0,3,0),vec3(2,1,3)));" + "float c=length((v.yz-vec2(4.5,3))*vec2(1,.8))-2.;" + "c=max(c,abs(v.x)-.5);" + "c=max(c,v.y-3.5);" + "f=min(f,c);" + "vec2 x=vec2(f-.1,11);" + "return x;" "}" "return vec2(9e7,0);" "}" - "vec2 e(vec3 v)" + "vec2 E(vec3 v)" "{" - "v-=panelPos;" - "float s=m(v-vec3(0,7.5,-5),vec3(.8,.8,.1))-.2;" - "if(s<7.)" + "v-=i;" + "float y=A(v-vec3(0,7.5,-5),vec3(.8,.8,.1))-.2;" + "if(y<7.)" "{" - "s=max(s,abs(v.z+5.)-.1);" - "float i=m(v-vec3(0,4,-5.1),vec3(.11,4,.08));" - "vec2 f=vec2(i,5);" - "f=p(f,vec2(s,7));" + "y=max(y,abs(v.z+5.)-.1);" + "float c=A(v-vec3(0,4,-5.1),vec3(.11,4,.08));" + "vec2 f=vec2(c,5);" + "f=t(f,vec2(y,7));" "return f;" "}" "return vec2(9e7,0);" "}" - "float e(vec3 v,float s,float i,float y)" + "float A(vec3 v,float y,float i,float x)" "{" - "vec2 m=vec2(length(v.xz),v.y),f=vec2(y,s),x=vec2(y-i,2.*s),d=vec2(m.x-min(m.x,m.y<0.?" + "vec2 m=vec2(length(v.xz),v.y),c=vec2(x,y),a=vec2(x-i,2.*y),f=vec2(m.x-min(m.x,m.y<0.?" "i:" - "y),abs(m.y)-s),p=m-f+x*clamp(dot(f-m,x)/dot(x,x),0.,1.);" - "return(p.x<0.&&d.y<0.?" + "x),abs(m.y)-y),s=m-c+a*clamp(dot(c-m,a)/dot(a,a),0.,1.);" + "return(s.x<0.&&f.y<0.?" "-1.:" - "1.)*sqrt(min(dot(d,d),dot(p,p)));" + "1.)*sqrt(min(dot(f,f),dot(s,s)));" "}" - "float m(vec3 v,vec3 s,vec3 m,float y)" + "float B(vec3 v,vec3 y,vec3 m,float x)" "{" - "vec3 i=v-s,x=m-s;" - "float d=clamp(dot(i,x)/dot(x,x),0.,1.);" - "return length(i-x*d)-y;" + "vec3 c=v-y,a=m-y;" + "float s=clamp(dot(c,a)/dot(a,a),0.,1.);" + "return length(c-a*s)-x;" "}" - "float e(vec3 v,vec2 y)" + "float C(vec3 v,vec2 y)" "{" - "vec2 s=vec2(length(v.xy)-y.x,v.z);" - "return length(s)-y.y;" + "vec2 c=vec2(length(v.xy)-y.x,v.z);" + "return length(c)-y.y;" "}" - "float t(vec3 v,vec3 y)" + "float D(vec3 v,vec3 y)" "{" - "float s=length(v/y),f=length(v/(y*y));" - "return s*(s-1.)/f;" + "float c=length(v/y),a=length(v/(y*y));" + "return c*(c-1.)/a;" "}" - "vec2 i(vec3 v)" + "vec2 F(vec3 v)" "{" - "float y=int(iTime*12)/12.;" - "v-=flowerPos;" - "vec3 i=v;" - "i.x+=cos(.775+y)*3.1*.2;" - "i.y-=2.8;" - "i.zy=m(.7)*i.zy;" - "float d=t(i-vec3(0,.3,0),vec3(1,.2+cos(i.x*150.)*sin(i.z*150.)*.05,1)*.25);" - "if(d<5.)" + "float y=int(d*12)/12.;" + "v-=x;" + "vec3 m=v;" + "m.x+=cos(.775+y)*3.1*.2;" + "m.y-=2.8;" + "m.zy=A(.7)*m.zy;" + "float c=D(m-vec3(0,.3,0),vec3(1,.2+cos(m.x*150.)*sin(m.z*150.)*.05,1)*.25);" + "if(c<5.)" "{" - "vec2 r=vec2(d,8);" - "vec3 c=i;" - "c.xz=f(c.xz,s*.2);" - "float x=t(c-vec3(.5,.2+sin(c.x*2.)*.2,0),vec3(2,.1+sin(c.z*40.)*.02,.75)*.25);" - "if(x0.)" + "vec3 c=1./y;" + "float f=9e7,m;" + "vec2 a=h(v-s-vec3(0,3,-2),y,vec3(3,3,7),c);" + "if(a.y>0.)" "{" - "m=max(r.x,0.);" - "for(int a=0;a<128;a++)" + "m=max(a.x,0.);" + "for(int w=0;w<128;w++)" "{" - "vec3 x=v+y*m;" - "float l=p(vec2(x.y,0),h(x)).x;" - "m+=l;" - "if(m>r.y||abs(l)<.001)" + "vec3 g=v+y*m;" + "float d=t(vec2(g.y,0),G(g)).x;" + "m+=d;" + "if(m>a.y||abs(d)<.001)" "break;" "}" - "if(m0.)" + "a=h(v-i-vec3(0,5,-5),y,vec3(1.5,5,1),c);" + "if(a.y>0.)" "{" - "m=max(r.x,0.);" - "for(int a=0;a<128;a++)" + "m=max(a.x,0.);" + "for(int w=0;w<128;w++)" "{" - "float x=e(v+y*m).x;" - "m+=x;" - "if(m>r.y||abs(x)<.001)" + "float d=E(v+y*m).x;" + "m+=d;" + "if(m>a.y||abs(d)<.001)" "break;" "}" - "if(m0.)" + "a=h(v-z-vec3(0,5,-5),y,vec3(1.5,5,1),c);" + "if(a.y>0.)" "{" - "m=max(r.x,0.);" - "for(int a=0;a<128;a++)" + "m=max(a.x,0.);" + "for(int w=0;w<128;w++)" "{" - "float x=c(v+y*m).x;" - "m+=x;" - "if(m>r.y||abs(x)<.001)" + "float d=H(v+y*m).x;" + "m+=d;" + "if(m>a.y||abs(d)<.001)" "break;" "}" - "if(m0.)" + "a=h(v-x-vec3(0,5,0),y,vec3(2,5,1),c);" + "if(a.y>0.)" "{" - "m=max(r.x,0.);" - "for(int a=0;a<128;a++)" + "m=max(a.x,0.);" + "for(int w=0;w<128;w++)" "{" - "float x=i(v+y*m).x;" - "m+=x;" - "if(m>r.y||abs(x)<.001)" + "float d=F(v+y*m).x;" + "m+=d;" + "if(m>a.y||abs(d)<.001)" "break;" "}" - "if(m0.)" + "a=h(v-n-vec3(0,3,2),y,vec3(4,4,5),c);" + "if(a.y>0.)" "{" - "m=max(r.x,0.);" - "for(int a=0;a<128;a++)" + "m=max(a.x,0.);" + "for(int w=0;w<128;w++)" "{" - "float x=t(v+y*m).x;" - "m+=x;" - "if(m>r.y||abs(x)<.001)" + "float d=D(v+y*m).x;" + "m+=d;" + "if(m>a.y||abs(d)<.001)" "break;" "}" - "if(m0.&&length((v+y*m).xz-anvilPos.xz)<10.)" + "m=-(v.y+.4)*c.y;" + "if(m>0.&&length((v+y*m).xz-n.xz)<10.)" "{" - "for(int a=0;a<128;a++)" + "for(int w=0;w<128;w++)" "{" - "vec3 x=v+y*m;" - "float l=min(x.y,n(x).x);" - "m+=l;" - "if(m>r.y||abs(l)<.001)" + "vec3 d=v+y*m;" + "float g=min(d.y,B(d).x);" + "m+=g;" + "if(m>a.y||abs(g)<.001)" "break;" "}" "if(m<1e2)" - "d=min(d,m);" + "f=min(f,m);" "}" - "m=-v.y*s.y;" + "m=-v.y*c.y;" "if(m>0.)" - "d=min(d,m);" - "return d;" + "f=min(f,m);" + "return f;" "}" - "vec3 d(vec3 v)" + "vec3 J(vec3 v)" "{" - "vec2 s=vec2(1e-4,0);" - "float m=a(v).x;" + "vec2 y=vec2(1e-4,0);" + "float m=I(v).x;" "vec3 f;" - "f.x=m-a(v-s.xyy).x;" - "f.y=m-a(v-s.yxy).x;" - "f.z=m-a(v-s.yyx).x;" + "f.x=m-I(v-y.xyy).x;" + "f.y=m-I(v-y.yxy).x;" + "f.z=m-I(v-y.yyx).x;" "return normalize(f);" "}" - "float c(vec3 v,vec3 y,float s,float i)" + "float D(vec3 v,vec3 y,float m,float i)" "{" - "float f=1.,c=s;" - "for(int r=0;r<64;r++)" + "float f=1.,c=m;" + "for(int w=0;w<64;w++)" "{" - "float m=a(v+y*c).x;" - "f=min(f,30.*m/c);" - "c+=m;" + "float s=I(v+y*c).x;" + "f=min(f,30.*s/c);" + "c+=s;" "if(f<1e-4||c>i)" "break;" "}" "return clamp(f,0.,1.);" "}" - "float d(vec2 v,float s,float y,float i)" + "float E(vec2 v,float y,float x,float c)" "{" "v.x=abs(v.x);" - "float x=(s-y)/i,d=sqrt(1.-x*x),f=dot(v,vec2(-x,d));" - "return f<0.?" - "length(v)-s:" - "f>d*i?" - "length(v-vec2(0,i))-y:" - "dot(v,vec2(d,x))-s;" + "float f=(y-x)/c,a=sqrt(1.-f*f),m=dot(v,vec2(-f,a));" + "return m<0.?" + "length(v)-y:" + "m>a*c?" + "length(v-vec2(0,c))-x:" + "dot(v,vec2(a,f))-y;" "}" - "float a(vec3 v,vec3 i,vec3 s,vec3 y,vec2 x)" + "float A(vec3 v,vec3 y,vec3 m,vec3 c,vec2 f)" "{" - "vec2 r=a(s);" - "float l=int(iTime*12)/12.,p=smoothstep(0.,.3,sunDir.y)+.1,e=a(s,y,.15,1.);" - "e*=a(s,y,1.,.1)*.5;" - "float E=c(s,sunDir,.08,50.),z=clamp(1.+dot(i,y),0.,5.),o=.85*max(dot(y,sunDir),0.)*pow(E,1.2),n=.085*max(dot(y,-sunDir),0.)*e,g=.45*e,k=0.,b=0.;" - "if(r.y==0.)" - "b=3.;" + "vec2 a=I(m);" + "float g=int(d*12)/12.,s=smoothstep(0.,.3,r.y)+.1,o=C(m,c,.15,1.);" + "o*=C(m,c,1.,.1)*.5;" + "float N=D(m,r,.08,50.),n=clamp(1.+dot(y,c),0.,5.),l=.85*max(dot(c,r),0.)*pow(N,1.2),G=.085*max(dot(c,-r),0.)*o,H=.45*o,M=0.,F=0.;" + "if(a.y==0.)" + "F=3.;" "else" - " if(r.y==1.)" - "b=.4,k=.35;" + " if(a.y==1.)" + "F=.4,M=.35;" "else" - " if(r.y==4.)" - "b=.025;" + " if(a.y==4.)" + "F=.15;" "else" - " if(r.y==3.)" + " if(a.y==3.)" "{" - "float t=dot(y,normalize(vec3(0,0,1))),F=dot(y,eyeDir),w=smoothstep(-.953,-.952,F-eyesSurprise/2.);" - "b=mix(.1,1.5,w);" - "if(t>0.||blink>.95)" - "r.y=2.;" + "float J=dot(c,normalize(vec3(0,0,1))),k=dot(c,w),U=smoothstep(-.953,-.952,k-u/2.);" + "F=mix(.1,1.5,U);" + "if(J>0.||e>.95)" + "a.y=2.;" "}" "else" - " if(r.y==5.)" - "b=1.;" + " if(a.y==5.)" + "F=1.;" "else" - " if(r.y==6.)" + " if(a.y==6.)" "{" - "vec3 t=s-panelWarningPos;" - "if(y.z>.5)" + "vec3 J=m-z;" + "if(c.z>.5)" "{" - "float w=h(t-vec3(0,7.5,-5),vec2(1.3,.2),.01),F=smoothstep(.13,.1295,distance(t,vec3(0,7.06,-4.9)));" - "F+=smoothstep(.005,0.,d(t.xy-vec2(0,7.3),.06,.14,1.));" - "b=mix(.5,2.,smoothstep(.005,0.,w));" - "b=mix(b,.1,F);" + "float U=C(J-vec3(0,7.5,-5),vec2(1.3,.2),.01),k=smoothstep(.13,.1295,distance(J,vec3(0,7.06,-4.9)));" + "k+=smoothstep(.005,0.,E(J.xy-vec2(0,7.3),.06,.14,1.));" + "F=mix(.5,2.,smoothstep(.005,0.,U));" + "F=mix(F,.1,k);" "}" "else" - " b=1.;" + " F=1.;" "}" "else" - " if(r.y==7.)" + " if(a.y==7.)" "{" - "vec3 t=s-panelPos;" - "if(y.z>.5)" + "vec3 J=m-i;" + "if(c.z>.5)" "{" - "b=.5;" - "t.y-=7.4;" - "float w=m(t-vec3(0,.1,-5),vec3(.8,.8,1)),F=0.;" - "t.xy=m(.8)*t.xy;" - "float G=.04;" - "F+=smoothstep(.01,0.,d(t.xy-vec2(-G,-.6),.1,.05,1.));" - "F+=smoothstep(.01,0.,d(t.xy-vec2(-G,.5),.16,.135,.15));" - "F*=smoothstep(0.,.01,d(t.xy-vec2(-G-.08,.56),.001,.02,.2));" - "F*=smoothstep(0.,.01,d(t.xy-vec2(-G+.04,.56),.001,.02,.2));" - "t.xy=m(-1.6)*t.xy;" - "F+=smoothstep(.01,0.,d(t.xy-vec2(G,-.6),.1,.05,1.));" - "F+=smoothstep(.01,0.,d(t.xy-vec2(G,.5),.16,.1,.15));" - "b=mix(b,2.,smoothstep(.01,0.,w));" - "b=mix(b,0.,F);" + "F=.5;" + "J.y-=7.4;" + "float U=A(J-vec3(0,.1,-5),vec3(.8,.8,1)),k=0.;" + "J.xy=A(.8)*J.xy;" + "float t=.04;" + "k+=smoothstep(.01,0.,E(J.xy-vec2(-t,-.6),.1,.05,1.));" + "k+=smoothstep(.01,0.,E(J.xy-vec2(-t,.5),.16,.135,.15));" + "k*=smoothstep(0.,.01,E(J.xy-vec2(-t-.08,.56),.001,.02,.2));" + "k*=smoothstep(0.,.01,E(J.xy-vec2(-t+.04,.56),.001,.02,.2));" + "J.xy=A(-1.6)*J.xy;" + "k+=smoothstep(.01,0.,E(J.xy-vec2(t,-.6),.1,.05,1.));" + "k+=smoothstep(.01,0.,E(J.xy-vec2(t,.5),.16,.1,.15));" + "F=mix(F,2.,smoothstep(.01,0.,U));" + "F=mix(F,0.,k);" "}" "else" - " b=1.;" + " F=1.;" "}" "else" - " if(r.y==8.)" + " if(a.y==8.)" "{" - "vec3 t=s-flowerPos;" - "t.x+=cos(.775+l)*3.1*.2;" - "t.y-=2.8;" - "t.zy=m(.75)*t.zy;" - "b=mix(.9,1.3,smoothstep(0.,.45,length(t-vec3(0,.3,0))))*1.8;" + "vec3 J=m-x;" + "J.x+=cos(.775+g)*3.1*.2;" + "J.y-=2.8;" + "J.zy=A(.75)*J.zy;" + "F=mix(.9,1.3,smoothstep(0.,.45,length(J-vec3(0,.3,0))))*1.8;" "}" "else" - " if(r.y==10.)" - "b=.02;" + " if(a.y==10.)" + "F=.02;" "else" - " if(r.y==9.)" + " if(a.y==9.)" "{" - "vec3 t=s-flowerPos;" - "t.x+=cos(.775+l)*3.1*.2;" - "t.y-=2.8;" - "t.zy=m(.75)*t.zy;" - "b=mix(1.5,.7,smoothstep(.5,1.1,length(t-vec3(0,.3,0))))*2.;" + "vec3 J=m-x;" + "J.x+=cos(.775+g)*3.1*.2;" + "J.y-=2.8;" + "J.zy=A(.75)*J.zy;" + "F=mix(1.5,.7,smoothstep(.5,1.1,length(J-vec3(0,.3,0))))*2.;" "}" "else" - " if(r.y==11.)" - "b=1.,o*=.1*z,g*=.1*z,n=0.;" + " if(a.y==11.)" + "F=1.,l*=.1*n,H*=.1*n,G=0.;" "else" - " if(r.y==12.)" + " if(a.y==12.)" "{" - "b=.4;" - "float t=z*z;" - "o*=3.;" - "g*=2.*t;" + "F=.4;" + "float J=n*n;" + "l*=3.;" + "H*=2.*J;" "}" - "if(r.y==2.)" - "b=.8,g*=.8;" - "float t=(b*(g+o*.5+n*2.)+k)*p,w=length(s-v);" - "t=mix(t,f(i,x,p),smoothstep(90.,1e2,w));" - "if(r.y==0.)" + "if(a.y==2.)" + "F=.8,H*=.8;" + "float J=(F*(H+l*.5+G*2.)+M)*s,U=length(m-v);" + "J=mix(J,h(y,f,s),smoothstep(90.,1e2,U));" + "if(a.y==0.)" "{" - "float F=cos(atan(x.x,x.y)*15.+l*3.),G=length(x)*.5;" - "t=mix(t,mix(.5,1.,smoothstep(-G,G,F)),excited);" + "float k=cos(atan(f.x,f.y)*15.+g*3.),t=length(f)*.5;" + "J=mix(J,mix(.5,1.,smoothstep(-t,t,k)),p);" "}" - "return clamp(t,0.,1.);" + "return clamp(J,0.,1.);" "}" - "float a(vec2 v,float s,float m)" + "float D(vec2 v,float m,float y)" "{" - "const vec2 y=vec2(.809016994375,-.587785252292),d=vec2(-y.x,y.y);" + "const vec2 c=vec2(.809016994375,-.587785252292),f=vec2(-c.x,c.y);" "v.x=abs(v.x);" - "v-=2.*max(dot(y,v),0.)*y;" - "v-=2.*max(dot(d,v),0.)*d;" + "v-=2.*max(dot(c,v),0.)*c;" + "v-=2.*max(dot(f,v),0.)*f;" "v.x=abs(v.x);" - "v.y-=s;" - "vec2 x=m*vec2(-y.y,y.x)-vec2(0,1);" - "float i=clamp(dot(v,x)/dot(x,x),0.,s);" - "return length(v-x*i)*sign(v.y*x.x-v.x*x.y);" + "v.y-=m;" + "vec2 a=y*vec2(-c.y,c.x)-vec2(0,1);" + "float x=clamp(dot(v,a)/dot(a,a),0.,m);" + "return length(v-a*x)*sign(v.y*a.x-v.x*a.y);" "}" "void main()" "{" - "vec2 s=vec2(1)/v,y=gl_FragCoord.xy*s,f=y*2.-1.;" - "f.x*=v.x*s.y;" - "float i=int(iTime*12)/12.;" - "vec3 x=camPos,r=camTa,l=n(x,r)*normalize(vec3(f,camFocal-length(f)*fishEyeFactor));" - "float c=a(x,l);" - "vec3 p=x+l*c,t=d(p);" - "float e=a(x,l,p,t,f);" + "vec2 y=vec2(1)/v,m=gl_FragCoord.xy*y,x=m*2.-1.;" + "x.x*=v.x*y.y;" + "float i=int(d*12)/12.;" + "vec3 s=c,w=a,z=B(s,w)*normalize(vec3(x,g-length(x)*o));" + "float r=E(s,z);" + "vec3 F=s+z*r,l=J(F);" + "float H=A(s,z,F,l,x);" "{" - "vec2 h=f*5.;" - "h.x=abs(h.x-.3)-1.5;" - "h.y-=1.4;" - "h=m(i*5.)*h;" - "float b=1.4+.2*sin(i*20.);" - "b*=smoothstep(.5,1.,excited);" - "float z=a(h,b,.5),w=mix(.55,.4,smoothstep(-.1,.6,a(h,b*.5,.5)))*1.3;" - "e=mix(e,w,smoothstep(0.,-.01,z)*excited);" - "c=mix(1e2,c,smoothstep(0.,.01,z));" - "t=mix(vec3(1),t,smoothstep(0.,.01,z));" + "vec2 N=x*5.;" + "N.x=abs(N.x-.3)-1.5;" + "N.y-=1.4;" + "N=A(i*5.)*N;" + "float k=1.4+.2*sin(i*20.);" + "k*=smoothstep(.5,1.,p);" + "float U=D(N,k,.5),G=mix(.55,.4,smoothstep(-.1,.6,D(N,k*.5,.5)))*1.3;" + "H=mix(H,G,smoothstep(0.,-.01,U)*p);" + "r=mix(1e2,r,smoothstep(0.,.01,U));" + "l=mix(vec3(1),l,smoothstep(0.,.01,U));" "}" - "vec2 b=t.xz;" - "fragColor=vec4(b,c,pow(e,1./2.2));" + "float N=clamp(l.x,0.,1.),G=clamp(l.y,0.,1.);" + "r=smoothstep(1.,30.,r);" + "f=vec4(N,G,r,pow(H,1./2.2));" "}"; const char *mouton_vert = "#version 150\n" - "in vec4 a_position;" - "out vec3 animationAmp,animationSpeed,sheepPos,flowerPos,panelPos,panelWarningPos,anvilPos,sunDir,camPos,camTa,eyeDir;" - "out vec2 headRot;" - "out float blink,camFocal,eyesSurprise,excited,fishEyeFactor,noseSize;" - "uniform float iTime;" + "in vec4 N;" + "out vec3 m,y,s,x,i,z,n,r,c,a,w;" + "out vec2 l;" + "out float e,g,u,p,o,k;" + "uniform float d;" "void main()" "{" - "gl_Position=a_position;" - "float v=iTime;" + "gl_Position=N;" + "float v=d;" "v=int(v*12)/12.;" - "sheepPos=vec3(0);" - "panelPos=vec3(9e7);" - "flowerPos=vec3(9e7);" - "panelWarningPos=vec3(9e7);" - "anvilPos=vec3(9e7);" - "camFocal=2.;" - "blink=max(fract(iTime*.333),fract(iTime*.123+.1));" - "excited=0.;" - "sunDir=normalize(vec3(3.5,1,-1));" - "animationSpeed=vec3(1);" - "fishEyeFactor=0.;" - "headRot=vec2(0);" - "noseSize=1.;" - "eyesSurprise=0.;" + "s=vec3(0);" + "i=vec3(9e7);" + "x=vec3(9e7);" + "z=vec3(9e7);" + "n=vec3(9e7);" + "g=2.;" + "e=max(fract(d*.333),fract(d*.123+.1));" + "p=0.;" + "r=normalize(vec3(3.5,1,-1));" + "y=vec3(1);" + "o=0.;" + "l=vec2(0);" + "k=1.;" + "u=0.;" "if(v<10.)" - "animationAmp=vec3(1,.2,1),animationSpeed=vec3(1,1,.5),eyeDir=normalize(vec3(0,.5,1)),headRot.y=.25,camFocal=4.,camPos=vec3(0,2.5,-3.7),camTa=vec3(0,3,0);" + "m=vec3(1,.2,1),y=vec3(1,1,.5),w=normalize(vec3(0,.5,1)),l.y=.25,g=4.,c=vec3(0,2.5,-3.7),a=vec3(0,3,0);" "else" " if(v<20.)" "{" - "float s=v-10.;" - "animationAmp=vec3(1,.2,.25);" - "animationSpeed=vec3(1,1,2);" - "eyeDir=normalize(vec3(0,.5,1));" - "headRot.y=.25;" - "camFocal=4.;" - "camPos=vec3(5,.5,0);" - "camTa=vec3(0,.5,1);" + "float f=v-10.;" + "m=vec3(1,.2,.25);" + "y=vec3(1,1,2);" + "w=normalize(vec3(0,.5,1));" + "l.y=.25;" + "g=4.;" + "c=vec3(5,.5,0);" + "a=vec3(0,.5,1);" "}" "else" " if(v<30.)" "{" - "float s=v-20.;" - "animationAmp=vec3(1,.2,.25);" - "animationSpeed=vec3(1,1,2);" - "eyeDir=normalize(vec3(0,.5,1));" - "headRot.y=.25;" - "camFocal=2.;" - "camPos=vec3(5.+s*.5,2,s*.5);" - "camTa=vec3(0,2,0);" + "float f=v-20.;" + "m=vec3(1,.2,.25);" + "y=vec3(1,1,2);" + "w=normalize(vec3(0,.5,1));" + "l.y=.25;" + "g=2.;" + "c=vec3(5.+f*.5,2,f*.5);" + "a=vec3(0,2,0);" "}" "else" " if(v<50.)" "{" - "float s=v-30.;" - "animationAmp=vec3(1,.2,.25);" - "animationSpeed=vec3(1,1,2);" - "eyeDir=normalize(vec3(0,.5,1));" - "headRot.y=.25;" - "float y=s*.35+.3;" - "sunDir=normalize(vec3(cos(y),sin(y),-.3));" - "camFocal=1.5;" - "camPos=vec3(22,2,s*.6-10.);" - "camTa=vec3(0,2,s*.6-10.);" + "float f=v-30.;" + "m=vec3(1,.2,.25);" + "y=vec3(1,1,2);" + "w=normalize(vec3(0,.5,1));" + "l.y=.25;" + "float J=f*.35+.3;" + "r=normalize(vec3(cos(J),sin(J),-.3));" + "g=1.5;" + "c=vec3(22,2,f*.6-10.);" + "a=vec3(0,2,f*.6-10.);" "}" "else" " if(v<55.)" "{" - "float s=v-50.,y=smoothstep(2.,2.5,s);" - "headRot.y=mix(.25,0.,y);" - "animationAmp=vec3(1.-y,.2*(1.-y),1);" - "animationSpeed=vec3(1,1,.5);" - "eyeDir=normalize(vec3(y*.3,.3-y*.3,1));" - "eyesSurprise=smoothstep(4.6,4.8,s)*.2;" - "camFocal=4.;" - "camPos=vec3(0,3,-4);" - "camTa=vec3(0,3,0);" - "if(s>3.)" - "blink=max(fract(iTime*.333),fract(iTime*.333+.08));" + "float f=v-50.,F=smoothstep(2.,2.5,f);" + "l.y=mix(.25,0.,F);" + "m=vec3(1.-F,.2*(1.-F),1);" + "y=vec3(1,1,.5);" + "w=normalize(vec3(F*.3,.3-F*.3,1));" + "u=smoothstep(4.6,4.8,f)*.2;" + "g=4.;" + "c=vec3(0,3,-4);" + "a=vec3(0,3,0);" + "if(f>3.)" + "e=max(fract(d*.333),fract(d*.333+.08));" "}" "else" " if(v<58.)" "{" - "float s=v-55.;" - "sheepPos=vec3(0);" - "panelPos=vec3(-5,0,-8);" - "eyeDir=normalize(vec3(.3,0,1));" - "eyesSurprise=.2;" - "animationAmp=vec3(0,0,1);" - "animationSpeed=vec3(3,1.5,6);" - "float y=smoothstep(0.,.5,s);" - "camFocal=mix(4.,3.,y);" - "camPos=vec3(0,3,-4);" - "camTa=mix(vec3(0,3,0),vec3(-5,5,-9),y);" + "float f=v-55.;" + "s=vec3(0);" + "i=vec3(-5,0,-8);" + "w=normalize(vec3(.3,0,1));" + "u=.2;" + "m=vec3(0,0,1);" + "y=vec3(3,1.5,6);" + "float F=smoothstep(0.,.5,f);" + "g=mix(4.,3.,F);" + "c=vec3(0,3,-4);" + "a=mix(vec3(0,3,0),vec3(-5,5,-9),F);" "}" "else" " if(v<65.)" "{" - "float s=v-58.;" - "excited=smoothstep(0.,.5,s);" - "animationAmp=vec3(0);" - "blink=0.;" - "eyeDir=normalize(vec3(.3,0,1));" - "camPos=mix(vec3(0,3,-4),vec3(0,2,-6),excited);" - "camTa=vec3(0,3,0);" - "camFocal=mix(4.,3.,excited)+smoothstep(0.,7.,s)*.5;" + "float f=v-58.;" + "p=smoothstep(0.,.5,f);" + "m=vec3(0);" + "e=0.;" + "w=normalize(vec3(.3,0,1));" + "c=mix(vec3(0,3,-4),vec3(0,2,-6),p);" + "a=vec3(0,3,0);" + "g=mix(4.,3.,p)+smoothstep(0.,7.,f)*.5;" "}" "else" " if(v<70.)" "{" - "float y=v-65.;" - "eyeDir=normalize(vec3(0,0,1));" - "sheepPos=vec3(0,0,-y*3.-2.);" - "panelPos=vec3(-5,0,-8);" - "animationAmp=vec3(1,1,.5);" - "animationSpeed=vec3(3,1.5,8)*1.5;" - "camPos=vec3(16,5,9);" - "camTa=vec3(3,5,-2.-y);" - "camFocal=3.;" + "float f=v-65.;" + "w=normalize(vec3(0,0,1));" + "s=vec3(0,0,-f*3.-2.);" + "i=vec3(-5,0,-8);" + "m=vec3(1,1,.5);" + "y=vec3(3,1.5,8)*1.5;" + "c=vec3(16,5,9);" + "a=vec3(3,5,-2.-f);" + "g=3.;" "}" "else" " if(v<80.)" "{" - "float s=v-70.;" - "animationAmp=vec3(1);" - "animationSpeed=vec3(3,1.5,8);" - "float y=mod(s,8.),d=smoothstep(.5,1.,y)*smoothstep(2.8,2.5,y)-smoothstep(4.,4.5,y)*smoothstep(5.8,5.5,y)+cos(iTime)*.2;" - "eyeDir=normalize(vec3(d,cos(iTime*.5)*.1+.1,1));" - "fishEyeFactor=.3;" - "camFocal=2.5;" - "camPos=vec3(2.75,1,-5.25);" - "camTa=vec3(0,2.3,0);" - "float f=mod(s,2.);" - "noseSize+=smoothstep(.5,.6,f)*smoothstep(.7,.6,f)*.3;" - "f=mod(s+.3,3.);" - "noseSize+=smoothstep(.5,.6,f)*smoothstep(.7,.6,f)*.3;" + "float f=v-70.;" + "m=vec3(1);" + "y=vec3(3,1.5,8);" + "float F=mod(f,8.),J=smoothstep(.5,1.,F)*smoothstep(2.8,2.5,F)-smoothstep(4.,4.5,F)*smoothstep(5.8,5.5,F)+cos(d)*.2;" + "w=normalize(vec3(J,cos(d*.5)*.1+.1,1));" + "o=.3;" + "g=2.5;" + "c=vec3(2.75,1,-5.25);" + "a=vec3(0,2.3,0);" + "float U=mod(f,2.);" + "k+=smoothstep(.5,.6,U)*smoothstep(.7,.6,U)*.3;" + "U=mod(f+.3,3.);" + "k+=smoothstep(.5,.6,U)*smoothstep(.7,.6,U)*.3;" "}" "else" " if(v<85.)" "{" - "float s=v-80.,y=smoothstep(1.,3.,s);" - "animationAmp=vec3(0,1.-y*.5,1);" - "animationSpeed=vec3(3,1.5,6);" - "eyeDir=normalize(vec3(y*.5,.3-y*.45,1));" - "camFocal=4.;" - "camPos=vec3(0,3,-4);" - "camTa=vec3(0,3,0);" - "if(s>3.)" - "blink=max(fract(iTime*.333),fract(iTime*.333+.08));" + "float f=v-80.,F=smoothstep(1.,3.,f);" + "m=vec3(0,1.-F*.5,1);" + "y=vec3(3,1.5,6);" + "w=normalize(vec3(F*.5,.3-F*.45,1));" + "g=4.;" + "c=vec3(0,3,-4);" + "a=vec3(0,3,0);" + "if(f>3.)" + "e=max(fract(d*.333),fract(d*.333+.08));" "}" "else" " if(v<89.)" "{" - "float s=v-85.;" - "sheepPos=vec3(0);" - "panelWarningPos=vec3(-5,0,-8);" - "eyeDir=normalize(vec3(.5,-.15,1));" - "animationAmp=vec3(0,.5,1);" - "animationSpeed=vec3(3,1.5,6);" - "float y=smoothstep(0.,1.,s);" - "camFocal=mix(4.,3.,y);" - "camPos=vec3(0,3,-4);" - "camTa=mix(vec3(0,3,0),vec3(-5,5,-9),y);" + "float f=v-85.;" + "s=vec3(0);" + "z=vec3(-5,0,-8);" + "w=normalize(vec3(.5,-.15,1));" + "m=vec3(0,.5,1);" + "y=vec3(3,1.5,6);" + "float F=smoothstep(0.,1.,f);" + "g=mix(4.,3.,F);" + "c=vec3(0,3,-4);" + "a=mix(vec3(0,3,0),vec3(-5,5,-9),F);" "}" "else" " if(v<97.)" "{" - "float s=v-89.;" - "sheepPos=vec3(0,0,-11);" - "panelWarningPos=vec3(-5,0,-8);" - "eyeDir=normalize(mix(vec3(1,-.5,1),vec3(0,.5,1),smoothstep(3.,3.5,s)));" - "eyeDir=normalize(mix(eyeDir,vec3(1,-.5,1),smoothstep(6.5,7.,s)));" - "headRot.y=smoothstep(3.,3.5,s)*.6;" - "headRot.x=smoothstep(3.,3.5,s)*smoothstep(8.,6.,s)*.25*sin(s*3.);" - "animationAmp=vec3(1,.2,.5);" - "animationSpeed=vec3(0,.2,1);" - "camPos=vec3(-3,4.8,-30);" - "camTa=vec3(-3,4,0);" - "camFocal=3.5;" + "float f=v-89.;" + "s=vec3(0,0,-11);" + "z=vec3(-5,0,-8);" + "w=normalize(mix(vec3(1,-.5,1),vec3(0,.5,1),smoothstep(3.,3.5,f)));" + "w=normalize(mix(w,vec3(1,-.5,1),smoothstep(6.5,7.,f)));" + "l.y=smoothstep(3.,3.5,f)*.6;" + "l.x=smoothstep(3.,3.5,f)*smoothstep(8.,6.,f)*.25*sin(f*3.);" + "m=vec3(1,.2,.5);" + "y=vec3(0,.2,1);" + "c=vec3(-3,4.8,-30);" + "a=vec3(-3,4,0);" + "g=3.5;" "}" "else" " if(v<107.)" "{" - "float s=v-98.,y=smoothstep(6.,9.,s);" - "sheepPos=vec3(0,0,s*.25-11.);" - "panelWarningPos=vec3(-2,0,-8);" - "eyeDir=normalize(vec3(-.5,.25-y,1));" - "headRot.y=.5-y;" - "animationAmp=vec3(1,.2,.5);" - "animationSpeed=vec3(-1,1,1)*.5;" - "camPos=vec3(18,5,-5);" - "camTa=vec3(-5,5,-6);" - "camFocal=3.;" + "float f=v-98.,F=smoothstep(6.,9.,f);" + "s=vec3(0,0,f*.25-11.);" + "z=vec3(-2,0,-8);" + "w=normalize(vec3(-.5,.25-F,1));" + "l.y=.5-F;" + "m=vec3(1,.2,.5);" + "y=vec3(-1,1,1)*.5;" + "c=vec3(18,5,-5);" + "a=vec3(-5,5,-6);" + "g=3.;" "}" "else" " if(v<109.)" "{" - "float s=v-107.;" - "animationAmp=vec3(0);" - "animationSpeed=vec3(0);" - "panelWarningPos=vec3(0,0,-8);" - "camTa=mod(s,2.)<1.?" - "(camPos=vec3(0,2,-8),vec3(0,3,0)):" - "(camPos=vec3(0,5.5,2),vec3(0,5.75,0));" - "eyeDir=normalize(vec3(0,-.1,1));" - "camFocal=3.+s*.1;" + "float f=v-107.;" + "m=vec3(0);" + "y=vec3(0);" + "z=vec3(0,0,-8);" + "a=mod(f,2.)<1.?" + "(c=vec3(0,2,-8),vec3(0,3,0)):" + "(c=vec3(0,5.5,2),vec3(0,5.75,0));" + "w=normalize(vec3(0,-.1,1));" + "g=3.+f*.1;" "}" "else" " if(v<116.)" "{" - "float s=v-109.,m=sin(min(s,5.));" - "animationAmp=vec3(0);" - "animationSpeed=vec3(0);" - "eyeDir=normalize(vec3(m*.7,0,1));" - "eyeDir=normalize(mix(eyeDir,vec3(-.3,.2,1),smoothstep(5.2,5.4,s)));" - "headRot.x=m*.25;" - "eyesSurprise=smoothstep(6.,6.2,s)*.2;" - "sheepPos=vec3(0,(smoothstep(6.,6.2,s)-smoothstep(6.2,6.4,s))*.4,0);" - "camFocal=3.5;" - "camPos=vec3(0,2,-8);" - "camTa=vec3(0,3,0);" + "float f=v-109.,F=sin(min(f,5.));" + "m=vec3(0);" + "y=vec3(0);" + "w=normalize(vec3(F*.7,0,1));" + "w=normalize(mix(w,vec3(-.3,.2,1),smoothstep(5.2,5.4,f)));" + "l.x=F*.25;" + "u=smoothstep(6.,6.2,f)*.2;" + "s=vec3(0,(smoothstep(6.,6.2,f)-smoothstep(6.2,6.4,f))*.4,0);" + "g=3.5;" + "c=vec3(0,2,-8);" + "a=vec3(0,3,0);" "}" "else" " if(v<125.)" "{" - "float s=v-116.;" - "sheepPos=vec3(9e7);" - "panelWarningPos=vec3(-2,0,-8);" - "flowerPos=vec3(5,0,-20);" - "float y=smoothstep(.5,1.5,s);" - "camFocal=mix(3.5,5.,y);" - "camPos=vec3(0,5.5,2);" - "camTa=mix(vec3(-.5,5.75,0),vec3(5,2,-20),y);" - "excited=y*.3;" + "float f=v-116.;" + "s=vec3(9e7);" + "z=vec3(-2,0,-8);" + "x=vec3(5,0,-20);" + "float F=smoothstep(.5,1.5,f);" + "g=mix(3.5,5.,F);" + "c=vec3(0,5.5,2);" + "a=mix(vec3(-.5,5.75,0),vec3(5,2,-20),F);" + "p=F*.3;" "}" "else" " if(v<137.)" "{" - "float y=v-125.;" - "animationAmp=vec3(.1);" - "animationSpeed=vec3(.2);" - "camFocal=2.8+y*.15;" - "int s=int(y);" - "if(s%4==1)" - "panelWarningPos=vec3(0,0,-8),camPos=vec3(2.5,2,-1),camTa=vec3(1,5.25,-8),camFocal=2.8+pow(y*.3,1.2);" + "float f=v-125.;" + "m=vec3(.1);" + "y=vec3(.2);" + "g=2.8+f*.15;" + "int F=int(f);" + "if(F%4==1)" + "z=vec3(0,0,-8),c=vec3(2.5,2,-1),a=vec3(1,5.25,-8),g=2.8+pow(f*.3,1.2);" "else" - " if(s%4==3)" - "flowerPos=vec3(4,0,-8),camPos=vec3(0,5.5,2),camTa=vec3(4,3,-8),excited=.3;" + " if(F%4==3)" + "x=vec3(4,0,-8),c=vec3(0,5.5,2),a=vec3(4,3,-8),p=.3;" "else" - " camPos=vec3(0,2.4,-8),camTa=vec3(0,3,0);" - "float x=smoothstep(.3,.7,fract(y));" - "if(s%4==0)" - "x=1.-x;" - "headRot.x=-x*.1;" - "eyeDir=normalize(mix(vec3(.1,-.25,1),vec3(-.2,.2,1),x));" - "eyeDir=normalize(eyeDir+vec3(cos(y*10.),cos(y*5.),1)*.01);" + " c=vec3(0,2.4,-8),a=vec3(0,3,0);" + "float U=smoothstep(.3,.7,fract(f));" + "if(F%4==0)" + "U=1.-U;" + "l.x=-U*.1;" + "w=normalize(mix(vec3(.1,-.25,1),vec3(-.2,.2,1),U));" + "w=normalize(w+vec3(cos(f*10.),cos(f*5.),1)*.01);" "}" "else" " if(v<140.)" "{" - "float s=v-137.;" - "animationAmp=vec3(0,.1,0);" - "animationSpeed=vec3(0,.5,0);" - "camPos=vec3(0,2.4,-8);" - "camTa=vec3(0,3,0);" - "headRot.x=-.1;" - "headRot.y=sin(s*2.)*.1;" - "eyesSurprise=smoothstep(0.,3.,s)*.1;" - "eyeDir=normalize(vec3(-.2,.2,1));" - "camFocal=3.2-s*.15;" + "float f=v-137.;" + "m=vec3(0,.1,0);" + "y=vec3(0,.5,0);" + "c=vec3(0,2.4,-8);" + "a=vec3(0,3,0);" + "l.x=-.1;" + "l.y=sin(f*2.)*.1;" + "u=smoothstep(0.,3.,f)*.1;" + "w=normalize(vec3(-.2,.2,1));" + "g=3.2-f*.15;" "}" "else" " if(v<150.)" "{" - "float s=v-140.;" - "eyeDir=normalize(vec3(0,0,1));" - "sheepPos=vec3(0,0,-s*2.-2.);" - "flowerPos=vec3(0,-.5,-30);" - "animationAmp=vec3(1,1,.5);" - "animationSpeed=vec3(3,1.5,8);" - "float y=smoothstep(0.,10.,s);" - "camPos=vec3(-2,3.5,mix(-10.,-33.,y));" - "camTa=vec3(2,2,-3.-s*2.);" - "camFocal=3.;" + "float f=v-140.;" + "w=normalize(vec3(0,0,1));" + "s=vec3(0,0,-f*2.-2.);" + "x=vec3(0,-.5,-30);" + "m=vec3(1,1,.5);" + "y=vec3(3,1.5,8);" + "float F=smoothstep(0.,10.,f);" + "c=vec3(-2,3.5,mix(-10.,-33.,F));" + "a=vec3(2,2,-3.-f*2.);" + "g=3.;" "}" "else" " if(v<155.)" "{" - "float s=v-150.;" - "eyeDir=normalize(vec3(0,0,1));" - "sheepPos=vec3(0,-smoothstep(.25,.4,s)*4.5,-22);" - "flowerPos=vec3(2,0,-30);" - "animationAmp=vec3(1,1,.5);" - "animationSpeed=vec3(3,1.5,8);" - "camPos=vec3(-20,6,-13)+vec3(cos(s*72.),cos(s*64.),sin(s*48.))*3.*smoothstep(.09,.1,s)*smoothstep(.7,.1,s);" - "camTa=vec3(3,2,-23);" - "camFocal=mix(4.,4.2,smoothstep(0.,5.,s));" - "float y=smoothstep(.4,.1,s)*13.;" - "anvilPos=vec3(0,y,-22);" + "float f=v-150.;" + "w=normalize(vec3(0,0,1));" + "s=vec3(0,-smoothstep(.25,.4,f)*4.5,-22);" + "x=vec3(2,0,-30);" + "m=vec3(1,1,.5);" + "y=vec3(3,1.5,8);" + "c=vec3(-20,6,-13)+vec3(cos(f*72.),cos(f*64.),sin(f*48.))*3.*smoothstep(.09,.1,f)*smoothstep(.7,.1,f);" + "a=vec3(3,2,-23);" + "g=mix(4.,4.2,smoothstep(0.,5.,f));" + "float F=smoothstep(.4,.1,f)*13.;" + "n=vec3(0,F,-22);" "}" "else" "{" - "float s=v-155.;" - "eyeDir=normalize(vec3(0,0,1));" - "sheepPos=vec3(9e7);" - "panelWarningPos=vec3(-1,0,-8);" - "flowerPos=vec3(1,0,-25);" - "camTa=vec3(2,3.8,-18);" - "camPos=vec3(5,5,2);" - "float y=smoothstep(1.5,2.,s);" - "camFocal=2.5+y*3.5;" - "anvilPos=vec3(7,0,-20);" - "excited=y*.5;" + "float f=v-155.;" + "w=normalize(vec3(0,0,1));" + "s=vec3(9e7);" + "z=vec3(-1,0,-8);" + "x=vec3(1,0,-25);" + "a=vec3(2,3.8,-18);" + "c=vec3(5,5,2);" + "float F=smoothstep(1.5,2.,f);" + "g=2.5+F*3.5;" + "n=vec3(7,0,-20);" + "p=F*.5;" "}" "}"; const char *edges_frag = "#version 150\n" - "out vec4 fragColor;" - "const vec2 y=vec2(1280,720);" - "uniform sampler2D prevPass;" - "float c(vec4 v,vec4 s)" + "out vec4 f;" + "const vec2 M=vec2(1280,720);" + "uniform sampler2D K;" + "float F(vec4 v,vec4 m)" "{" "vec2 y=v.xy;" - "float x=v.z;" - "vec2 i=s.xy;" - "float f=s.z,d=mix(1.2,.3,smoothstep(1.,25.,x));" - "vec2 r=abs(y-i)*d;" - "float a=abs(x-f)*d;" - "return x>35.&&f>35.?" + "float f=v.z;" + "vec2 c=m.xy;" + "float x=m.z;" + "if(f>35.&&x>35.)" + "return 1.;" + "float i=mix(1.2,.3,f);" + "vec2 a=abs(y-c)*i;" + "float w=abs(f-x)*i;" + "return a.x+a.y<.2&&w<.03?" "1.:" - "r.x+r.y<.2&&a<1.9?" - "1.:" - ".7;" + ".7;" "}" "void main()" "{" - "vec4 s=texture(prevPass,gl_FragCoord.xy/y.xy),v=texture(prevPass,(gl_FragCoord.xy+vec2(1))/y.xy),x=texture(prevPass,(gl_FragCoord.xy+vec2(-1))/y.xy),d=texture(prevPass,(gl_FragCoord.xy+vec2(-1,1))/y.xy),f=texture(prevPass,(gl_FragCoord.xy+vec2(1,-1))/y.xy);" - "float i=c(v,x)*c(d,f);" - "fragColor=vec4(i,s.wz,1);" + "float y=.0015;" + "vec4 v=texture(K,gl_FragCoord.xy/M.xy),c=texture(K,gl_FragCoord.xy/M.xy+y*vec2(1)),a=texture(K,gl_FragCoord.xy/M.xy+y*vec2(-1)),m=texture(K,gl_FragCoord.xy/M.xy+y*vec2(-1,1)),x=texture(K,gl_FragCoord.xy/M.xy+y*vec2(1,-1));" + "float i=F(c,a)*F(m,x);" + "f=vec4(i,v.wz,1);" "}"; const char *fxaa_frag = "#version 150\n" - "out vec4 fragColor;\n" + "out vec4 f;\n" "#define iResolution vec2(1280.,720.)\n" - "uniform sampler2D prevPass;" - "vec3 c(vec4 v,sampler2D s,vec2 y)" + "uniform sampler2D K;" + "vec3 E(vec4 v,sampler2D f,vec2 y)" "{" - "vec3 i=textureLod(s,v.zw,0.).www,d=textureLod(s,v.zw+vec2(1,0)*y.xy,0.).www,f=textureLod(s,v.zw+vec2(0,1)*y.xy,0.).www,x=textureLod(s,v.zw+vec2(1)*y.xy,0.).www,r=textureLod(s,v.xy,0.).xyz,l=vec3(.299,.587,.114);" - "float m=dot(i,l),a=dot(d,l),c=dot(f,l),p=dot(x,l),t=dot(r,l),e=min(t,min(min(m,a),min(c,p))),b=max(t,max(max(m,a),max(c,p)));" - "vec2 h;" - "h.x=-(m+a-c-p);" - "h.y=m+c-a-p;" - "float z=1./(min(abs(h.x),abs(h.y))+1./128.);" - "h=min(vec2(8),max(vec2(-8),h*z))*y.xy;" - "vec3 n=.5*(textureLod(s,v.xy+h*(1./3.-.5),0.).www+textureLod(s,v.xy+h*(2./3.-.5),0.).www),E=n*.5+.25*(textureLod(s,v.xy+h*-.5,0.).www+textureLod(s,v.xy+h*.5,0.).www);" - "float w=dot(E,l);" - "return wb?" + "vec3 c=textureLod(f,v.zw,0.).www,a=textureLod(f,v.zw+vec2(1,0)*y.xy,0.).www,m=textureLod(f,v.zw+vec2(0,1)*y.xy,0.).www,x=textureLod(f,v.zw+vec2(1)*y.xy,0.).www,F=textureLod(f,v.xy,0.).xyz,g=vec3(.299,.587,.114);" + "float s=dot(c,g),z=dot(a,g),w=dot(m,g),U=dot(x,g),J=dot(F,g),l=min(J,min(min(s,z),min(w,U))),p=max(J,max(max(s,z),max(w,U)));" + "vec2 i;" + "i.x=-(s+z-w-U);" + "i.y=s+w-z-U;" + "float d=1./(min(abs(i.x),abs(i.y))+1./128.);" + "i=min(vec2(8),max(vec2(-8),i*d))*y.xy;" + "vec3 n=.5*(textureLod(f,v.xy+i*(1./3.-.5),0.).www+textureLod(f,v.xy+i*(2./3.-.5),0.).www),N=n*.5+.25*(textureLod(f,v.xy+i*-.5,0.).www+textureLod(f,v.xy+i*.5,0.).www);" + "float G=dot(N,g);" + "return Gp?" "n:" - "E;" + "N;" "}" "void main()" "{" - "vec2 s=1./y,v=gl_FragCoord.xy*s;" - "vec4 d=vec4(v,v-s*.5);" - "vec3 r=c(d,prevPass,s);" - "vec4 i=textureLod(prevPass,d.xy,0.);" - "fragColor=vec4(i.xyz,r.x);" + "vec2 y=1./M,v=gl_FragCoord.xy*y;" + "vec4 c=vec4(v,v-y*.5);" + "vec3 a=E(c,K,y);" + "vec4 m=textureLod(K,c.xy,0.);" + "f=vec4(m.xyz,a.x);" "}"; const char *postprocess_frag = "#version 150\n" - "out vec4 fragColor;" - "const vec2 r=vec2(1280,720);" - "uniform sampler2D prevPass;" - "uniform float iTime;" - "vec2 l;" - "float w(vec2 v)" + "out vec4 f;" + "const vec2 L=vec2(1280,720);" + "uniform sampler2D K;" + "uniform float d;" + "vec2 b;" + "float O(vec2 v)" "{" "return fract(sin(dot(v.xy,vec2(12.9898,78.233)))*43758.5453);" "}" - "float w(float v)" + "float O(float v)" "{" - "return w(vec2(v,1));" + "return O(vec2(v,1));" "}" - "float b(float v)" + "float P(float v)" "{" - "float s=.01*w(v),y=w(v+1.),x=w(v+2.)-.5,f=w(v+3.),a=1.;" - "a=pow(abs(y*l.x+s*l.y+x),.0625);" - "return mix(.5,1.,f>.2?" - "a:" - "2.-a);" + "float y=.01*O(v),f=O(v+1.),c=O(v+2.)-.5,a=O(v+3.),m=1.;" + "m=pow(abs(f*b.x+y*b.y+c),.0625);" + "return mix(.5,1.,a>.2?" + "m:" + "2.-m);" "}" - "float u(float v)" + "float Q(float v)" "{" - "float s=w(v),y=w(v+1.),m=.01*w(v+2.);" - "vec2 f=vec2(s,y)-l;" - "f.x*=r.x/r.y;" - "float d=atan(f.y,f.x),a=1.,x=m*m*(sin(6.2831*d*s)*.1+1.);" - "a=dot(f,f) Date: Sat, 25 Feb 2023 16:56:12 +0100 Subject: [PATCH 6/9] Edges & textures tweaks --- Intro/src/shaders/edges.frag | 6 +++--- Intro/src/shaders/mouton.frag | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Intro/src/shaders/edges.frag b/Intro/src/shaders/edges.frag index 5d06382..f2495be 100644 --- a/Intro/src/shaders/edges.frag +++ b/Intro/src/shaders/edges.frag @@ -11,10 +11,10 @@ float checkSame(vec4 center, vec4 samplef) vec2 sampleNormal = samplef.xy; float sampleDepth = samplef.z; - if (centerDepth > 35. && sampleDepth > 35.) return 1.; + if (centerDepth > .999 && sampleDepth > .999) return 1.; // Less sensitive when it's far away; more edge details when it's closer. - float sensitivity = mix(1.2, .3, centerDepth); + float sensitivity = mix(1.3, .4, centerDepth); vec2 diffNormal = abs(centerNormal - sampleNormal) * sensitivity; bool isSameNormal = diffNormal.x + diffNormal.y < 0.2; @@ -26,7 +26,7 @@ float checkSame(vec4 center, vec4 samplef) void main(void) { - float width = .0015; + float width = 0.001; vec4 sample0 = texture(prevPass, gl_FragCoord.xy / iResolution.xy); vec4 sample1 = texture(prevPass, gl_FragCoord.xy / iResolution.xy + width*vec2(1., 1.)); vec4 sample2 = texture(prevPass, gl_FragCoord.xy / iResolution.xy + width*vec2(-1., -1.)); diff --git a/Intro/src/shaders/mouton.frag b/Intro/src/shaders/mouton.frag index 1ec7acb..491d2ec 100644 --- a/Intro/src/shaders/mouton.frag +++ b/Intro/src/shaders/mouton.frag @@ -493,7 +493,7 @@ float shade(vec3 ro, vec3 rd, vec3 p, vec3 n, vec2 uv) { vec2 dmat = map(p); float iTime = int(iTime * 12) / 12.; - float night = smoothstep(0.,.3, sunDir.y)+.1; + float night = mix(0.3, 1., smoothstep(0.,.3, sunDir.y)); float ao = fastAO(p, n, .15, 1.); ao *= fastAO(p, n, 1., .1)*.5; @@ -571,22 +571,22 @@ float shade(vec3 ro, vec3 rd, vec3 p, vec3 n, vec2 uv) { pr.zy = rot(.75) * pr.zy; albedo = mix( 1.5, .7 /*vec3(.75,0.5,1.)*/, smoothstep(0.5,1.1, length(pr-vec3(0.,.3,0.))))*2.; } else if(dmat.y == BLACK_METAL) { - albedo = 1.; + albedo = 2.; diff *= .1*fre; amb *= .1*fre; bnc = 0.; } else if(dmat.y == BLOOD) { - albedo = .4; + albedo = .8; float fre2 = fre*fre; diff *= 3.; - amb *= 2.*fre2; + amb *= 1.*fre2; } if (dmat.y == SKIN) { albedo = .8; amb *= .8; } - float col = (albedo * (amb*1. + diff*.5 + bnc*2. ) + emi) * night; + float col = (albedo * (amb*1. + diff*.5 + bnc*2. ) + emi) * night; // fog float t = length(p-ro); @@ -642,7 +642,7 @@ void main() float nx = clamp(n.x, 0., 1.); float ny = clamp(n.y, 0., 1.); - t = smoothstep(1., 30., t); + t = smoothstep(1., 40., t); // gamma correction fragColor = vec4(nx, ny, t, pow(col, 1./2.2)); From dc897497d559a1a316a031b833b0f3151446c18b Mon Sep 17 00:00:00 2001 From: Laurent Le Brun Date: Sun, 26 Feb 2023 15:31:19 +0100 Subject: [PATCH 7/9] Apply fxaa on the edges too Better edge detection wrt normals --- Intro/src/shaders/edges.frag | 22 +++++++++++++--------- Intro/src/shaders/fxaa.frag | 22 +++++++++++----------- Intro/src/shaders/mouton.frag | 5 +++-- Intro/src/shaders/postprocess.frag | 11 ++++++----- mouton.klproj | Bin 16719 -> 16926 bytes 5 files changed, 33 insertions(+), 27 deletions(-) diff --git a/Intro/src/shaders/edges.frag b/Intro/src/shaders/edges.frag index f2495be..1a1da7c 100644 --- a/Intro/src/shaders/edges.frag +++ b/Intro/src/shaders/edges.frag @@ -16,26 +16,30 @@ float checkSame(vec4 center, vec4 samplef) // Less sensitive when it's far away; more edge details when it's closer. float sensitivity = mix(1.3, .4, centerDepth); - vec2 diffNormal = abs(centerNormal - sampleNormal) * sensitivity; - bool isSameNormal = diffNormal.x + diffNormal.y < 0.2; + float distNormal = distance(centerNormal, sampleNormal) * sensitivity; + if (distNormal > 0.15) return mix(0.6, 1., smoothstep(0.15, 1., distNormal)); + float diffDepth = abs(centerDepth - sampleDepth) * sensitivity; - bool isSameDepth = diffDepth < 0.03; + bool isSameDepth = min(centerDepth,sampleDepth) / max(centerDepth,sampleDepth) > 0.85; + //isSameDepth = true; - return (isSameNormal && isSameDepth) ? 1.0 : 0.7; + return isSameDepth ? 1.0 : 0.6; +// return 1.; } void main(void) { - float width = 0.001; + float width = 0.0009; vec4 sample0 = texture(prevPass, gl_FragCoord.xy / iResolution.xy); - vec4 sample1 = texture(prevPass, gl_FragCoord.xy / iResolution.xy + width*vec2(1., 1.)); - vec4 sample2 = texture(prevPass, gl_FragCoord.xy / iResolution.xy + width*vec2(-1., -1.)); - vec4 sample3 = texture(prevPass, gl_FragCoord.xy / iResolution.xy + width*vec2(-1., 1.)); - vec4 sample4 = texture(prevPass, gl_FragCoord.xy / iResolution.xy + width*vec2(1., -1.)); + vec4 sample1 = texture(prevPass, gl_FragCoord.xy / iResolution.xy + vec2(width, width)); + vec4 sample2 = texture(prevPass, gl_FragCoord.xy / iResolution.xy + vec2(-width, -width)); + vec4 sample3 = texture(prevPass, gl_FragCoord.xy / iResolution.xy + vec2(-width, width)); + vec4 sample4 = texture(prevPass, gl_FragCoord.xy / iResolution.xy + vec2(width, -width)); float edge = checkSame(sample1, sample2) * checkSame(sample3, sample4); // edge, base color, depth fragColor = vec4(edge, sample0.w, sample0.z, 1.); + //fragColor = vec4(edge, sample0.w, sample0.z, 1.); } diff --git a/Intro/src/shaders/fxaa.frag b/Intro/src/shaders/fxaa.frag index 4b8011c..9c71de7 100644 --- a/Intro/src/shaders/fxaa.frag +++ b/Intro/src/shaders/fxaa.frag @@ -1,6 +1,6 @@ #version 150 out vec4 fragColor; -#define iResolution vec2(1280.,720.) +const vec2 iResolution = vec2(1280.,720.); uniform sampler2D prevPass; @@ -10,11 +10,11 @@ uniform sampler2D prevPass; vec3 FxaaPixelShader( vec4 uv, sampler2D tex, vec2 rcpFrame) { - vec3 rgbNW = textureLod(tex, uv.zw, 0.0).www; - vec3 rgbNE = textureLod(tex, uv.zw + vec2(1,0)*rcpFrame.xy, 0.0).www; - vec3 rgbSW = textureLod(tex, uv.zw + vec2(0,1)*rcpFrame.xy, 0.0).www; - vec3 rgbSE = textureLod(tex, uv.zw + vec2(1,1)*rcpFrame.xy, 0.0).www; - vec3 rgbM = textureLod(tex, uv.xy, 0.0).xyz; + vec3 rgbNW = textureLod(tex, uv.zw, 0.0).rrg; + vec3 rgbNE = textureLod(tex, uv.zw + vec2(1,0)*rcpFrame.xy, 0.0).rrg; + vec3 rgbSW = textureLod(tex, uv.zw + vec2(0,1)*rcpFrame.xy, 0.0).rrg; + vec3 rgbSE = textureLod(tex, uv.zw + vec2(1,1)*rcpFrame.xy, 0.0).rrg; + vec3 rgbM = textureLod(tex, uv.xy, 0.0).rrg; vec3 luma = vec3(0.299, 0.587, 0.114); float lumaNW = dot(rgbNW, luma); @@ -37,11 +37,11 @@ vec3 FxaaPixelShader( vec4 uv, sampler2D tex, vec2 rcpFrame) { dir * rcpDirMin)) * rcpFrame.xy; vec3 rgbA = (1.0/2.0) * ( - textureLod(tex, uv.xy + dir * (1.0/3.0 - 0.5), 0.0).www + - textureLod(tex, uv.xy + dir * (2.0/3.0 - 0.5), 0.0).www); + textureLod(tex, uv.xy + dir * (1.0/3.0 - 0.5), 0.0).rrg + + textureLod(tex, uv.xy + dir * (2.0/3.0 - 0.5), 0.0).rrg); vec3 rgbB = rgbA * (1.0/2.0) + (1.0/4.0) * ( - textureLod(tex, uv.xy + dir * (0.0/3.0 - 0.5), 0.0).www + - textureLod(tex, uv.xy + dir * (3.0/3.0 - 0.5), 0.0).www); + textureLod(tex, uv.xy + dir * (0.0/3.0 - 0.5), 0.0).rrg + + textureLod(tex, uv.xy + dir * (3.0/3.0 - 0.5), 0.0).rrg); float lumaB = dot(rgbB, luma); @@ -58,5 +58,5 @@ void main(void) vec3 col = FxaaPixelShader(uv, prevPass, invRes); vec4 orig = textureLod(prevPass, uv.xy, 0.0); - fragColor = vec4(orig.xyz, col.r); + fragColor = vec4(col.r, col.b, orig.zw); } diff --git a/Intro/src/shaders/mouton.frag b/Intro/src/shaders/mouton.frag index 491d2ec..85aaab7 100644 --- a/Intro/src/shaders/mouton.frag +++ b/Intro/src/shaders/mouton.frag @@ -640,8 +640,9 @@ void main() // as well as the color (channel w).We make sure all components are restricted // between 0 and 1. - float nx = clamp(n.x, 0., 1.); - float ny = clamp(n.y, 0., 1.); + n = normalize(n); + float nx = clamp(0.5*n.x+.5, 0., 1.); + float ny = clamp(0.5*n.y+.5, 0., 1.); t = smoothstep(1., 40., t); // gamma correction diff --git a/Intro/src/shaders/postprocess.frag b/Intro/src/shaders/postprocess.frag index 2566e25..27bbe25 100644 --- a/Intro/src/shaders/postprocess.frag +++ b/Intro/src/shaders/postprocess.frag @@ -63,15 +63,15 @@ void main(void) suv += (suv*2.-1.)*invRes.x*.5; const float errorFreq = 20.; - const float errorRange = 0.003; + const float errorRange = 0.002; vec2 uvs1 = suv + vec2(errorRange * sin(errorFreq * suv.y), errorRange * sin(errorFreq * suv.x)); - vec2 uvs2 = suv + vec2(errorRange * sin(errorFreq * suv.y + 1.), errorRange * sin(errorFreq * suv.x + 3.)); - vec2 uvs3 = suv + vec2(errorRange * sin(errorFreq * suv.y + 2.), errorRange * sin(errorFreq * suv.x + 1.)); + vec2 uvs2 = suv + vec2(errorRange * sin(errorFreq * suv.y + 1.), 2.*errorRange * sin(errorFreq * suv.x + 3.)); + vec2 uvs3 = suv + vec2(errorRange * sin(errorFreq * suv.y + 2.), 2.*errorRange * sin(errorFreq * suv.x + 1.)); - float edge = texture(prevPass, uvs1).r * pow(texture(prevPass, uvs2).r,0.5) * pow(texture(prevPass, uvs3).r,0.25); + float edge = texture(prevPass, uvs1).r * pow(texture(prevPass, uvs2).r,0.5); // * pow(texture(prevPass, uvs3).r,0.3); float col = texture(prevPass,suv).g; - col *= mix(.2, 1., edge); + col *= edge; // fade in col *= smoothstep(0.,10., t); @@ -94,6 +94,7 @@ void main(void) // vignetting float vI = 12.0 * (uv.x * (1.0-uv.x) * uv.y * (1.0-uv.y)); + vI = smoothstep(0., .5, vI); int l = int(8. * rand(t+7.) - 1.); int s = int(8. * rand(t+18.) - 2.); diff --git a/mouton.klproj b/mouton.klproj index 46e6654d7794d28c9febbf02ef9026bbe9a1b612..fbf82f31cb1fc908022b5dc70507477ef66dea35 100644 GIT binary patch literal 16926 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 literal 16719 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 Xe)q%Pl&_jL?}zizaR2`U|KFs3LSxX? From 8fc965db13e3c766e74b3c61ca7b4b7519c9e328 Mon Sep 17 00:00:00 2001 From: Laurent Le Brun Date: Sun, 26 Feb 2023 18:07:13 +0100 Subject: [PATCH 8/9] Remove blotches + update hand-drawn effect (thanks to Zavie) When the pencil error is too big, fade out the pencil --- Intro/src/shaders/postprocess.frag | 37 ++++++++---------------------- 1 file changed, 9 insertions(+), 28 deletions(-) diff --git a/Intro/src/shaders/postprocess.frag b/Intro/src/shaders/postprocess.frag index 27bbe25..bfefd22 100644 --- a/Intro/src/shaders/postprocess.frag +++ b/Intro/src/shaders/postprocess.frag @@ -29,26 +29,6 @@ float randomLine(float seed) return mix(0.5, 1.0, mu > 0.2 ? l : 2. - l); } -// Generate some blotches. -float randomBlotch(float seed) -{ - float x = rand(seed); - float y = rand(seed+1.0); - float s = 0.01 * rand(seed+2.0); - - vec2 p = vec2(x,y) - uv; - p.x *= iResolution.x / iResolution.y; - float a = atan(p.y,p.x); - float v = 1.0; - float ss = s*s * (sin(6.2831*a*x)*0.1 + 1.0); - - if ( dot(p,p) < ss ) v = 0.2; - else - v = pow(dot(p,p) - ss, 1.0/16.0); - - return mix(0.3 + 0.2 * (1.0 - (s / 0.02)), 1.0, v); -} - void main(void) { // Set frequency of global effect (12 / second). @@ -63,12 +43,15 @@ void main(void) suv += (suv*2.-1.)*invRes.x*.5; const float errorFreq = 20.; - const float errorRange = 0.002; - vec2 uvs1 = suv + vec2(errorRange * sin(errorFreq * suv.y), errorRange * sin(errorFreq * suv.x)); - vec2 uvs2 = suv + vec2(errorRange * sin(errorFreq * suv.y + 1.), 2.*errorRange * sin(errorFreq * suv.x + 3.)); - vec2 uvs3 = suv + vec2(errorRange * sin(errorFreq * suv.y + 2.), 2.*errorRange * sin(errorFreq * suv.x + 1.)); - - float edge = texture(prevPass, uvs1).r * pow(texture(prevPass, uvs2).r,0.5); // * pow(texture(prevPass, uvs3).r,0.3); + float errorRange = .004; + vec2 uvs1 = suv; // + vec2(0. * errorRange * sin(errorFreq * suv.y), .0 * errorRange * sin(errorFreq * suv.x)); + float edge = pow(texture(prevPass, uvs1).r,1.); + + vec2 err = errorRange * vec2(sin(errorFreq * suv.y + 1.), sin(errorFreq * suv.x + 3.)); + edge *= mix( pow(texture(prevPass, suv + err).r,0.7), 1., smoothstep(0.0, 0.006, length(err))); + + err = errorRange * vec2(sin(errorFreq * suv.y + 2.), sin(errorFreq * suv.x + 1.)); + edge *= mix( pow(texture(prevPass, suv + err).r,0.7), 1., smoothstep(0.0, 0.005, length(err))); float col = texture(prevPass,suv).g; col *= edge; @@ -78,7 +61,6 @@ void main(void) const float endTime = 160.; - // Circle to black float circle = length(gl_FragCoord.xy/iResolution.xx - vec2(.5,.3)); float t2 = max(.137, smoothstep(endTime+1., endTime, t)); @@ -100,7 +82,6 @@ void main(void) int s = int(8. * rand(t+18.) - 2.); for (int i = 0; i < 8; i++) { if (i < l) vI *= randomLine(t + i); - if (i < s) vI *= randomBlotch(t - i); } col *= vI; col -= rand(uv+t)*.05; // grain From 5ffcb332b4d4e9ce774de11158b5a6bf6e381da0 Mon Sep 17 00:00:00 2001 From: Anatole Duprat Date: Sat, 4 Mar 2023 10:19:30 +0000 Subject: [PATCH 9/9] Update kodelife project with the new shaders --- Intro/src/shaders/mouton.frag.klproj | Bin 17195 -> 16705 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Intro/src/shaders/mouton.frag.klproj b/Intro/src/shaders/mouton.frag.klproj index 20976a69d02ef05f792ffc4b4b83330bcbb2e744..e4b912d3907ad5903822e3ee06229f9e1f169e88 100644 GIT binary patch literal 16705 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 Qujc(|F&-WKf2w|(tEtnxL;wH) literal 17195 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