рднрд╛рдЧ 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;
рдФрд░ рдпрд╣ рдмрд╛рдд рд╣реИ! рд╣рдо рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдХрд┐рд╕реА рднреА рдореМрдЬреВрджрд╛ 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() {
рдЫрд╛рдпрд╛рджрд╛рд░ рдЧреНрд░рд╛рдл
рд╡рд╕реНрддреБ рд╕реНрдерд┐рддрд┐ рдФрд░ рдЙрд╕рд╕реЗ рджреВрд░реА
Shader Graph рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╣рдо рд╕реНрдерд┐рддрд┐ рдФрд░ рджреВрд░реА рдиреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
PS рдЗрд╕ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП рд╕реНрдкреНрд░рд╛рдЗрдЯ рд░реЗрдВрдбрд░рд░реНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ _MainTex рдкреНрд░реЙрдкрд░реНрдЯреА рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛, рдЙрд╕рдХрд╛ рд╕реИрдВрдкрд▓ рд▓реЗрдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЙрд╕реЗ рдПрд▓реНрдмрд┐рдбреЛ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЖрдк рдореЗрд░реЗ рдкрд┐рдЫрд▓реЗ
рд╕реНрдкреНрд░рд╛рдЗрдЯреНрд╕ рдбрд┐рдлреНрдпреВрдЬрд╝ рд╢реЗрдбрд░ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ (рдЬреЛ рд╢реЗрдбрд░ рдЧреНрд░рд╛рдлрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ) рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред
рдПрдЪрдПрд▓рдПрд╕рдПрд▓ (рд╕рддрд╣)
рд╡рд╕реНрддреБ рд╕реНрдерд┐рддрд┐
рдПрдЪрдПрд▓рдПрд╕рдПрд▓ рдореЗрдВ, рд╣рдо рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдХреЛрдиреЗ рдХреА рд╕реНрдерд┐рддрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ
рдЗрдирдкреБрдЯ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ
рд╡рд░реНрд▓реНрдбрдкреЛрд╕ рдЪрд░ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред
struct Input { float2 uv_MainTex; float3 worldPos;
рдпреВрдирд┐рдЯреА рдбреЙрдХреНрдпреВрдореЗрдВрдЯреЗрд╢рди рдкреЗрдЬ рдкрд░, рдЖрдк рдпрд╣ рдЬрд╛рди рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЗрдирдкреБрдЯ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдЖрдк рдХреМрди рд╕реЗ рдЕрдиреНрдп рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреИрд░рд╛рдореАрдЯрд░ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред
рджреВрд░реА рд▓рд╛рдЧреВ рдХрд░реЗрдВ
рд╣рдореЗрдВ рд╡рд┐рдШрдЯрди рдХреА рдорд╛рддреНрд░рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдФрд░ рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЗ рдмреАрдЪ рдХреА рджреВрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд
рджреВрд░рд╕реНрде рдлрд╝рдВрдХреНрд╢рди (
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);
рдкрд░рд┐рдгрд╛рдо (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;
рдЫрд╛рдпрд╛рджрд╛рд░ рдЧреНрд░рд╛рдл
рдкрд░рд┐рдгрд╛рдо (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 рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддреА рд╣реИ)ред