рд╡рд┐рдШрдЯрди рд╢реЗрдбреНрд╕ рдФрд░ рд╡рд┐рд╢реНрд╡ рдЕрдиреНрд╡реЗрд╖рдг

рднрд╛рдЧ 1: рд╡рд┐рдШрдЯрди рд╢реИрдбрд░


рднрдВрдЧ shader рдПрдХ рд╕реБрдВрджрд░ рдкреНрд░рднрд╛рд╡ рджреЗрддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕реЗ рдмрдирд╛рдирд╛ рдФрд░ рд╕рдордЭрдирд╛ рдЖрд╕рд╛рди рд╣реИ; рдЖрдЬ рд╣рдо рдЗрд╕реЗ Unity Shader Graph рдореЗрдВ рдмрдирд╛рдПрдВрдЧреЗ , рдФрд░ HLSL рдкрд░ рднреА рд▓рд┐рдЦреЗрдВрдЧреЗред

рдпрд╣рд╛рдБ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдХрд┐ рд╣рдо рдХреНрдпрд╛ рдмрдирд╛рдПрдВрдЧреЗ:



рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ


рдПрдХ рднрдВрдЧ shader рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ "Shader рдЧреНрд░рд╛рдлрд╝" shader рдореЗрдВ AlphaClipThreshold рдорд╛рди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдпрд╛ рдХреНрд▓рд┐рдк рдирд╛рдордХ HLSL рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ, рд╣рдо shader рдХреЛ рдмрдирд╛рд╡рдЯ рдФрд░ рдореВрд▓реНрдп рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкрд┐рдХреНрд╕реЗрд▓ рдХреЛ рд░реЗрдВрдбрд░ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддреЗ рд╣реИрдВ ред рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЬрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: рд╕рдлреЗрдж рднрд╛рдЧ рддреЗрдЬреА рд╕реЗ рдШреБрд▓рддреЗ рд╣реИрдВ ред

рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдмрдирд╛рд╡рдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ:


рдЖрдк рдЕрдкрдиреА рдЦреБрдж рдХреА - рд╕реАрдзреА рд░реЗрдЦрд╛рдПрдВ, рддреНрд░рд┐рдХреЛрдг рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреБрдЫ рднреА! рдмрд╕ рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рд╕рдлреЗрдж рд╣рд┐рд╕реНрд╕реЗ рддреЗрдЬреА рд╕реЗ рдШреБрд▓рддреЗ рд╣реИрдВ ред

рдореИрдВрдиреЗ рдпрд╣ рдмрдирд╛рд╡рдЯ рдлрд╝реЛрдЯреЛрд╢реЙрдк рдореЗрдВ рдХреНрд▓рд╛рдЙрдб рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдИ рдереАред

рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рдЖрдк рдХреЗрд╡рд▓ Shader рдЧреНрд░рд╛рдлрд╝ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ рдФрд░ рдЖрдк HLSL рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ, рддрдм рднреА рдореИрдВ рдЗрд╕ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рдкрдврд╝рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рдордЭрдиреЗ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реИ рдХрд┐ рдпреВрдирд┐рдЯреА Shader рдЧреНрд░рд╛рдлрд╝ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред



HLSL


рдПрдЪрдПрд▓рдПрд╕рдПрд▓ рдореЗрдВ, рд╣рдо рдХреНрд▓рд┐рдк (x) рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдХреНрд▓рд┐рдк (x) рдлрд╝рдВрдХреНрд╢рди рд╕рднреА рдкрд┐рдХреНрд╕реЗрд▓ рдХреЛ рд╢реВрдиреНрдп рд╕реЗ рдХрдо рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рддрд╛ рд╣реИ ред рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рд╣рдо рдХреНрд▓рд┐рдк (-1) рдХрд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдпрдХреАрди рд╣реИ рдХрд┐ рд╢реЗрдбрд░ рдХрднреА рднреА рдЗрд╕ рдкрд┐рдХреНрд╕реЗрд▓ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рдЖрдк Microsoft рдбреЙрдХреНрд╕ рдореЗрдВ рдХреНрд▓рд┐рдк рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред

рдЧреБрдг


Shader рдХреЛ рджреЛ рдЧреБрдгреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, Dissolve рдмрдирд╛рд╡рдЯ рдФрд░ рд░рд╛рд╢рд┐ (рдЬреЛ рд╕рдВрдкреВрд░реНрдг рдирд┐рд╖реНрдкрд╛рджрди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдЧрд╛)ред рдЕрдиреНрдп рдЧреБрдгреЛрдВ рдФрд░ рдЪрд░реЛрдВ рдХреЗ рд╕рд╛рде, рдЖрдк рдЙрдиреНрд╣реЗрдВ рдЕрдкрдиреА рдкрд╕рдВрдж рдХреА рдЪреАрдЬрд╝ рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВред

Properties { //Your other properties //[...] //Dissolve shader properties _DissolveTexture("Dissolve Texture", 2D) = "white" {} _Amount("Amount", Range(0,1)) = 0 } 

CGPROGRAM SubShader (рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдЪрд░ рдШреЛрд╖рд┐рдд) рдХреЗ рдмрд╛рдж рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЬреЛрдбрд╝рдирд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ:

 sampler2D _DissolveTexture; half _Amount; 

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдордд рднреВрд▓рдирд╛ред рдЙрдирдХреЗ рдирд╛рдо рдЧреБрдг рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдирд╛рдореЛрдВ рд╕реЗ рдореЗрд▓ рдЦрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╕рдорд╛рд░реЛрд╣


рд╣рдо рд╡рд┐рдШрдЯрди рдХреА рдмрдирд╛рд╡рдЯ рдХрд╛ рдирдореВрдирд╛ рдФрд░ рд▓рд╛рд▓ рдХрд╛ рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдХреЗ рднреВрддрд▓ рдпрд╛ рд╡рд┐рдЦрдВрдбрди рдХрд╛рд░реНрдп рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред PS рд╣рдорд╛рд░реА рдмрдирд╛рд╡рдЯ рдЧреНрд░реЗрд╕реНрдХреЗрд▓ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИ, рдЕрд░реНрдерд╛рдд, R , G рдФрд░ B рдХреЗ рдореВрд▓реНрдп рд╕рдорд╛рди рд╣реИрдВ, рдФрд░ рдЖрдк рдЙрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдХреЛ рднреА рдЪреБрди рд╕рдХрддреЗ рд╣реИрдВ ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рдлреЗрдж (1,1,1) рд╣реИ , рдХрд╛рд▓рд╛ рд╣реИ (0,0,0) ред

рдореЗрд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдореИрдВ рдПрдХ рд╕рддрд╣ shader рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ:

 void surf (Input IN, inout SurfaceOutputStandard o) { half dissolve_value = tex2D(_DissolveTexture, IN.uv_MainTex).r; //Get how much we have to dissolve based on our dissolve texture clip(dissolve_value - _Amount); //Dissolve! //Your shader body, you can set the Albedo etc. //[...] } 

рдФрд░ рдпрд╣ рдмрд╛рдд рд╣реИ! рд╣рдо рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдХрд┐рд╕реА рднреА рдореМрдЬреВрджрд╛ shader рдкрд░ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдПрдХ рд╡рд┐рдШрдЯрди shader рдореЗрдВ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ!

рдпрд╣рд╛рдБ рджреЛ рдЗрдВрдЬрдиреЛрдВ рдореЗрдВ рд╡рд┐рдШрдЯрд┐рдд рд╢реИрдбрд░ рдореЗрдВ рдмрджрд▓ рдЧрдпрд╛, рдПрдХрддрд╛ рдЗрдВрдЬрди рдХрд╛ рдорд╛рдирдХ рднреВрддрд▓ рд╢реЗрдбрд░ рд╣реИ:

 Shader "Custom/DissolveSurface" { Properties { _Color ("Color", Color) = (1,1,1,1) _MainTex ("Albedo (RGB)", 2D) = "white" {} _Glossiness ("Smoothness", Range(0,1)) = 0.5 _Metallic ("Metallic", Range(0,1)) = 0.0 //Dissolve properties _DissolveTexture("Dissolve Texutre", 2D) = "white" {} _Amount("Amount", Range(0,1)) = 0 } SubShader { Tags { "RenderType"="Opaque" } LOD 200 Cull Off //Fast way to turn your material double-sided CGPROGRAM #pragma surface surf Standard fullforwardshadows #pragma target 3.0 sampler2D _MainTex; struct Input { float2 uv_MainTex; }; half _Glossiness; half _Metallic; fixed4 _Color; //Dissolve properties sampler2D _DissolveTexture; half _Amount; void surf (Input IN, inout SurfaceOutputStandard o) { //Dissolve function half dissolve_value = tex2D(_DissolveTexture, IN.uv_MainTex).r; clip(dissolve_value - _Amount); //Basic shader function fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color; o.Albedo = c.rgb; o.Metallic = _Metallic; o.Smoothness = _Glossiness; o.Alpha = ca; } ENDCG } FallBack "Diffuse" } 



рдЫрд╛рдпрд╛рджрд╛рд░ рдЧреНрд░рд╛рдл


рдЕрдЧрд░ рд╣рдореЗрдВ рдПрдХрддрд╛ рд╢реЗрдбрд░ рдЧреНрд░рд╛рдл рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕ рдкреНрд░рднрд╛рд╡ рдХреЛ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдЕрд▓реНрдлрд╛рдХреНрд▓рд┐рдкрдЯреНрд░реЗрд╢реЛрд▓реНрдб рд╡реИрд▓реНрдпреВ (рдЬреЛ рдПрдЪрдПрд▓рдПрд╕рдПрд▓ рд╕реЗ рдХреНрд▓рд┐рдк (x) рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрд▓рдЧ рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдореИрдВрдиреЗ рдПрдХ PBR shader рдмрдирд╛рдпрд╛ред

AlphaClipThreshold рдлрд╝рдВрдХреНрд╢рди рд╢реИрдбрд░ рдХреЛ рдЙрди рд╕рднреА рдкрд┐рдХреНрд╕реЗрд▓ рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдХрд╛ рдирд┐рд░реНрджреЗрд╢ рджреЗрддрд╛ рд╣реИ, рдЬрд┐рдирдХрд╛ рдореВрд▓реНрдп рдЙрд╕рдХреЗ рдЕрд▓реНрдлрд╛ рдорд╛рди рд╕реЗ рдХрдо рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдпрд╣ 0.3f рд╣реИ , рдФрд░ рд╣рдорд╛рд░рд╛ рдЕрд▓реНрдлрд╛ рдорд╛рди 0.2f рд╣реИ , рддреЛ shader рдЗрд╕ рдкрд┐рдХреНрд╕реЗрд▓ рдХреЛ рд░реЗрдВрдбрд░ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ ред AlphaClipThreshold рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдПрдХрддрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: PBR рдорд╛рд╕реНрдЯрд░ рдиреЛрдб рдФрд░ рдЕрдирд▓рд┐рдорд┐рдЯреЗрдб рдорд╛рд╕реНрдЯрд░ рдиреЛрдб ред

рдпрд╣рд╛рдБ рд╣рдорд╛рд░реЗ рддреИрдпрд╛рд░ shader рд╣реИ:


рд╣рдо рд╡рд┐рдШрдЯрди рдмрдирд╛рд╡рдЯ рдХрд╛ рдирдореВрдирд╛ рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рд▓рд╛рд▓ рдореВрд▓реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ , рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рд░рд╛рд╢рд┐ рдорд╛рди рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ (рдЬреЛ рдХрд┐ рдПрдХ рд╕рдВрдкрддреНрддрд┐ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рд╕рдордЧреНрд░ рдирд┐рд╖реНрдкрд╛рджрди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛрдбрд╝рд╛ рд╣реИ, 1 рдХрд╛ рдЕрд░реНрде рд╣реИ рдкреВрд░реНрдг рд╡рд┐рдШрдЯрди) рдФрд░ рдЗрд╕реЗ рдЕрд▓реНрдлрд╝рд╛рдХреНрд▓рд┐рдкрдЯреНрд░рд╢реЛрд▓реНрдб рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВред рд╣реЛ рдЧрдпрд╛!

рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдХрд┐рд╕реА рднреА рдореМрдЬреВрджрд╛ shader рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдмрд╕ рдиреЛрдб рдХрдиреЗрдХреНрд╢рдиреЛрдВ рдХреЛ AlphaClipThreshold рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВ (рдЖрд╡рд╢реНрдпрдХ рдЧреБрдгреЛрдВ рдХреЛ рдпрд╛рдж рди рдХрд░реЗрдВ!)ред рдЖрдк рдЗрд╕реЗ рджреЛ рддрд░рдлрд╛ рднреА рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рдФрд░ рднреА рд╕реБрдВрджрд░ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ!



рд╕рдореЛрдЪреНрдЪ рд╡рд┐рдШрдЯрди shader


рдФрд░ рдЕрдЧрд░ рдЖрдк рдЗрд╕рдореЗрдВ рдХрдВрдЯреВрд░ рдЬреЛрдбрд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ? рдЪрд▓реЛ рдпрд╣ рдХрд░рддреЗ рд╣реИрдВ!


рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рднрдВрдЧ рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ, рдХреНрдпреЛрдВрдХрд┐ рдЙрдиреНрд╣реЗрдВ рдЫреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рдж рд╡реЗ рд╣рдореЗрд╢рд╛ рдХреЗ рд▓рд┐рдП рдЧрд╛рдпрдм рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ ред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рд╣рдо "рд▓рдЧрднрдЧ рднрдВрдЧ" рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ!

HLSL рдореЗрдВ, рдпрд╣ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ, рдмрд╕ рдХреНрд▓рд┐рдк рдХреА рдЧрдгрдирд╛ рдХреЗ рдмрд╛рдж рдХреЛрдб рдХреА рдХреБрдЫ рдкрдВрдХреНрддрд┐рдпрд╛рдБ рдЬреЛрдбрд╝реЗрдВ:

 void surf (Input IN, inout SurfaceOutputStandard o) { //[...] //After our clip calculations if (dissolve_value - _Amount < .05f) //outline width = .05f o.Emission = fixed3(1, 1, 1); //emits white color //Your shader body, you can set the Albedo etc. //[...] } 

рд╣реЛ рдЧрдпрд╛!

рд╢реЗрдбрд░ рдЧреНрд░рд╛рдл рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп , рддрд░реНрдХ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рд╣реЛрддрд╛ рд╣реИред рдпрд╣рд╛рдБ рд╕рдорд╛рдкреНрдд shader рд╣реИ:




рд╣рдо рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╡рд┐рдШрдЯрди рд╢реИрдбрд░ рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рдардВрдбрд╛ рдкреНрд░рднрд╛рд╡ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ; рдЖрдк рдЕрд▓рдЧ-рдЕрд▓рдЧ рдмрдирд╛рд╡рдЯ рдФрд░ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ , рд╕рд╛рде рд╣реА рд╕рд╛рде рдХреБрдЫ рдФрд░ рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ!

рднрд╛рдЧ 2: рд╡рд┐рд╢реНрд╡ рдЕрдиреНрд╡реЗрд╖рдг shader


рдПрдХ рд╡рд┐рд╢реНрд╡ рдЕрдиреНрд╡реЗрд╖рдг shader (рдпрд╛ рдПрдХ " рд╡рд┐рд╢реНрд╡ рд╡рд┐рдШрдЯрдирдХрд░реНрддрд╛ shader , рдпрд╛ рд╡реИрд╢реНрд╡рд┐рдХ рд╡рд┐рдШрдЯрди ") рд╣рдореЗрдВ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЙрдирдХреА рджреВрд░реА рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рджреГрд╢реНрдп рдореЗрдВ рд╕рднреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдЫрд┐рдкрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ; рдЕрдм рд╣рдо рдЗрд╕ рддрд░рд╣ рдХреЗ рд╢реЗрдб рдХреЛ Unity Shader Graph рдореЗрдВ рдмрдирд╛рдПрдВрдЧреЗ рдФрд░ рдЗрд╕реЗ HLSL рдореЗрдВ рд▓рд┐рдЦреЗрдВрдЧреЗ ред

рдпрд╣рд╛рдБ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдХрд┐ рд╣рдо рдХреНрдпрд╛ рдмрдирд╛рдПрдВрдЧреЗ:




рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рджреВрд░реА


рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдореЗрдВ рдХрд┐рд╕реА рджреГрд╢реНрдп рдореЗрдВ рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЛ рднрдВрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдпрджрд┐ рд╡рд╣ рдЦрд┐рд▓рд╛рдбрд╝реА рд╕реЗ рдмрд╣реБрдд рджреВрд░ рд╣реИ ред рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА _Amount рдкреИрд░рд╛рдореАрдЯрд░ рдХреА рдШреЛрд╖рдгрд╛ рдХреА рд╣реИ, рдЬреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓реБрдкреНрдд рд╣реЛрдиреЗ / рд╡рд┐рдШрдЯрди рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЗрд╕реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдФрд░ рдкреНрд▓реЗрдпрд░ рдХреЗ рдмреАрдЪ рдХреА рджреВрд░реА рд╕реЗ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдкреНрд▓реЗрдпрд░ рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рд╕реНрдерд┐рддрд┐ рд▓реЗрдиреА рд╣реЛрдЧреАред

рдЦрд┐рд▓рд╛рдбрд╝реА рдХреА рд╕реНрдерд┐рддрд┐


рдпрд╣ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдпреВрдирд┐рдЯреА рд╢реЗрдбрд░ рдЧреНрд░рд╛рдл рдФрд░ рдПрдЪрдПрд▓рдПрд╕рдПрд▓ рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рд╣реЛрдЧреА: рд╣рдореЗрдВ рдХреЛрдб рдореЗрдВ рдЦрд┐рд▓рд╛рдбрд╝реА рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

 private void Update() { //Updates the _PlayerPos variable in all the shaders //Be aware that the parameter name has to match the one in your shaders or it wont' work Shader.SetGlobalVector("_PlayerPos", transform.position); //"transform" is the transform of the Player } 



рдЫрд╛рдпрд╛рджрд╛рд░ рдЧреНрд░рд╛рдл


рд╡рд╕реНрддреБ рд╕реНрдерд┐рддрд┐ рдФрд░ рдЙрд╕рд╕реЗ рджреВрд░реА


Shader Graph рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╣рдо рд╕реНрдерд┐рддрд┐ рдФрд░ рджреВрд░реА рдиреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред



PS рдЗрд╕ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП рд╕реНрдкреНрд░рд╛рдЗрдЯ рд░реЗрдВрдбрд░рд░реНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ _MainTex рдкреНрд░реЙрдкрд░реНрдЯреА рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛, рдЙрд╕рдХрд╛ рд╕реИрдВрдкрд▓ рд▓реЗрдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЙрд╕реЗ рдПрд▓реНрдмрд┐рдбреЛ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЖрдк рдореЗрд░реЗ рдкрд┐рдЫрд▓реЗ рд╕реНрдкреНрд░рд╛рдЗрдЯреНрд╕ рдбрд┐рдлреНрдпреВрдЬрд╝ рд╢реЗрдбрд░ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ (рдЬреЛ рд╢реЗрдбрд░ рдЧреНрд░рд╛рдлрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ) рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред



рдПрдЪрдПрд▓рдПрд╕рдПрд▓ (рд╕рддрд╣)


рд╡рд╕реНрддреБ рд╕реНрдерд┐рддрд┐


рдПрдЪрдПрд▓рдПрд╕рдПрд▓ рдореЗрдВ, рд╣рдо рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдХреЛрдиреЗ рдХреА рд╕реНрдерд┐рддрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдЗрдирдкреБрдЯ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рд╡рд░реНрд▓реНрдбрдкреЛрд╕ рдЪрд░ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред

 struct Input { float2 uv_MainTex; float3 worldPos; //add this and Unity will set it automatically }; 

рдпреВрдирд┐рдЯреА рдбреЙрдХреНрдпреВрдореЗрдВрдЯреЗрд╢рди рдкреЗрдЬ рдкрд░, рдЖрдк рдпрд╣ рдЬрд╛рди рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЗрдирдкреБрдЯ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдЖрдк рдХреМрди рд╕реЗ рдЕрдиреНрдп рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреИрд░рд╛рдореАрдЯрд░ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред

рджреВрд░реА рд▓рд╛рдЧреВ рдХрд░реЗрдВ


рд╣рдореЗрдВ рд╡рд┐рдШрдЯрди рдХреА рдорд╛рддреНрд░рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдФрд░ рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЗ рдмреАрдЪ рдХреА рджреВрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рджреВрд░рд╕реНрде рдлрд╝рдВрдХреНрд╢рди ( Microsoft рдкреНрд░рд▓реЗрдЦрди ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

 void surf (Input IN, inout SurfaceOutputStandard o) { half dissolve_value = tex2D(_DissolveTexture, IN.uv_MainTex).x; float dist = distance(_PlayerPos, IN.worldPos); clip(dissolve_value - dist/ 6f); //"6" is the maximum distance where your object will start showing //Set albedo, alpha, smoothness etc[...] } 

рдкрд░рд┐рдгрд╛рдо (3 рдбреА)



рдкрд░рд┐рдгрд╛рдо (2D)



рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╡рд╕реНрддреБрдПрдВ "рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ" рднрдВрдЧ рд╣реЛрддреА рд╣реИрдВ, рд╣рдореЗрдВ рдПрдХ рд╕рдЬрд╛рддреАрдп рдкреНрд░рднрд╛рд╡ рдирд╣реАрдВ рдорд┐рд▓рд╛, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рд╡рд╕реНрддреБ рдХреЗ рдпреВрд╡реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рд╡рдЯ рд╕реЗ "рд╡рд┐рдШрдЯрди рдореВрд▓реНрдп" рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред (2 рдбреА рдореЗрдВ, рдпрд╣ рдХрдо рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ)ред



HLSL рдкрд░ 3 рдбреА рд▓реЛрдХрд▓рдпреВрд╡реА рдбрд┐рд╕реЙрд▓реНрд╡реНрдб рд╢реЗрдбрд░


 Shader "Custom/GlobalDissolveSurface" { Properties { _Color ("Color", Color) = (1,1,1,1) _MainTex ("Albedo (RGB)", 2D) = "white" {} _Glossiness("Smoothness", Range(0,1)) = 0.5 _Metallic("Metallic", Range(0,1)) = 0.0 _DissolveTexture("Dissolve texture", 2D) = "white" {} _Radius("Distance", Float) = 1 //distance where we start to reveal the objects } SubShader{ Tags { "RenderType" = "Opaque" } LOD 200 Cull off //material is two sided CGPROGRAM #pragma surface surf Standard fullforwardshadows #pragma target 3.0 sampler2D _MainTex; sampler2D _DissolveTexture; //texture where we get the dissolve value struct Input { float2 uv_MainTex; float3 worldPos; //Built-in world position }; half _Glossiness; half _Metallic; fixed4 _Color; float3 _PlayerPos; //"Global Shader Variable", contains the Player Position float _Radius; void surf (Input IN, inout SurfaceOutputStandard o) { half dissolve_value = tex2D(_DissolveTexture, IN.uv_MainTex).x; float dist = distance(_PlayerPos, IN.worldPos); clip(dissolve_value - dist/ _Radius); fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color; o.Albedo = c.rgb; o.Metallic = _Metallic; o.Smoothness = _Glossiness; o.Alpha = ca; } ENDCG } FallBack "Diffuse" } 

рд╕реНрдкреНрд░рд╛рдЗрдЯреНрд╕ рдбрд┐рдлреНрдпреВрдЬрд╝ - рдПрдЪрдПрд▓рдПрд╕рдПрд▓ рдкрд░ рд▓реЛрдХрд▓рдпреВрд╡реА рдбрд┐рд╕реЙрд▓реНрд╡реНрдб рд╢реЗрдбрд░


 Shader "Custom/GlobalDissolveSprites" { Properties { [PerRendererData] _MainTex("Sprite Texture", 2D) = "white" {} _Color("Tint", Color) = (1,1,1,1) [MaterialToggle] PixelSnap("Pixel snap", Float) = 0 [HideInInspector] _RendererColor("RendererColor", Color) = (1,1,1,1) [HideInInspector] _Flip("Flip", Vector) = (1,1,1,1) [PerRendererData] _AlphaTex("External Alpha", 2D) = "white" {} [PerRendererData] _EnableExternalAlpha("Enable External Alpha", Float) = 0 _DissolveTexture("Dissolve texture", 2D) = "white" {} _Radius("Distance", Float) = 1 //distance where we start to reveal the objects } SubShader { Tags { "Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent" "PreviewType" = "Plane" "CanUseSpriteAtlas" = "True" } Cull Off Lighting Off ZWrite Off Blend One OneMinusSrcAlpha CGPROGRAM #pragma surface surf Lambert vertex:vert nofog nolightmap nodynlightmap keepalpha noinstancing #pragma multi_compile _ PIXELSNAP_ON #pragma multi_compile _ ETC1_EXTERNAL_ALPHA #include "UnitySprites.cginc" struct Input { float2 uv_MainTex; fixed4 color; float3 worldPos; //Built-in world position }; sampler2D _DissolveTexture; //texture where we get the dissolve value float3 _PlayerPos; //"Global Shader Variable", contains the Player Position float _Radius; void vert(inout appdata_full v, out Input o) { v.vertex = UnityFlipSprite(v.vertex, _Flip); #if defined(PIXELSNAP_ON) v.vertex = UnityPixelSnap(v.vertex); #endif UNITY_INITIALIZE_OUTPUT(Input, o); o.color = v.color * _Color * _RendererColor; } void surf(Input IN, inout SurfaceOutput o) { half dissolve_value = tex2D(_DissolveTexture, IN.uv_MainTex).x; float dist = distance(_PlayerPos, IN.worldPos); clip(dissolve_value - dist / _Radius); fixed4 c = SampleSpriteTexture(IN.uv_MainTex) * IN.color; o.Albedo = c.rgb * ca; o.Alpha = ca; } ENDCG } Fallback "Transparent/VertexLit" } 

PS рдЕрдВрддрд┐рдо рд╢реЗрдбрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдорд╛рдирдХ рдпреВрдирд┐рдЯреА рд╕реНрдкреНрд░рд╛рдЗрдЯреНрд╕-рдбрд┐рдлреНрдпреВрдЬрд╝ рд╢реЗрдбрд░ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдИ рдФрд░ рд▓реЗрдЦ рдХреЗ рдЗрд╕ рднрд╛рдЧ рдореЗрдВ рдкрд╣рд▓реЗ рд╡рд░реНрдгрд┐рдд "рднрдВрдЧ" рднрд╛рдЧ рдХреЛ рдЬреЛрдбрд╝рд╛ред рд╕рднреА рдорд╛рдирдХ рд╢реЗрдб рдпрд╣рд╛рдВ рджреЗрдЦреЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ ред



рдкреНрд░рднрд╛рд╡ рдХреЛ рд╕рдЬрд╛рддреАрдп рдмрдирд╛рдирд╛


рдкреНрд░рднрд╛рд╡ рдХреЛ рд╕рдЬрд╛рддреАрдп рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╡реИрд╢реНрд╡рд┐рдХ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ (рджреБрдирд┐рдпрд╛ рдореЗрдВ рд╕реНрдерд┐рддрд┐) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╡рд┐рдШрдЯрди рдмрдирд╛рд╡рдЯ рдХреЗ рдпреВрд╡реА рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХред рд░реИрдк рдХреЛ рд╕реЗрдЯ рдХрд░рдирд╛ рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ = рд╡рд┐рдШрдЯрди рдмрдирд╛рд╡рдЯ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдореЗрдВ рджреЛрд╣рд░рд╛рдПрдВ рддрд╛рдХрд┐ рд╣рдо рдмрдирд╛рд╡рдЯ рдХреЛ рдмрд┐рдирд╛ рдиреЛрдЯрд┐рд╕ рдХрд┐рдП рджреЛрд╣рд░рд╛ рд╕рдХреЗрдВ (рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдмрдирд╛рд╡рдЯ рд╕рд╣рдЬ рд╣реИ рдФрд░ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рджреЛрд╣рд░рд╛рддрд╛ рд╣реИ!)


рдПрдЪрдПрд▓рдПрд╕рдПрд▓ (рд╕рддрд╣)


 half dissolve_value = tex2D(_DissolveTexture, IN.worldPos / 4).x; //I modified the worldPos to reduce the texture size 

рдЫрд╛рдпрд╛рджрд╛рд░ рдЧреНрд░рд╛рдл



рдкрд░рд┐рдгрд╛рдо (2D)



рдпрд╣ рдкрд░рд┐рдгрд╛рдо рд╣реИ: рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╡рд┐рдШрдЯрди рдХреА рдмрдирд╛рд╡рдЯ рдЕрдм рдкреВрд░реА рджреБрдирд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рд╣реИред

рдпрд╣ shader рдкрд╣рд▓реЗ рд╕реЗ рд╣реА 2D рдЧреЗрдореНрд╕ рдХреЗ рд▓рд┐рдП рдЖрджрд░реНрд╢ рд╣реИ , рд▓реЗрдХрд┐рди 3D рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдмреЗрд╣рддрд░ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

3D рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛



рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╢реЗрдбрд░ "рдЧреИрд░-рдКрд░реНрдзреНрд╡рд╛рдзрд░" рдЪреЗрд╣рд░реЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдмрдирд╛рд╡рдЯ рдХреЛ рдмрд╣реБрдд рд╡рд┐рдХреГрдд рдХрд░рддрд╛ рд╣реИред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИред рдпреВрд╡реА рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ рдорд╛рди рдлреНрд▓реЛрдЯ 2 рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рдпрджрд┐ рд╣рдо рд╡рд░реНрд▓реНрдбрдкреЛрд╕ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдХреЗрд╡рд▓ рдПрдХреНрд╕ рдФрд░ рд╡рд╛рдИ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред

рдпрджрд┐ рд╣рдо рд╕рднреА рдЪреЗрд╣рд░реЛрдВ рдкрд░ рдмрдирд╛рд╡рдЯ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧрдгрдирд╛рдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдХреЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдареАрдХ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдПрдХ рдирдИ рд╕рдорд╕реНрдпрд╛ рдХреЗ рд▓рд┐рдП рдЖрдПрдВрдЧреЗ: рдЬрдм рдЕрдВрдзреЗрд░рд╛ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╡рд╕реНрддреБрдПрдВ рдПрдХ-рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рдорд┐рд▓ рдЬрд╛рдПрдВрдЧреА, рдФрд░ рд╕рдЬрд╛рддреАрдп рдирд╣реАрдВ рд░рд╣реЗрдВрдЧреАред

рд╕рдорд╛рдзрд╛рди рдХреЛ рд╕рдордЭрдирд╛ рд╢реБрд░реБрдЖрддреА рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрдЧрд╛: рдмрдирд╛рд╡рдЯ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдирд╛, рджреБрдирд┐рдпрд╛ рдореЗрдВ рддреНрд░рд┐-рдЖрдпрд╛рдореА рд╢реЛрд░ рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рдФрд░ рдЗрд╕рд╕реЗ "рд╡рд┐рдШрдЯрди рдХрд╛ рдореВрд▓реНрдп" рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдЗрд╕ рдкреЛрд╕реНрдЯ рдореЗрдВ рдореИрдВ 3 рдбреА рд╢реЛрд░ рдХреА рдкреАрдврд╝реА рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ!

рдпрд╣рд╛рдБ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╢реЛрд░ shader рд╣реИ: https://github.com/keijiro/NoiseShader ред рдЖрдк рдпрд╣рд╛рдВ рд╢реЛрд░ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рднреА рд╕реАрдЦ рд╕рдХрддреЗ рд╣реИрдВ: https://thebookofshaders.com/11/ рдФрд░ рдпрд╣рд╛рдБ: https://catlikecoding.com/unity/tutorials/noise/

рдореИрдВ рдЕрдкрдиреЗ рд╕рддрд╣ рдХрд╛рд░реНрдп рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗрдЯ рдХрд░реВрдБрдЧрд╛ (рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╢реЛрд░ рд╡рд╛рд▓рд╛ рднрд╛рдЧ рд▓рд┐рдЦрд╛ рд╣реИ):

 void surf (Input IN, inout SurfaceOutputStandard o) { float dist = distance(_PlayerPos, IN.worldPos); //"abs" because you have to make sure that the noise is between the range [0,1] //you can remove "abs" if your noise function returns a value between [0,1] //also, replace "NOISE_FUNCTION_HERE" with your 3D noise function. half dissolve_value = abs(NOISE_FUNCTION_HERE(IN.worldPos)); if (dist > _Radius) { float clip_value = dissolve_value - ((dist - _Radius) / _Radius); clip(clip_value); if (clip_value < 0.05f) o.Emission = float3(1, 1, 1); } fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color; o.Albedo = c.rgb; o.Metallic = _Metallic; o.Smoothness = _Glossiness; o.Alpha = ca; } 

HLSL рдХрд╛ рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдЕрдиреБрд╕реНрдорд╛рд░рдХ: рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ / рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЗрд╕реЗ рд▓рд┐рдЦрд╛ / рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

PS рдпрджрд┐ рдЖрдк рдПрдХрддрд╛ рд╢реЗрдбрд░ рдЧреНрд░рд╛рдлрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╢реЗрдбрд░ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдХрд╕реНрдЯрдо рдиреЛрдбреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдФрд░ рдЙрдирдореЗрдВ рдПрдЪрдПрд▓рдПрд╕рдПрд▓ рдХреЛрдб рд▓рд┐рдЦрдХрд░ рд╢реЛрд░ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВ)ред рдореИрдВ рднрд╡рд┐рд╖реНрдп рдХреЗ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдореЗрдВ рдХрд╕реНрдЯрдо рдиреЛрдбреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ред

рдкрд░рд┐рдгрд╛рдо (3 рдбреА)





рдХрдВрдЯреНрд░рд╛рд╕реНрдЯ рдЬреЛрдбрд╝рдирд╛


рдЖрдХреГрддрд┐ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреЗ рдкрд┐рдЫрд▓реЗ рднрд╛рдЧ рд╕реЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рджреЛрд╣рд░рд╛рдирд╛ рд╣реЛрдЧрд╛ред




рдЙрд▓рдЯрд╛ рдЕрд╕рд░


рдФрд░ рдЕрдЧрд░ рд╣рдо рдЗрд╕ рдкреНрд░рднрд╛рд╡ рдХреЛ рдЙрд▓рдЯрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ? (рдХрд┐рд╕реА рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЗ рдкрд╛рд╕ рд╣реЛрдиреЗ рдкрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдЧрд╛рдпрдм рд╣реЛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП)

рдпрд╣ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдПрдХ рдкрдВрдХреНрддрд┐ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ:

 float dist = _Radius - distance(_PlayerPos, IN.worldPos); 

(рдпрд╣реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ Shader Graph рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддреА рд╣реИ)ред

Source: https://habr.com/ru/post/hi427401/


All Articles