рдирдорд╕реНрддреЗ! рдореИрдВ рдпреВрдирд┐рдЯреА рдореЗрдВ рдЕрдкрдиреЗ рдЕрдиреБрднрд╡ рд▓реЗрдЦрди рд╢реЗрдбреНрд╕ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред рдЖрдЗрдП 2 рдбреА рдореЗрдВ рд╡рд┐рд╕реНрдерд╛рдкрди / рдЕрдкрд╡рд░реНрддрди рд╢реЗрдбрд░ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░реЗрдВ, рдЗрд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ (GrabPass, PerRendererData), рдФрд░ рдЬрд░реВрд░реА рд╕рдорд╕реНрдпрд╛рдУрдВ рдкрд░ рднреА рдзреНрдпрд╛рди рджреЗрдВред
рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИ, рдЬрд┐рдирдХреЗ рдкрд╛рд╕ рд╢реЗрдбреНрд╕ рдХрд╛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдЪрд╛рд░ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдЧрдИ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрди рдХреНрд╖рдорддрд╛рдУрдВ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реИрдВ рдЬреЛ рдпреВрдирд┐рдЯреА рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИрдВ, рдФрд░ рдпрд╣ рдирд╣реАрдВ рдЬрд╛рдирддреА рд╣реИрдВ рдХрд┐ рдХрд┐рд╕ рддрд░рдл рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд░рдирд╛ рд╣реИред рдЬрд╝рд░рд╛ рдЧреМрд░ рдХреАрдЬрд┐рдП, рд╢рд╛рдпрдж рдореЗрд░рд╛ рдЕрдиреБрднрд╡ рдЖрдкрдХреЛ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗред

рдпрд╣ рд╡рд╣ рдкрд░рд┐рдгрд╛рдо рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рдЯреНрд░реЗрдирд┐рдВрдЧ
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдПрдХ рд╢реЗрдбрд░ рдмрдирд╛рдПрдВ рдЬреЛ рдХреЗрд╡рд▓ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕реНрдкреНрд░рд╛рдЗрдЯ рдХреЛ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░реЗрдЧрд╛ред рд╡рд╣ рдЖрдЧреЗ рдХреЗ рдЬреЛрдбрд╝рддреЛрдбрд╝ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░рд╛ рдЖрдзрд╛рд░ рд╣реЛрдЧрд╛ред рдЗрд╕рдореЗрдВ рдХреБрдЫ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛, рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рдХреБрдЫ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рдХреБрдЫ рдЯреИрдЧ рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рдорд╛рдирдХ "рд╕реНрдкреНрд░рд╛рдЗрдЯреНрд╕-рдбрд┐рдлреЙрд▓реНрдЯ" рд╕реЗ рдЕрд▓рдЧ рд╣реЛрдЧрд╛ рдЬреЛ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред
рд╕реНрдкреНрд░рд╛рдЗрдЯ рдХреЗ рдкреНрд░рддрд┐рдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдЫрд╛рдпрд╛рджрд╛рд░ рдХреЛрдбShader "Displacement/Displacement_Wave" { Properties { [PerRendererData] _MainTex ("Main Texture", 2D) = "white" {} _Color ("Color" , Color) = (1,1,1,1) } SubShader { Tags { "RenderType" = "Transparent" "Queue" = "Transparent" } Cull Off Blend SrcAlpha OneMinusSrcAlpha Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; float4 color : COLOR; }; struct v2f { float4 vertex : SV_POSITION; float2 uv : TEXCOORD0; float4 color : COLOR; }; fixed4 _Color; sampler2D _MainTex; v2f vert (appdata v) { v2f o; o.uv = v.uv; o.color = v.color; o.vertex = UnityObjectToClipPos(v.vertex); return o; } fixed4 frag (v2f i) : SV_Target { fixed4 texColor = tex2D(_MainTex, i.uv)*i.color; return texColor; } ENDCG } } }
рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдкреНрд░рд╛рдЗрдЯрдкреГрд╖реНрдарднреВрдорд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд╛рд░рджрд░реНрд╢реА рд╣реИ, рдЬрд╛рдирдмреВрдЭрдХрд░ рдЕрдВрдзреЗрд░рд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдкрд░рд┐рдгрд╛рдореА рд╡рд░реНрдХрдкреАрд╕ред

GrabPass
рдЕрдм рд╣рдорд╛рд░рд╛ рдХрд╛рд░реНрдп рд╕реНрдХреНрд░реАрди рдкрд░ рд╡рд░реНрддрдорд╛рди рдЫрд╡рд┐ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдирд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдПрдХ рдЫрд╡рд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдФрд░
GrabPass рдкреИрд╕реЗрдЬ рд╣рдорд╛рд░реА рдорджрдж рдХрд░реЗрдЧрд╛ред рдпрд╣ рдорд╛рд░реНрдЧ
_GrabTexture рдмрдирд╛рд╡рдЯ рдореЗрдВ рд╕реНрдХреНрд░реАрди рдЫрд╡рд┐ рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░реЗрдЧрд╛ред рдмрдирд╛рд╡рдЯ рдореЗрдВ рд╡рд╣реА рд╣реЛрдЧрд╛ рдЬреЛ рдЗрд╕ рдЫрд╛рдпрд╛рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реА рд╡рд╕реНрддреБ рд╕реЗ рдкрд╣рд▓реЗ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдмрдирд╛рд╡рдЯ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдореЗрдВ рдкрд┐рдХреНрд╕реЗрд▓ рд░рдВрдЧ рдХреЛ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдХреИрди рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЕрддрд┐рд░рд┐рдХреНрдд рдмрдирд╛рд╡рдЯ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ рдЯреБрдХрдбрд╝рд╛ shader рдбреЗрдЯрд╛ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВред рдпреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдирд╣реАрдВ рд╣реИрдВ (рдорд╛рди 0 рд╕реЗ 1 рддрдХ рдХреА рд╕реАрдорд╛ рдореЗрдВ рдирд╣реАрдВ рд╣реИрдВ) рдФрд░ рдХреИрдорд░реЗ рдХреЗ рд╕реНрдерд╛рди (рдкреНрд░рдХреНрд╖реЗрдкрдг) рдореЗрдВ рдПрдХ рдмрд┐рдВрджреБ рдХреА рд╕реНрдерд┐рддрд┐ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВред
struct v2f { float4 vertex : SV_POSITION; float2 uv : float4 color : COLOR; float4 grabPos : TEXCOORD1; };
рдФрд░ рд╢реАрд░реНрд╖ рдореЗрдВ shader рдЙрдиреНрд╣реЗрдВ рднрд░реЗрдВред
o.grabPos = ComputeGrabScreenPos (o.vertex);
_GrabTexture рд╕реЗ рд░рдВрдЧ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рд╣рдо рдЧреИрд░-рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
tex2Dproj(_GrabTexture, i.grabPos)
рд▓реЗрдХрд┐рди рд╣рдо рдПрдХ рдЕрд▓рдЧ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдкрд░рд┐рдкреНрд░реЗрдХреНрд╖реНрдп рд╡рд┐рднрд╛рдЬрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдХрд░реЗрдВрдЧреЗ, рдЕрд░реНрдерд╛рддред рдЕрдиреНрдп рд╕рднреА рдХреЛ w- рдШрдЯрдХ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдирд╛ред
tex2D(_GrabTexture, i.grabPos.xy/i.grabPos.w)
w рдШрдЯрдХрдПрдХ рдбрдмреНрд▓реНрдпреВ-рдШрдЯрдХ рдореЗрдВ рд╡рд┐рднрд╛рдЬрди рдХреЗрд╡рд▓ рдкрд░рд┐рдкреНрд░реЗрдХреНрд╖реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдСрд░реНрдереЛрдЧреНрд░рд╛рдлрд┐рдХ рдкреНрд░рдХреНрд╖реЗрдкрдг рдореЗрдВ рдпрд╣ рд╣рдореЗрд╢рд╛ 1 рд╣реЛрдЧрд╛ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдбрдмреНрд▓реНрдпреВ рджреВрд░реА рдХреЗ рдореВрд▓реНрдп рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ, рдХреИрдорд░реЗ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рдЧрд╣рд░рд╛рдИ рдирд╣реАрдВ рд╣реИ - z , рдЬрд┐рд╕рдХрд╛ рдорд╛рди 0 рд╕реЗ 1 рддрдХ рдХреА рд╕реАрдорд╛ рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЧрд╣рд░рд╛рдИ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдПрдХ рдЕрд▓рдЧ рд╡рд┐рд╖рдп рдХреЗ рдпреЛрдЧреНрдп рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЕрдкрдиреА рдЫрд╛рдпрд╛ рдореЗрдВ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдВрдЧреЗред
рдкрд░рд┐рдкреНрд░реЗрдХреНрд╖реНрдп рд╡рд┐рднрд╛рдЬрди рдХреЛ рд╢реАрд░реНрд╖ рдХреЗ рд╢реЗрдбрд░ рдореЗрдВ рднреА рдкреНрд░рджрд░реНрд╢рди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рддреИрдпрд╛рд░ рдбреЗрдЯрд╛ рдХреЛ рдЯреБрдХрдбрд╝реЗ рдЯреБрдХрдбрд╝реЗ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
v2f vert (appdata v) { v2f o; o.uv = v.uv; o.color = v.color; o.vertex = UnityObjectToClipPos(v.vertex); o.grabPos = ComputeScreenPos (o.vertex); o.grabPos /= o.grabPos.w; return o; }
рдХреНрд░рдорд╢рдГ рдПрдХ рдЯреБрдХрдбрд╝рд╛ shader рдЬреЛрдбрд╝реЗрдВред
fixed4 frag (v2f i) : SV_Target { fixed4 = grabColor = tex2d(_GrabTexture, i.grabPos.xy); fixed4 texColor = tex2D(_MainTex, i.uv)*i.color; return grabColor; }
рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдорд┐рд╢реНрд░рдг рдореЛрдб рдХреЛ рдмрдВрдж рдХрд░реЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдм рд╣рдо рдЕрдкрдиреЗ рд╕рдореНрдорд┐рд╢реНрд░рдг рдореЛрдб рдХреЛ рдЯреБрдХрдбрд╝реЗ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЗ рдЕрдВрджрд░ рд▓рд╛рдЧреВ рдХрд░ рд░рд╣реЗ рд╣реИрдВред
рдФрд░
GrabPass рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ
рджреЗрдЦреЗрдВ ред

рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реБрдЖ рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдирд╣реАрдВ рд╣реИред рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдорд╛рдореВрд▓реА рдмрджрд▓рд╛рд╡ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддреЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдо рдмрдирд╛рд╡рдЯ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдореЗрдВ рдЪрд░ рдХреЗ рдореВрд▓реНрдп рдХреЛ рдЬреЛрдбрд╝ рджреЗрдВрдЧреЗред рддрд╛рдХрд┐ рд╣рдо рдЪрд░ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд╕рдХреЗрдВ, рдПрдХ рдирдпрд╛
_DisplacementPower рдЧреБрдг рдЬреЛрдбрд╝реЗрдВред
Properties { [PerRendererData] _MainTex ("Main Texture", 2D) = "white" {} _Color ("Color" , Color) = (1,1,1,1) _DisplacementPower ("Displacement Power" , Float) = 0 } SubShader { Pass { ... float _DisplacementPower; ... } }
рдФрд░ рдлрд┐рд░ рд╕реЗ, рдЯреБрдХрдбрд╝рд╛ shader рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░реЗрдВред
fixed4 grabColor = tex2d(_GrabTexture, i.grabPos.xy + _DisplaccementPower)
рдУрдк рд╣реЙрдк рдФрд░ рдкрд░рд┐рдгрд╛рдо! рдПрдХ рдмрджрд▓рд╛рд╡ рдХреЗ рд╕рд╛рде рдЫрд╡рд┐ред

рдПрдХ рд╕рдлрд▓ рдмрджрд▓рд╛рд╡ рдХреЗ рдмрд╛рдж, рдЖрдк рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╡рд┐рдХреГрддрд┐ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо рдкреВрд░реНрд╡-рддреИрдпрд╛рд░ рдмрдирд╛рд╡рдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдмрд┐рдВрджреБ рдкрд░ рд╡рд┐рд╕реНрдерд╛рдкрди рдмрд▓ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдЧрд╛ред X рдЕрдХреНрд╖ рдкрд░ рдСрдлрд╕реЗрдЯ рдорд╛рди рдХреЗ рд▓рд┐рдП рд▓рд╛рд▓ рд░рдВрдЧ, рдФрд░ y рдЕрдХреНрд╖ рдкрд░ рд╣рд░рд╛ред
рд╡рд┐рд░реВрдкрдг рдХреЗ рд▓рд┐рдП рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдП рдЧрдП рдмрдирд╛рд╡рдЯ рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдмрдирд╛рд╡рдЯ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдИ рд╕рдВрдкрддреНрддрд┐ рдЬреЛрдбрд╝реЗрдВред
_DisplacementTex ("Displacement Texture", 2D) = "white" {}
рдФрд░ рдПрдХ рдЪрд░ред
sampler2D _DisplacementTex;
рдЯреБрдХрдбрд╝реЗ рдХреА рдЫрд╛рдпрд╛ рдореЗрдВ рд╣рдо рдмрдирд╛рд╡рдЯ рд╕реЗ рдСрдлрд╕реЗрдЯ рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдмрдирд╛рд╡рдЯ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред
fixed4 displPos = tex2D(_DisplacementTex, i.uv)
рдЕрдм,
_DisplacementPower рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдмрджрд▓рддреЗ рд╣реБрдП, рд╣рдо рдХреЗрд╡рд▓ рдореВрд▓ рдЫрд╡рд┐ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рд╡рд┐рдХреГрдд рдХрд░рддреЗ рд╣реИрдВред

рдУрд╡рд░рд▓реЗ
рдЕрдм рд╕реНрдХреНрд░реАрди рдкрд░ рдХреЗрд╡рд▓ рдЕрдВрддрд░рд┐рдХреНрд╖ рдХрд╛ рд╡рд┐рд░реВрдкрдг рд╣реИ, рдФрд░ рд╕реНрдкреНрд░рд╛рдЗрдЯ, рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдмрд╣реБрдд рд╢реБрд░реБрдЖрдд рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдерд╛, рдЕрдиреБрдкрд╕реНрдерд┐рдд рд╣реИред рд╣рдо рдЗрд╕реЗ рдЙрд╕рдХреА рдЬрдЧрд╣ рдкрд░ рд▓реМрдЯрд╛ рджреЗрдВрдЧреЗред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд░рдВрдЧреЛрдВ рдХреЗ рдПрдХ рдХрдард┐рди рдорд┐рд╢реНрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдХреБрдЫ рдФрд░ рд▓реЗрдВ, рдЬреИрд╕реЗ рдХрд┐ рдУрд╡рд░рд▓реЗ рдмреНрд▓реЗрдВрдбрд┐рдВрдЧ рдореЛрдбред рдЗрд╕рдХрд╛ рд╕реВрддреНрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:

рдЬрд╣рд╛рдВ S рдореВрд▓ рдЫрд╡рд┐ рд╣реИ, C рд╕реБрдзрд╛рд░рд╛рддреНрдордХ рд╣реИ, рдЕрд░реНрдерд╛рдд рд╣рдорд╛рд░рд╛ рд╕реНрдкреНрд░рд╛рдЗрдЯ, R рдкрд░рд┐рдгрд╛рдо рд╣реИред
рдЗрд╕ рдлреЙрд░реНрдореВрд▓реЗ рдХреЛ рд╣рдорд╛рд░реЗ shader рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВред
fixed4 color = grabColor < 0.5 ? 2*grabColor*texColor : 1-2*(1-texColor)*(1-grabColor);
рдПрдХ shader рдореЗрдВ рд╕рд╢рд░реНрдд рдСрдкрд░реЗрдЯрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХ рдмрд▓реНрдХрд┐ рднреНрд░рд╛рдордХ рд╡рд┐рд╖рдп рд╣реИред рдмрд╣реБрдд рдХреБрдЫ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдФрд░ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдПрдкреАрдЖрдИ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рд╕рд╢рд░реНрдд рд╡рдХреНрддрд╡реНрдп рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред рд▓реЗрдХрд┐рди рдпрд╣ рд╣рдореЗрд╢рд╛ рдХрдордмреИрдХ рдХрд░рдиреЗ рд▓рд╛рдпрдХ рд╣реЛрддрд╛ рд╣реИред рд╕рд╢рд░реНрдд рдСрдкрд░реЗрдЯрд░ рдХреЛ рдЧрдгрд┐рдд рдФрд░ рдЙрдкрд▓рдмреНрдз рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ
c = step ( y, x); r = c * a + (1 - c) * b;
рдХрджрдо рд╕рдорд╛рд░реЛрд╣рдЪрд░рдг рдлрд╝рдВрдХреНрд╢рди 1 рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧрд╛ рдпрджрд┐ x y рд╕реЗ рдЕрдзрд┐рдХ рдпрд╛ рдмрд░рд╛рдмрд░ рд╣реИред рдФрд░ 0 рдЕрдЧрд░ x y рд╕реЗ рдХрдо рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ x = 1, рдФрд░ y = 0.5 рд╣реИ, рддреЛ c рдХрд╛ рдкрд░рд┐рдгрд╛рдо 1. рд╣реЛрдЧрд╛ рдФрд░ рдирд┐рдореНрди рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреА рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛
рдЖрд░ = 1 * рдП + 0 * рдмреА
рдХреНрдпреЛрдВрдХрд┐ 0 рд╕реЗ рдЧреБрдгрд╛ рдХрд░рдирд╛ 0 рджреЗрддрд╛ рд╣реИ, рддреЛ рдкрд░рд┐рдгрд╛рдо рдХреЗрд╡рд▓ a рдХрд╛ рдорд╛рди рд╣реЛрдЧрд╛ред
рдЕрдиреНрдпрдерд╛, рдпрджрд┐ c 0 рд╣реИ,
r = 0 * a + 1 * b
рдФрд░ рдЕрдВрддрд┐рдо рдкрд░рд┐рдгрд╛рдо рдмреА рд╣реЛрдЧрд╛ред
рдУрд╡рд░рд▓реЗ рдореЛрдб рдХреЗ рд▓рд┐рдП рд░рдВрдЧ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦреЗрдВред
fixed s = step(grabColor, 0.5); fixed4 color = s * (2 * grabColor * texColor) + (1 - s) * (1 - 2 * (1 - texColor) * (1 - grabColor));
рд╕реНрдкреНрд░рд╛рдЗрдЯ рдХреА рдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рджреЛ рд░рдВрдЧреЛрдВ рдХреЗ рдмреАрдЪ рд░реИрдЦрд┐рдХ рдкреНрд░рдХреНрд╖реЗрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
color = lerp(grabColor, color ,texColor.a);
рдкреВрд░реНрдг рдЯреБрдХрдбрд╝рд╛ shader рдХреЛрдбред
fixed4 frag (v2f i) : SV_Target { fixed4 displPos = tex2D(_DisplacementTex, i.uv); float2 offset = (displPos.xy*2 - 1) * _DisplacementPower * displPos.a; fixed4 texColor = tex2D(_MainTex, i.uv + offset)*i.color; fixed4 grabColor = tex2D (_GrabTexture, i.grabPos.xy + offset); fixed s = step(grabColor, 0.5); fixed4 color = s * (2 * grabColor * texColor) + (1 - s) * (1 - 2 * (1 - texColor) * (1 - grabColor)); color = lerp(grabColor, color ,texColor.a); return color; }
рдФрд░ рд╣рдорд╛рд░реЗ рдХрд╛рдо рдХрд╛ рдирддреАрдЬрд╛ рд╣реИред

GrabPass рдлрд╝реАрдЪрд░
рдпрд╣ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдХрд┐
GrabPass рдкрд╛рд╕
{} рд╕реНрдХреНрд░реАрди рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ
_GrabTexture рдмрдирд╛рд╡рдЯ рдореЗрдВ рдХреИрдкреНрдЪрд░ рдХрд░рддрд╛ рд╣реИред рдЙрд╕реА рд╕рдордп, рд╣рд░ рдмрд╛рд░ рдЗрд╕ рдорд╛рд░реНрдЧ рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдмрдирд╛рд╡рдЯ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдмрдирд╛рд╡рдЯ рдХреЗ рдирд╛рдо рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдХреЗ рдирд┐рд░рдВрддрд░ рдЕрджреНрдпрддрди рд╕реЗ рдмрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕реНрдХреНрд░реАрди рдХреА рд╕рд╛рдордЧреНрд░реА рдХреИрдкреНрдЪрд░ рдХреА рдЬрд╛рдПрдЧреАред
GrabPass{"_DisplacementGrabTexture"}
рдЕрдм рдмрдирд╛рд╡рдЯ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЗрд╡рд▓ GrabPass рдкрд╛рд╕ рдкреНрд░рддрд┐ рдлреНрд░реЗрдо рдХреЗ рдкрд╣рд▓реЗ рдХреЙрд▓ рдкрд░ рдЕрдкрдбреЗрдЯ рдХреА рдЬрд╛рдПрдЧреАред рдпрд╣ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдмрдЪрд╛рддрд╛ рд╣реИ рдЕрдЧрд░
GrabPass {} рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ
рдмрд╣реБрдд рд╕рд╛рд░реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рджреЛ рд╡рд╕реНрддреБрдПрдВ рдУрд╡рд░рд▓реИрдк рд╣реЛрддреА рд╣реИрдВ, рддреЛ рдХрд▓рд╛рдХреГрддрд┐рдпрд╛рдВ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реЛрдВрдЧреА, рдХреНрдпреЛрдВрдХрд┐ рджреЛрдиреЛрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдПрдХ рд╣реА рдЫрд╡рд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
GrabPass {"_ DisplacementGrabTexture"} рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред

GrabPass {} рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред

рдПрдиреАрдореЗрд╢рди
рдЕрдм рд╣рдорд╛рд░реЗ рдкреНрд░рднрд╛рд╡ рдХреЛ рдЪреЗрддрди рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рдЖ рдЧрдпрд╛ рд╣реИред рдзрдорд╛рдХреЗ рдХреА рд▓рд╣рд░ рдмрдврд╝рдиреЗ рдкрд░ рд╣рдо рд╡рд┐рд░реВрдкрдг рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдХрдо рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рд╕рд╛рдордЧреНрд░реА рдХреЗ рдЧреБрдгреЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдПрдиреАрдореЗрд╢рди рдХреЗ рд▓рд┐рдП рд╕реНрдХреНрд░рд┐рдкреНрдЯ public class Wave : MonoBehaviour { private float _elapsedTime; private SpriteRenderer _renderer; public float Duration; [Space] public AnimationCurve ScaleProgress; public Vector3 ScalePower; [Space] public AnimationCurve PropertyProgress; public float PropertyPower; [Space] public AnimationCurve AlphaProgress; private void Start() { _renderer = GetComponent<SpriteRenderer>(); } private void OnEnable() { _elapsedTime = 0f; } void Update() { if (_elapsedTime < Duration) { var progress = _elapsedTime / Duration; var scale = ScaleProgress.Evaluate(progress) * ScalePower; var property = PropertyProgress.Evaluate(progress) * PropertyPower; var alpha = AlphaProgress.Evaluate(progress); transform.localScale = scale; _renderer.material.SetFloat("_DisplacementPower", property); var color = _renderer.color; color.a = alpha; _renderer.color = color; _elapsedTime += Time.deltaTime; } else { _elapsedTime = 0; } } }
рдФрд░ рдЗрд╕рдХреА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдПрдиреАрдореЗрд╢рди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИред

PerRendererData
рдиреАрдЪреЗ рдХреА рд░реЗрдЦрд╛ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВред
_renderer.material.SetFloat("_DisplacementPower", property);
рдпрд╣рд╛рдВ рд╣рдо рдХреЗрд╡рд▓ рд╕рд╛рдордЧреНрд░реА рдХреЗ рдЧреБрдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдирд╣реАрдВ рдмрджрд▓ рд░рд╣реЗ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рд╕реНрд░реЛрдд рд╕рд╛рдордЧреНрд░реА (рдХреЗрд╡рд▓ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЗ рдкрд╣рд▓реЗ рдХреЙрд▓ рдкрд░) рдХреА рдПрдХ рдкреНрд░рддрд┐ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдпрд╣ рдХрд╛рдлреА рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╡рд┐рдХрд▓реНрдк рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдордВрдЪ рдкрд░ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╣рдЬрд╛рд░, рддреЛ рдмрд╣реБрдд рд╕рд╛рд░реА рдкреНрд░рддрд┐рдпрд╛рдВ рдмрдирд╛рдиреЗ рд╕реЗ рдХреБрдЫ рднреА рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдПрдХ рдмреЗрд╣рддрд░ рд╡рд┐рдХрд▓реНрдк рд╣реИ - рдпрд╣ shader рдореЗрдВ
[PerRendererData] рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ, рдФрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ
MaterialPropertyBlock рдСрдмреНрдЬреЗрдХреНрдЯред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, shader рдореЗрдВ
_DisplacementPower рдЧреБрдг рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдЬреЛрдбрд╝реЗрдВред
[PerRendererData] _DisplacementPower ("Displacement Power" , Range(-.1,.1)) = 0
рдЙрд╕рдХреЗ рдмрд╛рдж, рд╕рдВрдкрддреНрддрд┐ рдЕрдм рдирд┐рд░реАрдХреНрд╖рдХ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдирд╣реАрдВ рд╣реЛрдЧреА, рдХреНрдпреЛрдВрдХрд┐ рдЕрдм рдпрд╣ рдкреНрд░рддреНрдпреЗрдХ рд╡рд╕реНрддреБ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реИ, рдЬреЛ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдЧрд╛ред

рд╣рдо рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрд░ рд▓реМрдЯрддреЗ рд╣реИрдВ рдФрд░ рдЙрд╕рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХрд░рддреЗ рд╣реИрдВред
private MaterialPropertyBlock _propertyBlock; private void Start() { _renderer = GetComponent<SpriteRenderer>(); _propertyBlock = new MaterialPropertyBlock(); } void Update() { ...
рдЕрдм, рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо
рд╕рд╛рдордЧреНрд░реА рдХреА рдкреНрд░рддрд┐рдпрд╛рдВ рдмрдирд╛рдП рдмрд┐рдирд╛ рдЕрдкрдиреА рд╡рд╕реНрддреБ рдХреЗ
MaterialPropertyBlock рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВрдЧреЗред
SpriteRenderer рдХреЗ рдмрд╛рд░реЗ рдореЗрдВрдЖрдЗрдП рдЗрд╕ рд░реЗрдЦрд╛ рдХреЛ shader рдореЗрдВ рджреЗрдЦреЗрдВред
[PerRendererData] _MainTex ("Main Texture", 2D) = "white" {}
рд╕реНрдкреНрд░рд╛рдЗрдЯ рд░реЗрдВрдбрд░рд░ рд╕реНрдкреНрд░рд╛рдЗрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдЗрд╕реА рддрд░рд╣
рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ ред рдпрд╣
MaterialPropertyBlock рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ
рдЕрдкрдиреЗ рдореВрд▓реНрдп рдХреЗ рд▓рд┐рдП
_MainTex рд╕рдВрдкрддреНрддрд┐ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдирд┐рд░реАрдХреНрд╖рдХ рдореЗрдВ,
_MainTex рд╕рдВрдкрддреНрддрд┐ рдХреЛ рд╕рд╛рдордЧреНрд░реА рдХреЗ рд▓рд┐рдП рдкреНрд░рджрд░реНрд╢рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░
SpriteRenderer рдШрдЯрдХ рдореЗрдВ рд╣рдо рдЙрд╕ рдмрдирд╛рд╡рдЯ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХреА рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕реА рд╕рдордп, рдордВрдЪ рдкрд░ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕реНрдкреНрд░рд╛рдЗрдЯ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдирдХреЗ рдкреНрд░рддрд┐рдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рд╕рд╛рдордЧреНрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ (рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рдирд╣реАрдВ рдмрджрд▓рддреЗ рд╣реИрдВ)ред
PerRendererData рдлрд╝реАрдЪрд░
рдЖрдк рд░реЗрдВрдбрд░ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд▓рдЧрднрдЧ рд╕рднреА рдШрдЯрдХреЛрдВ рд╕реЗ
MaterialPropertyBlock рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
SpriteRenderer ,
ParticleRenderer ,
MeshRenderer рдФрд░ рдЕрдиреНрдп
Renderer рдШрдЯрдХред рд▓реЗрдХрд┐рди рд╣рдореЗрд╢рд╛ рдПрдХ рдЕрдкрд╡рд╛рдж рд╣реЛрддрд╛ рд╣реИ, рдпрд╣
рдХреИрдирд╡рд╕ рд░реЗрдВрдбрд░рд░ рд╣реИ ред рдЗрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЧреБрдгреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдФрд░ рдмрджрд▓рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдЖрдк UI рдШрдЯрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ 2 рдбреА рдЧреЗрдо рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рд╢реЗрдбрд░реНрд╕ рд▓рд┐рдЦрддреЗ рд╕рдордп рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░реЗрдВрдЧреЗред
рд░реЛрдЯреЗрд╢рди
рдПрдХ рдЕрдкреНрд░рд┐рдп рдкреНрд░рднрд╛рд╡ рддрдм рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдЫрд╡рд┐ рдХреЛ рдШреБрдорд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рдЧреЛрд▓ рд▓рд╣рд░ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдкрд░, рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИред
рдореЛрдбрд╝ (90 рдбрд┐рдЧреНрд░реА) рдкрд░ рд╕рд╣реА рддрд░рдВрдЧ рдПрдХ рдФрд░ рд╡рд┐рдХреГрддрд┐ рджреЗрддреА рд╣реИред

рд▓рд╛рд▓ рдмрдирд╛рд╡рдЯ рдореЗрдВ рдПрдХ рд╣реА рдмрд┐рдВрджреБ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╡реИрдХреНрдЯрд░ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рдмрдирд╛рд╡рдЯ рдХреЗ рдПрдХ рдЕрд▓рдЧ рд░реЛрдЯреЗрд╢рди рдХреЗ рд╕рд╛рдеред рдСрдлрд╝рд╕реЗрдЯ рдорд╛рди рд╕рдорд╛рди рд░рд╣рддрд╛ рд╣реИ рдФрд░ рд░реЛрдЯреЗрд╢рди рдХреЗ рд▓рд┐рдП рдЦрд╛рддрд╛ рдирд╣реАрдВ рд╣реИред
рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо
unity_ObjectToWorld рдкрд░рд┐рд╡рд░реНрддрди
рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдпрд╣ рд╣рдорд╛рд░реЗ рд╡реЗрдХреНрдЯрд░ рдХреЛ рд╕реНрдерд╛рдиреАрдп рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рд╕реЗ рджреБрдирд┐рдпрд╛ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рддрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ред
float2 offset = (displPos.xy*2 - 1) * _DisplacementPower * displPos.a; offset = mul( unity_ObjectToWorld, offset);
рд▓реЗрдХрд┐рди рдореИрдЯреНрд░рд┐рдХреНрд╕ рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдкреИрдорд╛рдиреЗ рдкрд░ рдбреЗрдЯрд╛ рднреА рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╡рд┐рд░реВрдкрдг рдХреА рддрд╛рдХрдд рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╕рдордп, рд╣рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдкреИрдорд╛рдиреЗ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред
_propertyBlock.SetFloat("_DisplacementPower", property/transform.localScale.x);
рджрд╛рд╣рд┐рдиреА рд▓рд╣рд░ рдХреЛ рднреА 90 рдбрд┐рдЧреНрд░реА рдШреБрдорд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд┐рд░реВрдкрдг рдЕрдм рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИред

рдХреНрд▓рд┐рдк
рд╣рдорд╛рд░реА рдмрдирд╛рд╡рдЯ рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рдкрд╛рд░рджрд░реНрд╢реА рдкрд┐рдХреНрд╕реЗрд▓ рд╣реИрдВ (рд╡рд┐рд╢реЗрд╖рдХрд░ рдпрджрд┐ рд╣рдо
Rect mesh рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ)ред рд╢реЗрдбрд░ рдЙрдиреНрд╣реЗрдВ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЕрдирд╛рд╡рд╢реНрдпрдХ рдЧрдгрдирд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВрдЧреЗред рд╣рдо
рдХреНрд▓рд┐рдк (x) рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд╛рд░рджрд░реНрд╢реА рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдмрд╛рдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдЗрд╕рдореЗрдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рдкреИрд░рд╛рдореАрдЯрд░ рд╢реВрдиреНрдп рд╕реЗ рдХрдо рд╣реИ, рддреЛ рд╢реЗрдбрд░ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рдЕрд▓реНрдлрд╛ рдорд╛рди 0 рд╕реЗ рдХрдо рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЙрд╕рд╕реЗ рдПрдХ рдЫреЛрдЯрд╛ рдореВрд▓реНрдп рдШрдЯрд╛рдПрдВрдЧреЗред рдЗрд╕реЗ рдЧреБрдгреЛрдВ (
рдХрдЯрдЖрдЙрдЯ ) рдореЗрдВ рднреА рдбрд╛рд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЫрд╡рд┐ рдХреЗ рдкрд╛рд░рджрд░реНрд╢реА рднрд╛рдЧреЛрдВ рдХреЛ рдХрд╛рдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдкреИрд░рд╛рдореАрдЯрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдмрд╕ рд╕рдВрдЦреНрдпрд╛
0.01 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
рдкреВрд░реНрдг рдЯреБрдХрдбрд╝рд╛ shader рдХреЛрдбред
fixed4 frag (v2f i) : SV_Target { fixed4 displPos = tex2D(_DisplacementTex, i.uv); float2 offset = (displPos.xy * 2 - 1) * _DisplacementPower * displPos.a; offset = mul( unity_ObjectToWorld,offset); fixed4 texColor = tex2D(_MainTex, i.uv + offset)*i.color; clip(texColor.a - 0.01); fixed4 grabColor = tex2D (_GrabTexture, i.grabPos.xy + offset); fixed s = step(grabColor, 0.5); fixed4 color = s * 2 * grabColor * texColor + (1 - s) * (1 - 2 * (1 - texColor) * (1 - grabColor)); color = lerp(grabColor, color ,texColor.a); return color; }
рдкреБрдирд╢реНрдЪ: рд╢реЗрдбрд░ рдФрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдХреЛрдб
рдЧрд┐рдЯ рдХреА рдПрдХ
рдХрдбрд╝реА рд╣реИ ред рд╡рд┐рд░реВрдкрдг рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдПрдХ рдЫреЛрдЯрд╛ рдмрдирд╛рд╡рдЯ рдЬрдирд░реЗрдЯрд░ рднреА рд╣реИред рдХреБрд░рд╕реА рдХреЗ рд╕рд╛рде рдХреНрд░рд┐рд╕реНрдЯрд▓ рд╕рдВрдкрддреНрддрд┐ - 2 рдбреА рдЧреЗрдо рдХрд┐рдЯ рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред