-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathnoise_contour.sttf
1 lines (1 loc) · 28.6 KB
/
noise_contour.sttf
1
{"links":[{"end":"Image","filter":"Mipmap","slot":1,"start":"Texture","wrapMode":"Repeat"},{"end":"RenderOutput","filter":"Linear","slot":0,"start":"Image","wrapMode":"Repeat"},{"end":"Image","filter":"Linear","slot":0,"start":"Buf B","wrapMode":"Clamp"},{"end":"Buf B","filter":"Linear","slot":0,"start":"Buf A","wrapMode":"Clamp"}],"metadata":{"Author":"candycat","Description":"Draw noise contour by multi passes. Full-screen shows more detail. Mouse dragging is available. Try use videos as texture :)","Name":"Noise Contour","ShaderToyURL":"https://www.shadertoy.com/view/MscSzf"},"nodes":[{"class":"RenderOutput","name":"RenderOutput"},{"class":"GLSLShader","name":"Image","source":"#define EdgeColor vec4(0.2, 0.2, 0.15, 1.0)\n#define BackgroundColor vec4(1,0.95,0.85,1)\n#define NoiseAmount 0.01\n#define ErrorPeriod 30.0\n#define ErrorRange 0.003\n\n// Reference: https://www.shadertoy.com/view/MsSGD1\nfloat triangle(float x)\n{\n\treturn abs(1.0 - mod(abs(x), 2.0)) * 2.0 - 1.0;\n}\n\nfloat rand(float x)\n{\n return fract(sin(x) * 43758.5453);\n}\n\nvoid mainImage( out vec4 fragColor, in vec2 fragCoord )\n{\n float time = floor(iTime * 16.0) / 16.0;\n vec2 uv = fragCoord.xy / iResolution.xy;\n uv += vec2(triangle(uv.y * rand(time) * 1.0) * rand(time * 1.9) * 0.005,\n\t\t\ttriangle(uv.x * rand(time * 3.4) * 1.0) * rand(time * 2.1) * 0.005);\n \n float noise = (texture(iChannel1, uv * 0.5).r - 0.5) * NoiseAmount;\n vec2 uvs[3];\n uvs[0] = uv + vec2(ErrorRange * sin(ErrorPeriod * uv.y + 0.0) + noise, ErrorRange * sin(ErrorPeriod * uv.x + 0.0) + noise);\n uvs[1] = uv + vec2(ErrorRange * sin(ErrorPeriod * uv.y + 1.047) + noise, ErrorRange * sin(ErrorPeriod * uv.x + 3.142) + noise);\n uvs[2] = uv + vec2(ErrorRange * sin(ErrorPeriod * uv.y + 2.094) + noise, ErrorRange * sin(ErrorPeriod * uv.x + 1.571) + noise);\n \n float edge = texture(iChannel0, uvs[0]).r * texture(iChannel0, uvs[1]).r * texture(iChannel0, uvs[2]).r;\n \tfloat diffuse = texture(iChannel0, uv).g;\n \n\tfloat w = fwidth(diffuse) * 2.0;\n\tvec4 mCol = mix(BackgroundColor * 0.5, BackgroundColor, mix(0.0, 1.0, smoothstep(-w, w, diffuse - 0.3)));\n\tfragColor = mix(EdgeColor, mCol, edge);\n //fragColor = vec4(diffuse);\n}\n","type":"Image"},{"class":"Texture","data":"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","height":64,"name":"Texture","width":64},{"class":"GLSLShader","name":"Buf A","source":"// Depth and normal Pass\n#define PRECIS 0.001\n#define DMAX 20.0\nmat3 camMat;\nvec3 lightDir = normalize(vec3(5.0, 5.0, -4.0));\n\n// Distance functions by iquilezles.org\nfloat fSubtraction(float a, float b) {return max(-a,b);}\nfloat fIntersection(float d1, float d2) {return max(d1,d2);}\nvoid fUnion(inout float d1, float d2) {d1 = min(d1,d2);}\nfloat pSphere(vec3 p, float s) {return length(p)-s;}\nfloat pRoundBox(vec3 p, vec3 b, float r) {return length(max(abs(p)-b,0.0))-r;}\nfloat pTorus(vec3 p, vec2 t) {vec2 q = vec2(length(p.xz)-t.x,p.y); return length(q)-t.y;}\nfloat pTorus2(vec3 p, vec2 t) {vec2 q = vec2(length(p.xy)-t.x,p.z); return length(q)-t.y;}\nfloat pCapsule(vec3 p, vec3 a, vec3 b, float r) {vec3 pa = p - a, ba = b - a;\n\tfloat h = clamp( dot(pa,ba)/dot(ba,ba), 0.0, 1.0 ); return length( pa - ba*h ) - r;}\n\nfloat map(vec3 p)\n{\n\tfloat d = 100000.0;\n\n fUnion(d, pRoundBox(p - vec3(0,-2.0,0), vec3(4,0.1,4), 0.2));\n\tfUnion(d, pSphere(p - vec3(2,0,2), 1.5));\n fUnion(d, pSphere(p - vec3(3.5,-1.0,0.0), 0.8));\n fUnion(d, pTorus(p - vec3(-2,0,2), vec2(1,0.3)));\n\tfUnion(d, pTorus2(p - vec3(-3,0,2), vec2(1,0.3)));\n fUnion(d, pRoundBox(p - vec3(2,0.6,-2), vec3(0.1,0.1,1), 0.3));\n\tfUnion(d, pRoundBox(p - vec3(2,0,-2), vec3(0.1,1.5,0.1), 0.3));\n\tfUnion(d, pRoundBox(p - vec3(2,-0.4,-2), vec3(1.2,0.1,0.1), 0.3));\n fUnion(d, pCapsule(p, vec3(-2,1.5,-2), vec3(-2,-1,-1.0), 0.3));\n\tfUnion(d, pCapsule(p, vec3(-2,1.5,-2), vec3(-1.0,-1,-2.5), 0.3));\n\tfUnion(d, pCapsule(p, vec3(-2,1.5,-2), vec3(-3.0,-1,-2.5), 0.3));\n\t\n\treturn d;\n}\n\nvec3 normal(vec3 pos) {\n vec2 eps = vec2(0.001, 0.0);\n return normalize(vec3(\tmap(pos + eps.xyy) - map(pos - eps.xyy),\n \t\tmap(pos + eps.yxy) - map(pos - eps.yxy),\n \tmap(pos + eps.yyx) - map(pos - eps.yyx)));\n}\n\nfloat shadow(vec3 ro, vec3 rd)\n{\n float res = 1.0;\n float t = PRECIS * 30.0;\n for( int i=0; i < 30; i++ )\n {\n\t\tfloat distToSurf = map( ro + rd*t );\n res = min(res, 8.0 * distToSurf / t);\n t += distToSurf;\n if(distToSurf < PRECIS || t > DMAX) break;\n }\n \n return clamp(res, 0.0, 1.0);\n}\n\nvec4 raymarching(vec3 ro, vec3 rd)\n{\n float t = 0.0;\n for (int i = 0; i < 50; i++) {\n \tfloat distToSurf = map(ro + t * rd);\n t += distToSurf;\n if (distToSurf < PRECIS || t > DMAX) break; \n }\n \n vec4 col = vec4(0.0);\n if (t <= DMAX) {\n vec3 nor = normal(ro + t * rd);\n col.z = 1.0 - abs((t * rd) * camMat).z / DMAX; // Depth\n col.xy = (nor * camMat * 0.5 + 0.5).xy;\t// Normal\n col.w = dot(lightDir, nor) * 0.5 + 0.5; // Diff\n col.w *= shadow(ro + t * rd, lightDir);\n }\n \n return col;\n}\n\nmat3 setCamera(vec3 ro, vec3 ta, float cr)\n{\n\tvec3 cw = normalize(ta-ro);\n\tvec3 cp = vec3(sin(cr), cos(cr),0.0);\n\tvec3 cu = normalize( cross(cw,cp) );\n\tvec3 cv = normalize( cross(cu,cw) );\n return mat3( cu, cv, cw );\n}\n\nvoid mainImage( out vec4 fragColor, in vec2 fragCoord )\n{\n vec2 p = (2.0 * fragCoord.xy - iResolution.xy) / iResolution.yy;\n \n // Mouse\n vec2 mo = vec2(0.0);\n if (iMouse.z > 0.0) {\n mo += (2.0 * iMouse.xy - iResolution.xy) / iResolution.yy;\n }\n \n // Camera position\n float dist = 6.5;\n vec3 ro = vec3(dist * cos(iTime * 0.1 + 6.0 * mo.x), 2.0 + mo.y * 4.0, dist * sin(iTime * 0.1 + 6.0 * mo.x));\n \n // Rotate the camera\n vec3 target = vec3(0.0, 0.0, 0.0);\n \n // Compute the ray\n camMat = setCamera(ro, target, 0.0);\n vec3 rd = camMat * normalize(vec3(p.xy, 1.5));\n \n // calculate color\n\tfragColor = raymarching(ro, rd);\n}\n","type":"Image"},{"class":"GLSLShader","name":"Buf B","source":"// Edge detection Pass\n#define Sensitivity (vec2(0.3, 1.5) * iResolution.y / 400.0)\n\nfloat checkSame(vec4 center, vec4 samplef)\n{\n vec2 centerNormal = center.xy;\n float centerDepth = center.z;\n vec2 sampleNormal = samplef.xy;\n float sampleDepth = samplef.z;\n \n vec2 diffNormal = abs(centerNormal - sampleNormal) * Sensitivity.x;\n bool isSameNormal = (diffNormal.x + diffNormal.y) < 0.1;\n float diffDepth = abs(centerDepth - sampleDepth) * Sensitivity.y;\n bool isSameDepth = diffDepth < 0.1;\n \n return (isSameNormal && isSameDepth) ? 1.0 : 0.0;\n}\n\nvoid mainImage( out vec4 fragColor, in vec2 fragCoord )\n{\n vec4 sample0 = texture(iChannel0, fragCoord / iResolution.xy);\n vec4 sample1 = texture(iChannel0, (fragCoord + vec2(1.0, 1.0)) / iResolution.xy);\n vec4 sample2 = texture(iChannel0, (fragCoord + vec2(-1.0, -1.0)) / iResolution.xy);\n vec4 sample3 = texture(iChannel0, (fragCoord + vec2(-1.0, 1.0)) / iResolution.xy);\n vec4 sample4 = texture(iChannel0, (fragCoord + vec2(1.0, -1.0)) / iResolution.xy);\n \n float edge = checkSame(sample1, sample2) * checkSame(sample3, sample4);\n \n fragColor = vec4(edge, sample0.w, 1.0, 1.0);\n}\n","type":"Image"}]}