{"id":1383,"date":"2022-07-14T20:51:05","date_gmt":"2022-07-14T12:51:05","guid":{"rendered":"https:\/\/www.mapleriver.cn\/?p=1383"},"modified":"2022-07-14T20:51:05","modified_gmt":"2022-07-14T12:51:05","slug":"shadertoy-heart-left","status":"publish","type":"post","link":"https:\/\/www.mapleriver.cn\/?p=1383","title":{"rendered":"ShaderToy &#8211; Heart Left"},"content":{"rendered":"<p><a href=\"https:\/\/www.shadertoy.com\/view\/ltffzl\">shader toy\u5730\u5740<\/a><\/p>\n<h5>1.\u9759\u6001\u96e8\u6ef4<\/h5>\n<p>&emsp;\u00a0&emsp;\u6240\u8c13\u9759\u6001\u96e8\u6ef4\u662f\u4f53\u79ef\u8f83\u5c0f\uff0c\u5e76\u4e0d\u4f1a\u6ed1\u843d\u7684\u6c34\u73e0\uff0c\u968f\u7740\u65f6\u95f4\u6d41\u901d\uff0c\u4f53\u79ef\u6162\u6162\u53d8\u5c0f\u76f4\u5230\u6d88\u5931\u3002\u9996\u5148\uff0c\u786e\u5b9a\u9759\u6001\u96e8\u6ef4\u6240\u5728\u4f4d\u7f6e\u3002\u9879\u76ee\u4e2d\u7ed9\u51fa\u7684\u7b97\u6cd5\u5982\u4e0b\uff1a<\/p>\n<pre><code class=\"language-CG\">#define S(a, b, t) smoothstep(a, b, t)\n\nfloat Saw(float b, float t) {\n  return S(0., b, t)*S(1., b, t);\n}\n\nfloat3 N13(float p) {\n  float3 p3 = frac(float3(p, p, p) * float3(.1031, .11369, .13787));\n  p3 += dot(p3, p3.yzx + 19.19);\n  return frac(float3((p3.x + p3.y)*p3.z, (p3.x + p3.z)*p3.y, (p3.y + p3.z)*p3.x));\n}\n\nfloat N(float t) {\n  return frac(sin(t*12345.564)*7658.76);\n}\n\nfloat StaticDrops(float2 uv, float t) {\n  uv *= 40.;\n  float2 id = floor(uv);\n  uv = frac(uv) - .5;\n  float3 n = N13(id.x*107.45 + id.y*3543.654);\n  float2 p = (n.xy - .5)*.7;\n  float d = length(uv - p);\n  float fade = Saw(.025, frac(t + n.z));\n  float c = S(.3, 0., d)*frac(n.z*10.)*fade;\n  return c;\n}<\/code><\/pre>\n<p>&emsp;\u00a0&emsp; \u5927\u81f4\u601d\u8def\u662f\u5c06\u6574\u4e2aMesh\u5206\u4e3a40<em> 40\u5757\u5c0f\u533a\u57df\u3002\u6bcf\u4e2a\u5c0f\u533a\u57df\u786e\u5b9a\u4e00\u4e2a\u6c34\u73e0\u4f4d\u7f6e\u5750\u6807\uff08\u9879\u76ee\u4e2d\u4f7f\u7528\u7684\u7b97\u6cd5\u4e3aN13\uff09\uff0c\u8be5\u533a\u57df\u5176\u5b83\u4f4d\u7f6e\u5230\u6c34\u73e0\u5750\u6807\u7684\u8ddd\u79bbd\u4f5c\u4e3a\u6a21\u7cca\u7a0b\u5ea6\u7684\u5224\u65ad\u4f9d\u636e\u3002\u4f8b\u5982\uff0c\u9879\u76ee\u4e2dS\uff08.3\uff0c0.\uff0c d\uff09\uff0c\u5373\u4e3a\uff1ad&gt;0.3\u65f6\uff0cc\u503c\u4e3a0\uff0c\u540e\u7eed\u8fdb\u884c\u6a21\u7cca\u5904\u7406\u7684\u65f6\u5019\u4e3a\u6700\u5927\u6a21\u7cca\u7a0b\u5ea6\u3002<br \/>\n<a href=\"https:\/\/www.mapleriver.cn\/wp-content\/uploads\/2022\/07\/1.webp\"><img decoding=\"async\" src=\"https:\/\/www.mapleriver.cn\/wp-content\/uploads\/2022\/07\/1.webp\" alt=\"\" \/><\/a><br \/>\n&emsp;\u00a0&emsp; \u96e8\u6ef4\u6570\u91cf\u8fc7\u591a\u65f6\u53ef\u8fdb\u884c\u8fdb\u4e00\u6b65\u7b5b\u9009\u3002\u4f8b\u5982\uff0c\u9879\u76ee\u4e2d\u4f7f\u7528\uff1afrac\uff08n.z<\/em> 10.\uff09\u5220\u6389\u4e00\u4e9b\u96e8\u6ef4\u3002<br \/>\n<a href=\"https:\/\/www.mapleriver.cn\/wp-content\/uploads\/2022\/07\/2.webp\"><img decoding=\"async\" src=\"https:\/\/www.mapleriver.cn\/wp-content\/uploads\/2022\/07\/2.webp\" alt=\"\" \/><\/a><\/p>\n<p>&emsp;\u00a0&emsp;\u63a5\u7740\uff0c\u5b9e\u73b0\u96e8\u6ef4\u7279\u5f81\uff1a\u53ef\u4ee5\u5012\u5f71\u51fa\u90e8\u5206\u7a97\u5916\u7684\u7269\u4f53\u3002\u9879\u76ee\u4e2d\u91c7\u53d6\u7684\u5b9e\u73b0\u65b9\u5f0f\u662f\uff1a\u5206\u522b\u6cbf\u6c34\u5e73\u548c\u5782\u76f4\u65b9\u5411\u5e73\u79fb\u5f97\u5230\u4e24\u4e2a\u76f8\u540c\u7684\u96e8\u6ef4\uff0c\u8ba1\u7b97\u8be5\u533a\u57df\u7684\u4f4d\u7f6e\u5206\u522b\u5230\u8fd9\u4e09\u4e2a\u96e8\u6ef4\u5750\u6807\u8ddd\u79bb\u7684\u5dee\u3002\u76f8\u5173\u4ee3\u7801\u5982\u4e0b\uff1a<\/p>\n<pre><code class=\"language-CG\">float2 c = Drops(uv, t, staticDrops, layer1, layer2);\nfloat2 e = float2(.001, 0.);\nfloat cx = Drops(uv + e, t, staticDrops, layer1, layer2).x;\nfloat cy = Drops(uv + e.yx, t, staticDrops, layer1, layer2).x;\nfloat2 n = float2(cx-c.x, cy-c.x);<\/code><\/pre>\n<p>&emsp;\u00a0&emsp;\u6839\u636e\u4e0a\u8ff0\u5185\u5bb9\uff0c\u533a\u57df\u4e2d\u5176\u5b83\u4f4d\u7f6e\u5230\u6c34\u73e0\u5750\u6807\u7684\u8ddd\u79bbd\u4f5c\u4e3a\u6a21\u7cca\u7a0b\u5ea6\u7684\u5224\u65ad\u4f9d\u636e\uff0c\u8d8a\u9760\u8fd1\u503c\u8d8a\u5927\u3002\u5373\uff1a\u5706\u5fc3\u5904\u503c\u4e3a1\uff0c\u5706\u4e0a\u5706\u5916\u503c\u4e3a0\u3002\u5982\u6b64\u6839\u636e\u4ee3\u7801\u53ef\u4ee5\u5f97\u5230\u4e00\u4e2aUV\u503c\u5206\u5e03\u56fe\uff1a<br \/>\n<a href=\"https:\/\/www.mapleriver.cn\/wp-content\/uploads\/2022\/07\/3.webp\"><img decoding=\"async\" src=\"https:\/\/www.mapleriver.cn\/wp-content\/uploads\/2022\/07\/3.webp\" alt=\"\" \/><\/a><br \/>\n&emsp;\u00a0&emsp;\u5982\u56fe\uff0c\u9ec4\u8272\u8f74\u4e3av\u8f74\uff0c\u4ee3\u8868u=0\u7684\u7ebf\uff0c\u4e3aAB\u7ebf\u6bb5\u7684\u4e2d\u5782\u7ebf\uff0c\u5176\u4e0a\u7684\u70b9\u5230AB\u4e24\u70b9\u7684\u8ddd\u79bb\u76f8\u540c\uff0c\u6545\u5dee\u503c\u4e3a0\uff0cu=0\uff1b\u540c\u7406\u84dd\u8272\u8f74\u4e3au\u8f74\uff0c\u4ee3\u8868v=0\u7684\u7ebf\u3002\u8fd9\u6837\u53ef\u4ee5\u5f97\u5230\u76f8\u5e94\u4f4d\u7f6e\u7684\u91c7\u6837\u65b9\u5f0f\uff0c\u5f97\u5230\u6548\u679c\u5982\u56fe\uff1a<br \/>\n<a href=\"https:\/\/www.mapleriver.cn\/wp-content\/uploads\/2022\/07\/4.webp\"><img decoding=\"async\" src=\"https:\/\/www.mapleriver.cn\/wp-content\/uploads\/2022\/07\/4.webp\" alt=\"\" \/><\/a><br \/>\n&emsp;\u00a0&emsp;\u5728\u6700\u7ec8\u91c7\u6837\u7684\u65f6\u5019\u52a0\u4e0a\u539f\u672c\u7684UV\u5750\u6807\u5373\u53ef\uff1a<\/p>\n<pre><code class=\"language-CG\">float4 texCoord = float4(UV.x + n.x, UV.y + n.y, 0, focus);\nfloat4 lod = tex2Dlod(iChannel0, texCoord);\nfloat3 col = lod.rgb;<\/code><\/pre>\n<p>&emsp;\u00a0&emsp;\u540c\u6837\u7684\uff0c\u4f7f\u7528Lerp\u51fd\u6570\u3001smoothstep\u51fd\u6570\u8fdb\u884c\u4e00\u4e9b\u5220\u51cf\uff0c\u5f97\u5230\u6548\u679c\u5982\u56fe\uff1a<br \/>\n<a href=\"https:\/\/www.mapleriver.cn\/wp-content\/uploads\/2022\/07\/5.webp\"><img decoding=\"async\" src=\"https:\/\/www.mapleriver.cn\/wp-content\/uploads\/2022\/07\/5.webp\" alt=\"\" \/><\/a><\/p>\n<h5>2.\u52a8\u6001\u96e8\u6ef4<\/h5>\n<p>&emsp;\u00a0&emsp;\u6240\u8c13\u52a8\u6001\u96e8\u6ef4\u662f\u4f53\u79ef\u8f83\u5927\uff0c\u4f1a\u5411\u4e0b\u6ed1\u843d\uff0c\u6700\u7ec8\u79fb\u51fa\u53ef\u89c6\u533a\u57df\u7684\u6c34\u73e0\u3002\u9996\u5148\uff0c\u96e8\u6ef4\u5f62\u72b6\u4e0e\u5206\u5e03\u4e8e\u4e0a\u8282\u63cf\u8ff0\u5927\u81f4\u76f8\u540c\uff0812* 2\u4e2a\uff09\uff0c\u4ee3\u7801\u5982\u4e0b\uff1a<\/p>\n<pre><code class=\"language-CG\">                float2 UV = uv;\n                uv.y += t *0.75;\n                float2 a = float2(6., 1.);\n                float2 grid = a*2.;\n                float2 id = floor(uv*grid);\n                float3 n = N13(id.x*35.2 + id.y*2376.1);\n                float2 st = frac(uv*grid) - float2(.5, 0);\n                float x = n.x - .5;\n                float y = UV.y*20.;\n                float wiggle = sin(y + sin(y));\n                x += wiggle*(.5 - abs(x))*(n.z - .5);\n                x *= .7;\n                float ti = frac(n.z);\n                y = (Saw(.85, ti) - .5)*.9 + .5;\n                float2 p = float2(x, y);\n                float d = length((st - p) *a.yx);\n                float mainDrop = S(.4, .0, d);<\/code><\/pre>\n<p>&emsp;\u00a0&emsp;\u533a\u522b\u5728\u4e8e\u96e8\u6ef4\u4f4d\u7f6e\u7684y\u503c\u4e0d\u518d\u5229\u7528\u7b97\u6cd5\u968f\u673a\u751f\u6210\uff0c\u800c\u662f\u4e00\u4e2a\u56fa\u5b9a\u503c\u3002\u5f15\u5165\u65f6\u95f4\u53d8\u91cft\u6539\u53d8UV\u503c\uff0c\u4ea7\u751f\u4e0b\u843d\u7684\u52a8\u753b\u6548\u679c\u3002\u7ed9\u96e8\u6ef4\u4f4d\u7f6e\u7684x\u503c\u4e00\u4e2a\u968f\u7740y\u503c\u53d8\u5316\u7684\u504f\u79fb\u91cfwiggle\uff0c\u4ece\u800c\u4ea7\u751f\u6446\u52a8\u6548\u679c\u3002<br \/>\n&emsp;\u00a0&emsp;\u73b0\u5b9e\u4e2d\u7684\u6c34\u73e0\u4e0b\u843d\uff0c\u5e76\u4e0d\u662f\u8fd9\u6837\u5300\u901f\u7684\u3002\u800c\u662f\u4f1a\u505c\u7559\u7b49\u5f85\u4e00\u6bb5\u65f6\u95f4\uff0c\u7b49\u5230\u6c34\u73e0\u53d8\u5927\u540e\uff0c\u52a0\u901f\u4e0b\u843d\u4e00\u6bb5\u8ddd\u79bb\u7136\u540e\u518d\u6b21\u505c\u6b62\u3002\u9879\u76ee\u91c7\u7528\u6539\u53d8\u96e8\u6ef4\u4f4d\u7f6e\u7684y\u503c\u6765\u8fbe\u5230\u8fd9\u6837\u7684\u6548\u679c\uff0c\u7ed9\u96e8\u6ef4\u4f4d\u7f6e\u7684y\u503c\u3002\u52a0\u4e0a\u4e00\u4e2a\u504f\u79fb\u91cf\uff0c\u62b5\u6d88\u6389\u4e0b\u843d\u8ddd\u79bb\uff08uv.y += t * 0.75;\uff09\uff0c\u4fdd\u6301\u96e8\u6ef4\u4f4d\u7f6e\u4e0d\u53d8\u3002\u4ee3\u7801\u5982\u4e0b\uff1a<\/p>\n<pre><code class=\"language-CG\">float Saw(float b, float t) {\n  return S(0., b, t)*S(1., b, t);\n}\n\nfloat ti = frac(t + n.z);\ny = (Saw(.85, ti) - .5)*.9 + .5;\nfloat2 p = float2(x, y);<\/code><\/pre>\n<p>&emsp;\u00a0&emsp;\u8fd9\u6837\u7684\u7b97\u6cd5\u4f7f\u5f97ti\u503c\u4e3a0~ 0.85\u65f6\uff0c\u96e8\u6ef4\u4f4d\u7f6e\u4e0a\u5347\uff0c\u62b5\u6d88\u4e0b\u843d\u8ddd\u79bb\uff0cti\u503c\u4e3a0.85~1\u65f6\uff0c\u96e8\u6ef4\u4f4d\u7f6e\u4e0b\u964d\uff0c\u4e0e\u4e0b\u843d\u8ddd\u79bb\u76f8\u52a0\uff0c\u6025\u901f\u4e0b\u843d\u3002<br \/>\n&emsp;\u00a0&emsp;\u63a5\u7740\u5b9e\u73b0\u6ed1\u843d\u75d5\u8ff9\uff0c\u601d\u8def\u4e0e\u96e8\u6ef4\u4f4d\u7f6e\u5206\u5e03\u7c7b\u4f3c\uff0c\u6839\u636e\u8ddd\u79bb\u4f53\u73b0\u51fa\u4e0d\u540c\u7684\u6a21\u7cca\u7a0b\u5ea6\u5373\u53ef\uff1a<\/p>\n<pre><code class=\"language-CG\">float r = sqrt(S(1., y, st.y));\nfloat cd = abs(st.x - x);\nfloat trail = S(.23*r, .15*r*r, cd);\ntrail *= trailFront*r*r;<\/code><\/pre>\n<p>&emsp;\u00a0&emsp;\u6700\u540e\u4e3a\u4e86\u4f7f\u6548\u679c\u66f4\u52a0\u903c\u771f\uff0c\u53ef\u4ee5\u518d\u4e0b\u843d\u7684\u8def\u5f84\u4e2d\u968f\u673a\u4ea7\u751f\u4e00\u4e9b\u9759\u6001\u96e8\u6ef4\uff0c\u601d\u8def\u4e0e\u4e0a\u8282\u63cf\u8ff0\u7c7b\u4f3c\uff0c\u4ee3\u7801\u5982\u4e0b\uff1a<\/p>\n<pre><code class=\"language-CG\">float trailFront = S(-.02, .02, st.y - y);\ny = UV.y;\nfloat trail2 = S(.2*r, .0, cd);\nfloat droplets = max(0., (sin(y*(1. - y)*120.) - st.y))*trail2*trailFront*n.z;\ny = frac(y*10.) + (st.y - .5);\nfloat dd = length(st - float2(x, y));\ndroplets = S(.3, 0., dd);<\/code><\/pre>\n<h5>3.\u5b8c\u6574\u4ee3\u7801<\/h5>\n<pre><code class=\"language-CG\">Shader &quot;Custom\/Raindrop&quot; {\n\u00a0 \u00a0 Properties {\n\u00a0 \u00a0 \u00a0 \u00a0 iChannel0(&quot;Albedo (RGB)&quot;, 2D) = &quot;white&quot; {}\n\u00a0 \u00a0 }\n\u00a0 \u00a0 SubShader {\n\u00a0 \u00a0 \u00a0 \u00a0 Tags { &quot;RenderType&quot;=&quot;Opaque&quot; }\n\u00a0 \u00a0 \u00a0 \u00a0 LOD 200\n\u00a0 \u00a0 \u00a0 \u00a0 Pass{\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 CGPROGRAM\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 #pragma vertex vert_img\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 #pragma fragment frag\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 #include &quot;UnityCG.cginc&quot;\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 sampler2D iChannel0;\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 #define S(a, b, t) smoothstep(a, b, t)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/#define CHEAP_NORMALS\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 #define HAS_HEART\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 #define USE_POST_PROCESSING\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 float3 N13(float p) {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/ \u00a0from DAVE HOSKINS\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 float3 p3 = frac(float3(p, p, p) * float3(.1031, .11369, .13787));\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 p3 += dot(p3, p3.yzx + 19.19);\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 return frac(float3((p3.x + p3.y)*p3.z, (p3.x + p3.z)*p3.y, (p3.y + p3.z)*p3.x));\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 float4 N14(float t) {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 return frac(sin(t*float4(123., 1024., 1456., 264.))*float4(6547., 345., 8799., 1564.));\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 float N(float t) {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 return frac(sin(t*12345.564)*7658.76);\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 float Saw(float b, float t) {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 return S(0., b, t)*S(1., b, t);\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 float2 DropLayer2(float2 uv, float t) {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 float2 UV = uv;\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 uv.y += t*0.75;\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 float2 a = float2(6., 1.);\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 float2 grid = a*2.;\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 float2 id = floor(uv*grid);\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 float colShift = N(id.x);\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 uv.y += colShift;\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 id = floor(uv*grid);\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 float3 n = N13(id.x*35.2 + id.y*2376.1);\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 float2 st = frac(uv*grid) - float2(.5, 0);\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 float x = n.x - .5;\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 float y = UV.y*20.;\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 float wiggle = sin(y + sin(y));\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 x += wiggle*(.5 - abs(x))*(n.z - .5);\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 x *= .7;\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 float ti = frac(t + n.z);\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 y = (Saw(.85, ti) - .5)*.9 + .5;\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 float2 p = float2(x, y);\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 float d = length((st - p)*a.yx);\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 float mainDrop = S(.4, .0, d);\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 float r = sqrt(S(1., y, st.y));\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 float cd = abs(st.x - x);\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 float trail = S(.23*r, .15*r*r, cd);\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 float trailFront = S(-.02, .02, st.y - y);\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 trail *= trailFront*r*r;\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 y = UV.y;\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 float trail2 = S(.2*r, .0, cd);\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 float droplets = max(0., (sin(y*(1. - y)*120.) - st.y))*trail2*trailFront*n.z;\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 y = frac(y*10.) + (st.y - .5);\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 float dd = length(st - float2(x, y));\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 droplets = S(.3, 0., dd);\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 float m = mainDrop + droplets*r*trailFront;\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/m += st.x&gt;a.y*.45 || st.y&gt;a.x*.165 ? 1.2 : 0.;\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 return float2(m, trail);\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 float StaticDrops(float2 uv, float t) {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 uv *= 40.;\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 float2 id = floor(uv);\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 uv = frac(uv) - .5;\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 float3 n = N13(id.x*107.45 + id.y*3543.654);\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 float2 p = (n.xy - .5)*.7;\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 float d = length(uv - p);\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 float fade = Saw(.025, frac(t + n.z));\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 float c = S(.3, 0., d)*frac(n.z*10.)*fade;\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 return c;\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 float2 Drops(float2 uv, float t, float l0, float l1, float l2) {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 float s = StaticDrops(uv, t)*l0;\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 float2 m1 = DropLayer2(uv, t)*l1;\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 float2 m2 = DropLayer2(uv*1.85, t)*l2;\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 float c = s + m1.x + m2.x;\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 c = S(.3, 1., c);\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 return float2(c, max(m1.y*l0, m2.y*l1));\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 fixed4 frag(v2f_img i) : SV_Target{\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 float2 uv = ((i.uv * _ScreenParams.xy) - .5*_ScreenParams.xy) \/ _ScreenParams.y;\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 float2 UV = i.uv.xy;\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/float3 M = iMouse.xyz \/ iResolution.xyz;\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/ for now\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 float3 M = float3(0.0, 0.0, 0.0);\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 float T = _Time.y + M.x*2.;\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 #ifdef HAS_HEART\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 T = fmod(_Time.y, 102.);\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 T = lerp(T, M.x*102., M.z&gt;0. ? 1. : 0.);\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 #endif\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 float t = T*.2;\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/float rainAmount = iMouse.z&gt;0. ? M.y : sin(T*.05)*.3 + .7;\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/ fixed rain amount\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 float rainAmount = M.y;\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 float maxBlur = lerp(3., 6., rainAmount);\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 float minBlur = 2.;\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 float story = 0.;\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 float heart = 0.;\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 #ifdef HAS_HEART\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 story = S(0., 70., T);\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 t = min(1., T \/ 70.); \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/ remap drop time so it goes slower when it freezes\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 t = 1. - t;\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 t = (1. - t*t)*70.;\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 float zoom = lerp(.3, 1.2, story); \u00a0 \u00a0 \u00a0\/\/ slowly zoom out\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 uv *= zoom;\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 minBlur = 4. + S(.5, 1., story)*3.; \u00a0 \u00a0 \/\/ more opaque glass towards the end\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 maxBlur = 6. + S(.5, 1., story)*1.5;\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 float2 hv = uv - float2(.0, -.1); \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/ build heart\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 hv.x *= .5;\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 float s = S(110., 70., T); \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\/\/ heart gets smaller and fades towards the end\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 hv.y -= sqrt(abs(hv.x))*.5*s;\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 heart = length(hv);\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 heart = S(.4*s, .2*s, heart)*s;\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 rainAmount = heart; \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/ the rain is where the heart is\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 maxBlur -= heart; \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/ inside the heart slighly less foggy\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 uv *= 1.5; \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\/\/ zoom out a bit more\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 t *= .25;\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 #else\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 float zoom = -cos(T*.2);\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 uv *= .7 + zoom*.3;\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 #endif\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 UV = (UV - .5)*(.9 + zoom*.1) + .5;\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 float staticDrops = S(-.5, 1., rainAmount)*2.;\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 float layer1 = S(.25, .75, rainAmount);\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 float layer2 = S(.0, .5, rainAmount);\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 float2 c = Drops(uv, t, staticDrops, layer1, layer2);\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 #ifdef CHEAP_NORMALS\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 float2 n = float2(dFdx(c.x), dFdy(c.x));\/\/ cheap normals (3x cheaper, but 2 times shittier ;))\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 #else\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 float2 e = float2(.001, 0.);\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 float cx = Drops(uv + e, t, staticDrops, layer1, layer2).x;\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 float cy = Drops(uv + e.yx, t, staticDrops, layer1, layer2).x;\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 float2 n = float2(cx - c.x, cy - c.x); \u00a0 \u00a0 \u00a0\/\/ expensive normals\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 #endif\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 #ifdef HAS_HEART\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 n *= 1. - S(60., 85., T);\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 c.y *= 1. - S(80., 100., T)*.8;\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 #endif\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 float focus = lerp(maxBlur - c.y, minBlur, S(.1, .2, c.x));\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/ textureLod to tex2Dlod(ref: https:\/\/msdn.microsoft.com\/en-us\/library\/windows\/desktop\/bb509680(v=vs.85).aspx)\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/float3 col = textureLod(iChannel0, UV + n, focus).rgb;\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 float4 texCoord = float4(UV.x + n.x, UV.y + n.y, 0, focus);\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 float4 lod = tex2Dlod(iChannel0, texCoord);\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 float3 col = lod.rgb;\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 #ifdef USE_POST_PROCESSING\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 t = (T + 3.)*.5; \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\/\/ make time sync with first lightnoing\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 float colFade = sin(t*.2)*.5 + .5 + story;\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 col *= lerp(float3(1., 1., 1.), float3(.8, .9, 1.3), colFade); \u00a0\/\/ subtle color shift\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 float fade = S(0., 10., T); \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/ fade in at the start\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/float lightning = sin(t*sin(t*10.)); \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\/\/ lighting flicker\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/lightning *= pow(max(0., sin(t + sin(t))), 10.); \u00a0 \u00a0 \u00a0\/\/ lightning flash\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/col *= 1. + lightning*fade*lerp(1., .1, story*story); \/\/ composite lightning\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 col *= 1. - dot(UV -= .5, UV); \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\/\/ vignette\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 #ifdef HAS_HEART\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 col = lerp(pow(col, float3(1.2, 1.2, 1.2)), col, heart);\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 fade *= S(102., 97., T);\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 #endif\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 col *= fade; \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\/\/ composite start and end fade\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 #endif\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/col = vec3(heart);\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 return fixed4(col, 1);\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 ENDCG\n\u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 }\n\u00a0 \u00a0 FallBack &quot;Diffuse&quot;\n}<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>shader toy\u5730\u5740 1.\u9759\u6001\u96e8\u6ef4 &emsp;\u00a0&emsp;\u6240\u8c13\u9759\u6001\u96e8\u6ef4\u662f\u4f53\u79ef\u8f83\u5c0f\uff0c\u5e76\u4e0d\u4f1a\u6ed1\u843d\u7684\u6c34\u73e0\uff0c\u968f [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[38],"tags":[],"class_list":["post-1383","post","type-post","status-publish","format-standard","hentry","category-shadertoy"],"_links":{"self":[{"href":"https:\/\/www.mapleriver.cn\/index.php?rest_route=\/wp\/v2\/posts\/1383","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mapleriver.cn\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.mapleriver.cn\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.mapleriver.cn\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.mapleriver.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1383"}],"version-history":[{"count":1,"href":"https:\/\/www.mapleriver.cn\/index.php?rest_route=\/wp\/v2\/posts\/1383\/revisions"}],"predecessor-version":[{"id":1389,"href":"https:\/\/www.mapleriver.cn\/index.php?rest_route=\/wp\/v2\/posts\/1383\/revisions\/1389"}],"wp:attachment":[{"href":"https:\/\/www.mapleriver.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1383"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.mapleriver.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1383"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.mapleriver.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1383"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}