рдкрд░рд┐рдЪрдп
рд╣реЗрд▓реЛ, рд╣реИрдмрд░ред рдЖрдЬ рдореИрдВ рдереЛрдбрд╝реА рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рдХреИрд╕реЗ рдЬрд▓реНрджреА рдФрд░ рджрд░реНрдж рд░рд╣рд┐рдд (рд▓рдЧрднрдЧ)
рд▓рд╛рдЗрдЯрд╡реЗрдЯ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдкрд╛рдЗрдкрд▓рд╛рдЗрди (LWRP) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХрддрд╛ рдореЗрдВ рдХреНрд▓рд╛рд╕рд┐рдХ
рдЯреЗрдХреНрд╕реНрдЯ рд╢реЗрдбреНрд╕ рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ -
рд╕реНрдХреНрд░рд┐рдкреНрдЯрд┐рдВрдЧ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдкрд╛рдЗрдкрд▓рд╛рдЗрди (SRP) рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХред
рд▓реЗрдХрд┐рди Shader рдЧреНрд░рд╛рдл рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?
Shader Graph рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдпрд╛ рд╕рд░рд▓ рдкреНрд░рднрд╛рд╡ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдФрд░ рддреНрд╡рд░рд┐рдд рдЙрдкрдХрд░рдг рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХрднреА-рдХрднреА, рдХреБрдЫ рдЬрдЯрд┐рд▓ рдФрд░ рдЬрдЯрд┐рд▓ рд▓рд┐рдЦрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдФрд░ рдлрд┐рд░ - рдиреЛрдбреНрд╕, рдХрд╕реНрдЯрдо рдлрд╝рдВрдХреНрд╢рди, рдЙрдк-рдЧреНрд░рд╛рдлрд╝ рдХреА рд╕рдВрдЦреНрдпрд╛ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рдмрдврд╝ рд░рд╣реА рд╣реИ, рдпрд╣реА рд╡рдЬрд╣ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╕рдмрд╕реЗ рдЕрдиреБрднрд╡реА рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рднреА рдЗрд╕ рдкреВрд░реЗ рдЧрдбрд╝рдмрдбрд╝ рдореЗрдВ рднреНрд░рдорд┐рдд рд╣реЛрдиреЗ рд▓рдЧрддреЗ рд╣реИрдВред рд╣рдо рд╕рднреА рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЙрддреНрдкрдиреНрди рдХреЛрдб рдПрдХ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд▓рд┐рдЦреЗ рдЬрд╛рдиреЗ рд╕реЗ рдмреЗрд╣рддрд░ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреА рд╣реИ - рдЖрдкрдХреЛ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рджреВрд░ рдЬрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдиреЛрдбреНрд╕ рдХреЗ рд▓реЗрдЖрдЙрдЯ рдореЗрдВ рдХреЛрдИ рднреА рддреНрд░реБрдЯрд┐ рдЗрд╕ рддрдереНрдп рдХреЛ рдЬрдиреНрдо рджреЗ рд╕рдХрддреА рд╣реИ рдХрд┐ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬреНрдЮрд╛рдд рд╢реАрд░реНрд╖ рдкрд░рд┐рдгрд╛рдо рд╢рд╛рд░реНрдЯреЗрдХреНрдЯрд░ рдореЗрдВ рдмрд╛рд░-рдмрд╛рд░ рдЦрдВрдб рдореЗрдВ рдЧрд┐рдирд╛ рдЬрд╛рдПрдЧрд╛ред рдРрд╕реЗ рд▓реЛрдЧ рд╣реИрдВ рдЬреЛ рдиреЛрдбреНрд╕ рдХреЗ рдмрдЬрд╛рдп
рдХреЛрдб рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╕рд╣рдЬ рд╣реИрдВред рдХрд╛рд░рдг рдЕрд▓рдЧ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕рд╛рд░ рдПрдХ рд╣реА рд╣реИ - рдиреЛрдбреНрд╕ рдХреЗ рд╕рд╛рде рдиреАрдЪреЗ, рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдХреЛрдб рд░рд╣рддреЗ рд╣реИрдВ!

рд╕рдорд╕реНрдпрд╛рдУрдВ
рддреЛ, LWRP рдХреЗ рддрд╣рдд рдПрдХ рдирд┐рдпрдорд┐рдд рдкрд╛рда shader рд▓рд┐рдЦрдиреЗ рдФрд░ рдмреИрдардиреЗ рдореЗрдВ рдХреНрдпрд╛ рд╕рдорд╕реНрдпрд╛ рд╣реИ? рдФрд░ рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ LWRP рдореЗрдВ рд╕рднреА рдХреЗ рдкрд╕рдВрджреАрджрд╛
рд╕реНрдЯреИрдВрдбрд░реНрдб рд╕рд░рдлреЗрд╕ рд╢реЗрдбреНрд╕ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИрдВред
рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╕рдордп, рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдорд┐рд▓рддреЗ рд╣реИрдВ:

рд╢реЗрдбрд░ рдХреЛрдбShader "Custom/NewSurfaceShader" { 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 } SubShader { Tags { "RenderType"="Opaque" } LOD 200 CGPROGRAM
рдлрд┐рд░ рджрд┐рдорд╛рдЧ рдореЗрдВ рдпрд╣ рдЖрддрд╛ рд╣реИ рдХрд┐ рдирд┐рдпрдорд┐рдд рдРрд▓рд┐рдЯ рд╢реЗрдбрд░ рдХреЛ рд╡рд░реНрдЯреЗрдХреНрд╕ рдФрд░ рдлреНрд░реЗрдЧреНрдореЗрдВрдЯ рдкрд╛рд░реНрдЯ рдХреЗ рд╕рд╛рде рд▓рд┐рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВред рдФрд░ рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:

рд╢реЗрдбрд░ рдХреЛрдб Shader "Unlit/NewUnlitShader" { Properties { _MainTex ("Texture", 2D) = "white" {} } SubShader { Tags { "RenderType"="Opaque" } LOD 100 Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЖрдк рдХреИрд╕реЗ рджреБрдЦреА рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ - рд╣рдо рдмрд┐рдирд╛ рд░реЛрд╢рдиреА, рдЫрд╛рдпрд╛, рд▓рд╛рдЗрдЯрдореИрдк рдФрд░ рдкреНрдпрд╛рд░реЗ
рдкреАрдмреАрдЖрд░ рдХреЗ рдмрд┐рдирд╛ рдХрд┐рдирд╛рд░реЗ рдкрд░ рдирдЧреНрди рд░рд╣рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рдЧ рд░рд╣реЗ рдереЗ, рдЬрд┐рд╕рдХреЗ рдмрд┐рдирд╛ рдЬреАрд╡рди рдореАрдард╛ рдирд╣реАрдВ рдерд╛ред
рдмреЗрд╢рдХ, рдЖрдк рд╣рд╛рде рд╕реЗ рд╕рдм рдХреБрдЫ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
рд╡рд╣рд╛рдБ рдкреНрд░рдХрд╛рд╢ рд╣реЛ!
рд╢реЗрдбрд░ рдХреЛрдб Shader "TheProxor/Simple Lit" { Properties { _MainTex("Texture", 2D) = "white" {} } SubShader { Tags { "RenderType" = "Opaque" } LOD 100 Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag
рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рд┐рд░реНрдл рдкреНрд░рдХрд╛рд╢ рдлреИрд▓рд╛рдирд╛ рд╣реИред рдЖрдЧреЗ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ? рдЖрдк рд╣рд╛рде рд╕реЗ рд╕рдм рдХреБрдЫ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рд▓рдВрдмрд╛ рдФрд░ рдиреАрд░рд╕ рд╣реИ, рдФрд░ рдкреАрдмреАрдЖрд░ рдХреЛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рд╣рдо рд╕рднреА рдПрд▓рдбрдмреНрд▓реНрдпреВрдЖрд░рдкреА рдЪрд┐рдкреНрд╕ рдЦреЛ рджреЗрддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЬрд╛рджреВ рдХреЗ рд╕реНрдЯреНрд░реЛрдХ рдХреЗ рд╕рд╛рде рд╕рдм рдХреБрдЫ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрд▓рдбрдмреНрд▓реНрдпреВрдЖрд░рдкреА рдХреЛ рдЪреБрдирдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреЛрдИ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИред
рдирд┐рд░реНрдгрдп
рддреЛ, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, LWRP
рдлреЙрд░рд╡рд░реНрдб-рд░реЗрдВрдбрд░рд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдЕрдкрдирд╛ LitForwardPass рд╣реИ, рдЬрд┐рд╕реЗ рдХрд╣реАрдВ рди рдХрд╣реАрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдХрд╣реАрдВ рди рдХрд╣реАрдВ рдПрдХ CGInclude рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рд╕рдм рд╡рд░реНрдгрд┐рдд рд╣реИред рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдВ рд╣рдо рдПрдХ рдордЬреЗрджрд╛рд░ рд╕рд╛рд╣рд╕рд┐рдХ рдкрд░ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ:
% localappdata% \ Unity \ cache \ package \ package.unity.com \ com.unity.render- рдкрд╛рдЗрдкрд▓рд╛рдЗрди-рд▓рд╛рдЗрдЯрд╡реЗрдЯ @ (LWRP рд╕рдВрд╕реНрдХрд░рдг) \
рдЕрд╕рд▓ рдореЗрдВ, рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкрддреЗ рдкрд░ рдЖрдиреЗ рдФрд░
рд╢реЗрдбрд░реНрд╕ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдЬрд╛рдиреЗ рд╕реЗ, рд╣рдо рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк shader рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ
Lit.shader рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдо рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░реА рдЦреЛрдЬ рдЦрддреНрдо рд╣реЛ рдЧрдИ рд╣реИ, рдпрд╣рд╛рдВ рдпрд╣ рд╣реИ - рдкреНрд░рддрд┐рд╖реНрдард┐рдд рдЫрд╛рдпрд╛рджрд╛рд░ред рдЕрдВрджрд░ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ - рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд╛рдордЧреНрд░реА рдкрд╛рддреЗ рд╣реИрдВ:
Lit.shader Shader "Lightweight Render Pipeline/Lit" { Properties {
рдпрд╣ рдХреЗрд╡рд▓ рд╕рдВрдкрд╛рджрди рдореЗрдВ рдЖрд╕рд╛рдиреА рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓-рдПрд╕ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдорд┐рд▓ рд░рд╣рд╛ рд╣реИред рдареАрдХ рд╣реИ, рдЕрдкрдиреЗ рддрд░реАрдХреЗ рд╕реЗ рдереЛрдбрд╝рд╛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░реЗрдВред
рд╣рдореЗрдВ рдРрд╕рд╛ рдХреБрдЫ рдорд┐рд▓рддрд╛ рд╣реИ:

рдЕрдВрддрд┐рдо uber shader Shader "TheProxor/LWRP/Dissolve + Vertex Offset" { Properties {
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рдХрд┐ рдкрд░рд┐рдгрд╛рдореА рд╢реЗрдбрд░ рдореЗрдВ рдХреНрдпрд╛ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рд▓рд╛рдЗрди рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ:
CustomEditor "UnityEditor.Rendering.LWRP.ShaderGUI.LitShaderEditor"
рдЬреЛ, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВ, рдореВрд▓ рдореЗрдВ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдерд╛:
CustomEditor "UnityEditor.Rendering.LWRP.ShaderGUI.LitShader"
рддреЛ рдпрд╣ рдХреНрдпрд╛ рд╣реИ рдФрд░ рдХреНрдпреЛрдВ рд╣реИ? рдЗрд╕ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ - рдпрджрд┐ рдЖрдк рдмрд╛рд░реАрдХреА рд╕реЗ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рд╢реЗрдбрд░ рдХреЗ рдкрд╛рд╕ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдбрд┐рдлрд╛рдЗрдирд░реНрд╕ рдХреА рдПрдХ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рд╣реЛрддреА рд╣реИ, рдЬреЛ рдЕрдЬреАрдм рддрд░рд╣ рд╕реЗ рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рд╕рдХреНрд░рд┐рдп рдФрд░ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рдпрд╣, рдПрдХ рдкрд▓ рдХреЗ рд▓рд┐рдП, рдХреЛрдб рд╕реЗ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдПрдХ рдХрд╕реНрдЯрдо рдирд┐рд░реАрдХреНрд╖рдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдорд╛рд░реЗ рдХрд╕реНрдЯрдо рдЗрдВрд╕реНрдкреЗрдХреНрдЯрд░ рдХреЛ рд╣рдореЗрдВ рди рдХреЗрд╡рд▓ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдореМрдХрд╛ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП, рдмрд▓реНрдХрд┐ рдпрд╣ рднреА рдХрд┐ рд╣рдореЗрдВ рдЕрдкрдиреЗ рд╢реЗрдб рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред
рдореВрд▓ shader рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдХрд╕реНрдЯрдо рдЗрдВрд╕реНрдкреЗрдХреНрдЯрд░ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрде рдХреЗ рд╕рд╛рде рдвреВрдВрдв рдХрд░ рдкреЗрдЯ рднрд░рддреЗ рд╣реИрдВ:% localappdata% \ Unity \ cache \ package \ package.unity.com \ com.unity.render-pipelines.lightweight@6.9.2 \ Editor \ ShaderGUI \ Shaders \
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдо LitShader.cs рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рдЬреЛ рдХрд┐ рдмреЗрд╕рд╢реЗрдпрд░рдЧреВрдИ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА рд╣реИ: internal class LitShader : BaseShaderGUI { ... }
рдореБрдЦреНрдп рдмреИрдЪ рдмрд┐рд▓реНрдХреБрд▓ BaseShaderGUI.cs рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдПрдХ рд╕реНрддрд░ рдЕрдзрд┐рдХ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: public abstract class BaseShaderGUI : ShaderGUI { ... }
рд╣рдо рдЗрди рд▓рд┐рдкрд┐рдпреЛрдВ рдХреЛ рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕рдВрдкрд╛рджрдХ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдлреЗрдВрдХ рджреЗрддреЗ рд╣реИрдВ (рдпрджрд┐ рдХреЛрдИ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдмрдирд╛рдПрдВ, рдЕрдиреНрдпрдерд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рджреМрд░рд╛рди рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рджрд┐рдЦрд╛рдИ рджреЗрдВрдЧреА, рдХреНрдпреЛрдВрдХрд┐ рдпреВрдирд┐рдЯреА рдПрдбрд┐рдЯрд░ рдирд╛рдо рдмрд┐рд▓реНрдб рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИ)ред рдмреЗрд╢рдХ, рд╣рдорд╛рд░реЗ рд╕рд┐рд░ рдкрд░ рдПрдХ рд╣рдЬрд╛рд░ рдПрдХ рдЧрд▓рддреА рд╣реИ, рдЬреЛ рдЯрд╛рдЗрдк internel рд╕рд╛рде рдЬреБрдбрд╝реЗ рд░рд╣реЗ рд╣реИрдВ рдЧрд┐рд░ рдЬрд╛рддрд╛ рд╣реИ SavedBool рд╣реИ, рдЬреЛ рдПрдХ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рдЦрд┐рдбрд╝рдХреА рдкреНрд░рдХрд╛рд░ bool рдЪрд░ рд╕рдВрдкрд╛рджрдХ рд╣реИред рдпрд╣ рд╕рд╛рдордЧреНрд░реА рдХреЗ рддрд╣ рд╡рд░реНрдЧреЛрдВ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рджрд░рдЕрд╕рд▓, рд╕реБрдзрд╛рд░ рдХреЗ рд▓рд┐рдП рд╣рдо рд╕рд░рд▓ рд╣реЗрд░рдлреЗрд░ рдХрд░рддреЗ рд╣реИрдВредрдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП: SavedBool m_SurfaceOptionsFoldout; SavedBool m_SurfaceInputsFoldout; SavedBool m_AdvancedFoldout;
рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП: AnimatedValues.AnimBool m_SurfaceOptionsFoldout; AnimatedValues.AnimBool m_SurfaceInputsFoldout; AnimatedValues.AnimBool m_AdvancedFoldout;
рдФрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╕реНрдЯрдо рдЧреБрдгреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдЪрд░ рдЬреЛрдбрд╝реЗрдВ: AnimatedValues.AnimBool m_OtherFoldout;
рдЖрдкрдХреЛ рд╣рдорд╛рд░реЗ рдХрд╕реНрдЯрдо рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдЕрдиреБрднрд╛рдЧ рдХрд╛ рдирд╛рдо рдФрд░ рд╡рд┐рд╡рд░рдг рднреА рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛, рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдЕрдВрджрд░ рд╕реНрдерд╛рдкрд┐рдд рдкрд░рдВрдкрд░рд╛рдУрдВ рдХрд╛ рдЕрд╡рд▓реЛрдХрди рдХрд░рдирд╛: protected class Styles {
рдЦреИрд░, рдЕрдм рдереЛрдбрд╝рд╛ рдЯреНрд░рд┐рдХ рдХрд░рддреЗ рд╣реИрдВред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рднреА рдорд╛рдирдХ рдЧреБрдгреЛрдВ рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ HideInInspector рд╡рд┐рд╢реЗрд╖рддрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреА рд╣реИ , рдЬреЛ рд╕реАрдзреЗ рд╕рдВрдХреЗрдд рджреЗрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдВрдкрддреНрддрд┐ рдирд┐рд░реАрдХреНрд╖рдХ рдореЗрдВ рдЫрд┐рдкреА рд╣реЛрдЧреАред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдХреЗрд╡рд▓ рд╕рд╛рдордЧреНрд░реА рдХреЗ рдорд╛рдирдХ рдирд┐рд░реАрдХреНрд╖рдХ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИ, рд▓реЗрдХрд┐рди рдХреМрди рд╕рд╛? рдпрд╣ рд╕рд╣реА рд╣реИ, рдХрд╕реНрдЯрдо! рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рд╕рднреА рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдЧреБрдг рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рддреЛ рдЖрдЗрдП рдЙрдиреНрд╣реЗрдВ рдЫрд┐рдкрд╛рддреЗ рд╣реИрдВ: ... [MainColor][HideInInspector] _BaseColor("Color", Color) = (0.5,0.5,0.5,1) [MainTexture][HideInInspector] _BaseMap("Albedo", 2D) = "white" {} [HideInInspector]_Cutoff("Alpha Cutoff", Range(0.0, 1.0)) = 0.5 [HideInInspector]_Smoothness("Smoothness", Range(0.0, 1.0)) = 0.5 [HideInInspector]_GlossMapScale("Smoothness Scale", Range(0.0, 1.0)) = 1.0 [HideInInspector]_SmoothnessTextureChannel("Smoothness texture channel", Float) = 0 ...
рдФрд░ рдХрд╕реНрдЯрдо рд╕рдВрдкрд╛рджрдХ рдХреЗ рдХреЛрдб рдХреЗ рдЕрдВрджрд░, рд╣рдо рдмрд╕ рдорд╛рдирдХ рдирд┐рд░реАрдХреНрд╖рдХ рдХреЗ рдкреНрд░рддрд┐рдкрд╛рджрди рдХрд╣рддреЗ рд╣реИрдВ: public override void OnGUI(...) { ... m_OtherFoldout.value = EditorGUILayout.BeginFoldoutHeaderGroup(m_OtherFoldout.value, Styles.OtherOptions); if (m_OtherFoldout.value) { base.OnGUI(materialEditorIn, properties); EditorGUILayout.Space(); } EditorGUILayout.EndFoldoutHeaderGroup(); ... }
рдкрд░рд┐рдгрд╛рдо рд╕реНрдкрд╖реНрдЯ рд╣реИ: рдФрд░ рдпрд╣рд╛рдБ рджреЛрдиреЛрдВ рд▓рд┐рдкрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЛрдб рд╣реИ:
BaseShaderEditor.cs using System; using UnityEngine; using UnityEngine.Rendering; using UnityEditor.Rendering; namespace UnityEditor { public abstract class BaseShaderEditor : ShaderGUI { #region EnumsAndClasses public enum SurfaceType { Opaque, Transparent } public enum BlendMode { Alpha, // Old school alpha-blending mode, fresnel does not affect amount of transparency Premultiply, // Physically plausible transparency mode, implemented as alpha pre-multiply Additive, Multiply } public enum SmoothnessSource { BaseAlpha, SpecularAlpha } public enum RenderFace { Front = 2, Back = 1, Both = 0 } protected class Styles { // Catergories public static readonly GUIContent SurfaceOptions = new GUIContent("Surface Options", "Controls how LWRP renders the Material on a screen."); public static readonly GUIContent SurfaceInputs = new GUIContent("Surface Inputs", "These settings describe the look and feel of the surface itself."); public static readonly GUIContent AdvancedLabel = new GUIContent("Advanced", "These settings affect behind-the-scenes rendering and underlying calculations."); public static readonly GUIContent surfaceType = new GUIContent("Surface Type", "Select a surface type for your texture. Choose between Opaque or Transparent."); public static readonly GUIContent blendingMode = new GUIContent("Blending Mode", "Controls how the color of the Transparent surface blends with the Material color in the background."); public static readonly GUIContent cullingText = new GUIContent("Render Face", "Specifies which faces to cull from your geometry. Front culls front faces. Back culls backfaces. None means that both sides are rendered."); public static readonly GUIContent alphaClipText = new GUIContent("Alpha Clipping", "Makes your Material act like a Cutout shader. Use this to create a transparent effect with hard edges between opaque and transparent areas."); public static readonly GUIContent alphaClipThresholdText = new GUIContent("Threshold", "Sets where the Alpha Clipping starts. The higher the value is, the brighter the effect is when clipping starts."); public static readonly GUIContent receiveShadowText = new GUIContent("Receive Shadows", "When enabled, other GameObjects can cast shadows onto this GameObject."); public static readonly GUIContent baseMap = new GUIContent("Base Map", "Specifies the base Material and/or Color of the surface. If you've selected Transparent or Alpha Clipping under Surface Options, your Material uses the Texture's alpha channel or color."); public static readonly GUIContent emissionMap = new GUIContent("Emission Map", "Sets a Texture map to use for emission. You can also select a color with the color picker. Colors are multiplied over the Texture."); public static readonly GUIContent normalMapText = new GUIContent("Normal Map", "Assigns a tangent-space normal map."); public static readonly GUIContent bumpScaleNotSupported = new GUIContent("Bump scale is not supported on mobile platforms"); public static readonly GUIContent fixNormalNow = new GUIContent("Fix now", "Converts the assigned texture to be a normal map format."); public static readonly GUIContent queueSlider = new GUIContent("Priority", "Determines the chronological rendering order for a Material. High values are rendered first."); public static readonly GUIContent OtherOptions = new GUIContent("Your own options", "You own custom options"); } #endregion #region Variables protected MaterialEditor materialEditor { get; set; } protected MaterialProperty surfaceTypeProp { get; set; } protected MaterialProperty blendModeProp { get; set; } protected MaterialProperty cullingProp { get; set; } protected MaterialProperty alphaClipProp { get; set; } protected MaterialProperty alphaCutoffProp { get; set; } protected MaterialProperty receiveShadowsProp { get; set; } // Common Surface Input properties protected MaterialProperty baseMapProp { get; set; } protected MaterialProperty baseColorProp { get; set; } protected MaterialProperty emissionMapProp { get; set; } protected MaterialProperty emissionColorProp { get; set; } protected MaterialProperty queueOffsetProp { get; set; } public bool m_FirstTimeApply = true; private const string k_KeyPrefix = "LightweightRP:Material:UI_State:"; private string m_HeaderStateKey = null; // Header foldout states AnimatedValues.AnimBool m_SurfaceOptionsFoldout; AnimatedValues.AnimBool m_SurfaceInputsFoldout; AnimatedValues.AnimBool m_AdvancedFoldout; AnimatedValues.AnimBool m_OtherFoldout; #endregion private const int queueOffsetRange = 50; //////////////////////////////////// // General Functions // //////////////////////////////////// #region GeneralFunctions public abstract void MaterialChanged(Material material); public virtual void FindProperties(MaterialProperty[] properties) { surfaceTypeProp = FindProperty("_Surface", properties); blendModeProp = FindProperty("_Blend", properties); cullingProp = FindProperty("_Cull", properties); alphaClipProp = FindProperty("_AlphaClip", properties); alphaCutoffProp = FindProperty("_Cutoff", properties); receiveShadowsProp = FindProperty("_ReceiveShadows", properties, false); baseMapProp = FindProperty("_BaseMap", properties, false); baseColorProp = FindProperty("_BaseColor", properties, false); emissionMapProp = FindProperty("_EmissionMap", properties, false); emissionColorProp = FindProperty("_EmissionColor", properties, false); queueOffsetProp = FindProperty("_QueueOffset", properties, false); } public override void OnGUI(MaterialEditor materialEditorIn, MaterialProperty[] properties) { if (materialEditorIn == null) throw new ArgumentNullException("materialEditorIn"); FindProperties(properties); // MaterialProperties can be animated so we do not cache them but fetch them every event to ensure animated values are updated correctly materialEditor = materialEditorIn; Material material = materialEditor.target as Material; // Make sure that needed setup (ie keywords/renderqueue) are set up if we're switching some existing // material to a lightweight shader. if (m_FirstTimeApply) { OnOpenGUI(material, materialEditorIn); m_FirstTimeApply = false; } ShaderPropertiesGUI(material); m_OtherFoldout.value = EditorGUILayout.BeginFoldoutHeaderGroup(m_OtherFoldout.value, Styles.OtherOptions); if (m_OtherFoldout.value) { base.OnGUI(materialEditorIn, properties); EditorGUILayout.Space(); } EditorGUILayout.EndFoldoutHeaderGroup(); foreach (var obj in materialEditor.targets) MaterialChanged((Material)obj); } public virtual void OnOpenGUI(Material material, MaterialEditor materialEditor) { // Foldout states m_HeaderStateKey = k_KeyPrefix + material.shader.name; // Create key string for editor prefs m_SurfaceOptionsFoldout = new AnimatedValues.AnimBool(true); m_SurfaceInputsFoldout = new AnimatedValues.AnimBool(true); m_AdvancedFoldout = new AnimatedValues.AnimBool(true); m_OtherFoldout = new AnimatedValues.AnimBool(true); foreach (var obj in materialEditor.targets) MaterialChanged((Material)obj); } public void ShaderPropertiesGUI(Material material) { if (material == null) throw new ArgumentNullException("material"); EditorGUI.BeginChangeCheck(); m_SurfaceOptionsFoldout.value = EditorGUILayout.BeginFoldoutHeaderGroup(m_SurfaceOptionsFoldout.value, Styles.SurfaceOptions); if (m_SurfaceOptionsFoldout.value) { DrawSurfaceOptions(material); EditorGUILayout.Space(); } EditorGUILayout.EndFoldoutHeaderGroup(); m_SurfaceInputsFoldout.value = EditorGUILayout.BeginFoldoutHeaderGroup(m_SurfaceInputsFoldout.value, Styles.SurfaceInputs); if (m_SurfaceInputsFoldout.value) { DrawSurfaceInputs(material); EditorGUILayout.Space(); } EditorGUILayout.EndFoldoutHeaderGroup(); m_AdvancedFoldout.value = EditorGUILayout.BeginFoldoutHeaderGroup(m_AdvancedFoldout.value, Styles.AdvancedLabel); if (m_AdvancedFoldout.value) { DrawAdvancedOptions(material); EditorGUILayout.Space(); } EditorGUILayout.EndFoldoutHeaderGroup(); DrawAdditionalFoldouts(material); if (EditorGUI.EndChangeCheck()) { foreach (var obj in materialEditor.targets) MaterialChanged((Material)obj); } } #endregion //////////////////////////////////// // Drawing Functions // //////////////////////////////////// #region DrawingFunctions public virtual void DrawSurfaceOptions(Material material) { DoPopup(Styles.surfaceType, surfaceTypeProp, Enum.GetNames(typeof(SurfaceType))); if ((SurfaceType)material.GetFloat("_Surface") == SurfaceType.Transparent) DoPopup(Styles.blendingMode, blendModeProp, Enum.GetNames(typeof(BlendMode))); EditorGUI.BeginChangeCheck(); EditorGUI.showMixedValue = cullingProp.hasMixedValue; var culling = (RenderFace)cullingProp.floatValue; culling = (RenderFace)EditorGUILayout.EnumPopup(Styles.cullingText, culling); if (EditorGUI.EndChangeCheck()) { materialEditor.RegisterPropertyChangeUndo(Styles.cullingText.text); cullingProp.floatValue = (float)culling; material.doubleSidedGI = (RenderFace)cullingProp.floatValue != RenderFace.Front; } EditorGUI.showMixedValue = false; EditorGUI.BeginChangeCheck(); EditorGUI.showMixedValue = alphaClipProp.hasMixedValue; var alphaClipEnabled = EditorGUILayout.Toggle(Styles.alphaClipText, alphaClipProp.floatValue == 1); if (EditorGUI.EndChangeCheck()) alphaClipProp.floatValue = alphaClipEnabled ? 1 : 0; EditorGUI.showMixedValue = false; if (alphaClipProp.floatValue == 1) materialEditor.ShaderProperty(alphaCutoffProp, Styles.alphaClipThresholdText, 1); if (receiveShadowsProp != null) { EditorGUI.BeginChangeCheck(); EditorGUI.showMixedValue = receiveShadowsProp.hasMixedValue; var receiveShadows = EditorGUILayout.Toggle(Styles.receiveShadowText, receiveShadowsProp.floatValue == 1.0f); if (EditorGUI.EndChangeCheck()) receiveShadowsProp.floatValue = receiveShadows ? 1.0f : 0.0f; EditorGUI.showMixedValue = false; } } public virtual void DrawSurfaceInputs(Material material) { DrawBaseProperties(material); } public virtual void DrawAdvancedOptions(Material material) { materialEditor.EnableInstancingField(); if (queueOffsetProp != null) { EditorGUI.BeginChangeCheck(); EditorGUI.showMixedValue = queueOffsetProp.hasMixedValue; var queue = EditorGUILayout.IntSlider(Styles.queueSlider, (int)queueOffsetProp.floatValue, -queueOffsetRange, queueOffsetRange); if (EditorGUI.EndChangeCheck()) queueOffsetProp.floatValue = queue; EditorGUI.showMixedValue = false; } } public virtual void DrawAdditionalFoldouts(Material material) { } public virtual void DrawBaseProperties(Material material) { if (baseMapProp != null && baseColorProp != null) // Draw the baseMap, most shader will have at least a baseMap { materialEditor.TexturePropertySingleLine(Styles.baseMap, baseMapProp, baseColorProp); // TODO Temporary fix for lightmapping, to be replaced with attribute tag. if (material.HasProperty("_MainTex")) { material.SetTexture("_MainTex", baseMapProp.textureValue); var baseMapTiling = baseMapProp.textureScaleAndOffset; material.SetTextureScale("_MainTex", new Vector2(baseMapTiling.x, baseMapTiling.y)); material.SetTextureOffset("_MainTex", new Vector2(baseMapTiling.z, baseMapTiling.w)); } } } protected virtual void DrawEmissionProperties(Material material, bool keyword) { var emissive = true; var hadEmissionTexture = emissionMapProp.textureValue != null; if (!keyword) { materialEditor.TexturePropertyWithHDRColor(Styles.emissionMap, emissionMapProp, emissionColorProp, false); } else { // Emission for GI? emissive = materialEditor.EmissionEnabledProperty(); EditorGUI.BeginDisabledGroup(!emissive); { // Texture and HDR color controls materialEditor.TexturePropertyWithHDRColor(Styles.emissionMap, emissionMapProp, emissionColorProp, false); } EditorGUI.EndDisabledGroup(); } // If texture was assigned and color was black set color to white var brightness = emissionColorProp.colorValue.maxColorComponent; if (emissionMapProp.textureValue != null && !hadEmissionTexture && brightness <= 0f) emissionColorProp.colorValue = Color.white; // LW does not support RealtimeEmissive. We set it to bake emissive and handle the emissive is black right. if (emissive) { material.globalIlluminationFlags = MaterialGlobalIlluminationFlags.BakedEmissive; if (brightness <= 0f) material.globalIlluminationFlags |= MaterialGlobalIlluminationFlags.EmissiveIsBlack; } } public static void DrawNormalArea(MaterialEditor materialEditor, MaterialProperty bumpMap, MaterialProperty bumpMapScale = null) { if (bumpMapScale != null) { materialEditor.TexturePropertySingleLine(Styles.normalMapText, bumpMap, bumpMap.textureValue != null ? bumpMapScale : null); if (bumpMapScale.floatValue != 1 && UnityEditorInternal.InternalEditorUtility.IsMobilePlatform( EditorUserBuildSettings.activeBuildTarget)) if (materialEditor.HelpBoxWithButton(Styles.bumpScaleNotSupported, Styles.fixNormalNow)) bumpMapScale.floatValue = 1; } else { materialEditor.TexturePropertySingleLine(Styles.normalMapText, bumpMap); } } protected static void DrawTileOffset(MaterialEditor materialEditor, MaterialProperty textureProp) { materialEditor.TextureScaleOffsetProperty(textureProp); } #endregion //////////////////////////////////// // Material Data Functions // //////////////////////////////////// #region MaterialDataFunctions public static void SetMaterialKeywords(Material material, Action<Material> shadingModelFunc = null, Action<Material> shaderFunc = null) { // Clear all keywords for fresh start material.shaderKeywords = null; // Setup blending - consistent across all LWRP shaders SetupMaterialBlendMode(material); // Receive Shadows if (material.HasProperty("_ReceiveShadows")) CoreUtils.SetKeyword(material, "_RECEIVE_SHADOWS_OFF", material.GetFloat("_ReceiveShadows") == 0.0f); // Emission if (material.HasProperty("_EmissionColor")) MaterialEditor.FixupEmissiveFlag(material); bool shouldEmissionBeEnabled = (material.globalIlluminationFlags & MaterialGlobalIlluminationFlags.EmissiveIsBlack) == 0; if (material.HasProperty("_EmissionEnabled") && !shouldEmissionBeEnabled) shouldEmissionBeEnabled = material.GetFloat("_EmissionEnabled") >= 0.5f; CoreUtils.SetKeyword(material, "_EMISSION", shouldEmissionBeEnabled); // Normal Map if (material.HasProperty("_BumpMap")) CoreUtils.SetKeyword(material, "_NORMALMAP", material.GetTexture("_BumpMap")); // Shader specific keyword functions shadingModelFunc?.Invoke(material); shaderFunc?.Invoke(material); } public static void SetupMaterialBlendMode(Material material) { if (material == null) throw new ArgumentNullException("material"); bool alphaClip = material.GetFloat("_AlphaClip") == 1; if (alphaClip) { material.EnableKeyword("_ALPHATEST_ON"); } else { material.DisableKeyword("_ALPHATEST_ON"); } var queueOffset = 0; // queueOffsetRange; if (material.HasProperty("_QueueOffset")) queueOffset = queueOffsetRange - (int)material.GetFloat("_QueueOffset"); SurfaceType surfaceType = (SurfaceType)material.GetFloat("_Surface"); if (surfaceType == SurfaceType.Opaque) { if (alphaClip) { material.renderQueue = (int)UnityEngine.Rendering.RenderQueue.AlphaTest; material.SetOverrideTag("RenderType", "TransparentCutout"); } else { material.renderQueue = (int)UnityEngine.Rendering.RenderQueue.Geometry; material.SetOverrideTag("RenderType", "Opaque"); } material.renderQueue += queueOffset; material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One); material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.Zero); material.SetInt("_ZWrite", 1); material.DisableKeyword("_ALPHAPREMULTIPLY_ON"); material.SetShaderPassEnabled("ShadowCaster", true); } else { BlendMode blendMode = (BlendMode)material.GetFloat("_Blend"); var queue = (int)UnityEngine.Rendering.RenderQueue.Transparent; // Specific Transparent Mode Settings switch (blendMode) { case BlendMode.Alpha: material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.SrcAlpha); material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha); material.DisableKeyword("_ALPHAPREMULTIPLY_ON"); break; case BlendMode.Premultiply: material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One); material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha); material.EnableKeyword("_ALPHAPREMULTIPLY_ON"); break; case BlendMode.Additive: material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One); material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.One); material.DisableKeyword("_ALPHAPREMULTIPLY_ON"); break; case BlendMode.Multiply: material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.DstColor); material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.Zero); material.DisableKeyword("_ALPHAPREMULTIPLY_ON"); material.EnableKeyword("_ALPHAMODULATE_ON"); break; } // General Transparent Material Settings material.SetOverrideTag("RenderType", "Transparent"); material.SetInt("_ZWrite", 0); material.renderQueue = queue + queueOffset; material.SetShaderPassEnabled("ShadowCaster", false); } } #endregion //////////////////////////////////// // Helper Functions // //////////////////////////////////// #region HelperFunctions public static void TwoFloatSingleLine(GUIContent title, MaterialProperty prop1, GUIContent prop1Label, MaterialProperty prop2, GUIContent prop2Label, MaterialEditor materialEditor, float labelWidth = 30f) { EditorGUI.BeginChangeCheck(); EditorGUI.showMixedValue = prop1.hasMixedValue || prop2.hasMixedValue; Rect rect = EditorGUILayout.GetControlRect(); EditorGUI.PrefixLabel(rect, title); var indent = EditorGUI.indentLevel; var preLabelWidth = EditorGUIUtility.labelWidth; EditorGUI.indentLevel = 0; EditorGUIUtility.labelWidth = labelWidth; Rect propRect1 = new Rect(rect.x + preLabelWidth, rect.y, (rect.width - preLabelWidth) * 0.5f, EditorGUIUtility.singleLineHeight); var prop1val = EditorGUI.FloatField(propRect1, prop1Label, prop1.floatValue); Rect propRect2 = new Rect(propRect1.x + propRect1.width, rect.y, propRect1.width, EditorGUIUtility.singleLineHeight); var prop2val = EditorGUI.FloatField(propRect2, prop2Label, prop2.floatValue); EditorGUI.indentLevel = indent; EditorGUIUtility.labelWidth = preLabelWidth; if (EditorGUI.EndChangeCheck()) { materialEditor.RegisterPropertyChangeUndo(title.text); prop1.floatValue = prop1val; prop2.floatValue = prop2val; } EditorGUI.showMixedValue = false; } public void DoPopup(GUIContent label, MaterialProperty property, string[] options) { DoPopup(label, property, options, materialEditor); } public static void DoPopup(GUIContent label, MaterialProperty property, string[] options, MaterialEditor materialEditor) { if (property == null) throw new ArgumentNullException("property"); EditorGUI.showMixedValue = property.hasMixedValue; var mode = property.floatValue; EditorGUI.BeginChangeCheck(); mode = EditorGUILayout.Popup(label, (int)mode, options); if (EditorGUI.EndChangeCheck()) { materialEditor.RegisterPropertyChangeUndo(label.text); property.floatValue = mode; } EditorGUI.showMixedValue = false; } // Helper to show texture and color properties public static Rect TextureColorProps(MaterialEditor materialEditor, GUIContent label, MaterialProperty textureProp, MaterialProperty colorProp, bool hdr = false) { Rect rect = EditorGUILayout.GetControlRect(); EditorGUI.showMixedValue = textureProp.hasMixedValue; materialEditor.TexturePropertyMiniThumbnail(rect, textureProp, label.text, label.tooltip); EditorGUI.showMixedValue = false; if (colorProp != null) { EditorGUI.BeginChangeCheck(); EditorGUI.showMixedValue = colorProp.hasMixedValue; int indentLevel = EditorGUI.indentLevel; EditorGUI.indentLevel = 0; Rect rectAfterLabel = new Rect(rect.x + EditorGUIUtility.labelWidth, rect.y, EditorGUIUtility.fieldWidth, EditorGUIUtility.singleLineHeight); var col = EditorGUI.ColorField(rectAfterLabel, GUIContent.none, colorProp.colorValue, true, false, hdr); EditorGUI.indentLevel = indentLevel; if (EditorGUI.EndChangeCheck()) { materialEditor.RegisterPropertyChangeUndo(colorProp.displayName); colorProp.colorValue = col; } EditorGUI.showMixedValue = false; } return rect; } // Copied from shaderGUI as it is a protected function in an abstract class, unavailable to others public new static MaterialProperty FindProperty(string propertyName, MaterialProperty[] properties) { return FindProperty(propertyName, properties, true); } // Copied from shaderGUI as it is a protected function in an abstract class, unavailable to others public new static MaterialProperty FindProperty(string propertyName, MaterialProperty[] properties, bool propertyIsMandatory) { for (int index = 0; index < properties.Length; ++index) { if (properties[index] != null && properties[index].name == propertyName) return properties[index]; } if (propertyIsMandatory) throw new ArgumentException("Could not find MaterialProperty: '" + propertyName + "', Num properties: " + (object)properties.Length); return null; } #endregion } }
LitShaderEditor.cs using System; using UnityEngine; using UnityEngine.Rendering; using UnityEditor.Rendering.LWRP; namespace UnityEditor.Rendering.LWRP.ShaderGUI { internal class LitShaderEditor : BaseShaderEditor {
рдЕрдм рдЖрдЗрдП рдЫрд╛рдпрд╛рдХрд╛рд░ рдХреЗ рдЗрдирд╕рд╛рдЗрдб рдХреЛ рджреЗрдЦреЗрдВредрдкрд╣рд▓реА рдмрд╛рдд рдЬрд┐рд╕ рдкрд░ рдЖрдк рдзреНрдпрд╛рди рджреЗрддреЗ рд╣реИрдВ, рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рд╢реЗрдбрд░ рдореЗрдВ рдХреЗрд╡рд▓ рдкрд╛рдБрдЪ рдкрд╛рд╕ рд╣реИрдВред рдЖрдЗрдП рд╣рдо рдЙрди рдкрд░ рдереЛрдбрд╝рд╛ рдзреНрдпрд╛рди рджреЗрдВ:- рдлреЙрд░рд╡рд░реНрдбрд▓рд┐рдЯ: рдлреЙрд░рд╡рд░реНрдб рдкрд╛рд╕, рдпрд╣рд╛рдВ рд╣рдо рдкреНрд░рдХрд╛рд╢, рдкреАрдмреАрдЖрд░ рдФрд░ рдХреЛрд╣рд░реЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред
- рд╢реИрдбреЛрдХрд╛рд╕реНрдЯрд░: рдпрд╣рд╛рдВ рдкрд░рдЫрд╛рдЗрдпреЛрдВ рдХреА рдЧрдгрдирд╛ рд╣реИред
- рдЧрд╣рд░рд╛рдИ : рдЧрд╣рд░рд╛рдИ (рдЬреЗрдб-рдмрдлрд░)ред
- рдореЗрдЯрд╛: рдмреЗрдХреНрдб рд▓рд╛рдЗрдЯ (lightmaps)ред
- рд▓рд╛рдЗрдЯрд╡реЗрдЯ 2 рдбреА: рд╕реНрдкреНрд░рд╛рдЗрдЯреНрд╕ рдФрд░ рдпреВрдЖрдИред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХрддрд╛ рдХреЗ рдкрд╛рд╕ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╢реЗрдбрд░ рдХрдВрдкрд╛рдЗрд▓рд░ рдФрд░ рдХреНрд░реЙрд╕ рдХрдВрдкрд╛рдЗрд▓рд░ рд╣реИрдВред SRP рдХреЛ HLSLcc рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдРрд╕реЗ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдкрд░ рдЬреЛ OpenGL ES рдЧреНрд░рд╛рдлрд╝рд┐рдХреНрд╕ API (рдЬреИрд╕реЗ Android) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, HLSLcc рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИредрдЗрд╕рд▓рд┐рдП, рд╣рдо рдЗрд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рддреЗ рд╣реИрдВ: #pragma prefer_hlslcc gles
рд▓реЗрдХрд┐рди DirectX 9 рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдЬрдмрд░рди рдЕрдХреНрд╖рдо рдХрд░реЗрдВ: #pragma exclude_renderers d3d11_9x
рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, рдХреБрдЫ рднреА рдирд╣реАрдВ рдмрджрд▓рд╛ рд╣реИ, рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдЕрдм рд╣рдо рд╕реАрдЬреА рдореЗрдВ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рд╢реБрджреНрдз рдПрдЪрдПрд▓рдПрд╕рдПрд▓ рдореЗрдВ рд▓рд┐рдЦ рд░рд╣реЗ рд╣реИрдВ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдЕрдм рд╢реЗрдбрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд╛ рд╢рд░реАрд░ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛: HLSLPROGRAM ... ENDHLSL
-
_Time ,
_ScreenParams _WorldSpaceCameraPos . ,
UnityCG.cginc . , ,
UnityObjectToClipPos(POSITION) TransformWorldToHClip(POSITION) , тАФ
UNITY_APPLY_FOG(fogCoord, color) MixFog(color, fogCoord) .
, Core.hlsl:
% localappdata% \ Unity \ cache \ package \ package.unity.com \ com.unity.render- рдкрд╛рдЗрдкрд▓рд╛рдЗрдиреЛрдВред рд▓рд╛рдЗрдЯрд╡реЗрдЯ @ (LWRP рд╕рдВрд╕реНрдХрд░рдг) \ ShaderLibrary \ Core.hlsl
рд╣рдо рдЙрдкрд▓рдмреНрдз рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреА рдкреВрд░реА рд╕реВрдЪреА рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВредрдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЙрд▓реНрд▓реЗрдЦ рдХреЗ рд▓рд╛рдпрдХ рд▓рдЧрд╛рддрд╛рд░ рдмрдлрд╝рд░реНрд╕ (CBUFFER) рдФрд░ UnityPerMaterial рд╣реИрдВред рд▓рдЧрд╛рддрд╛рд░ рдмрдлрд╝рд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдбреЗрдЯрд╛ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ GPU рдкрд░ рдХреНрд░рдорд╢рдГ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрд░рдорд╢рдГ рдЗрдиреНрд╣реЗрдВ shader рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ рдореИрдХреНрд░реЛрдЬрд╝CBUFFER_START рдФрд░ CBUFFER_END рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ : CBUFFER_START(UnityPerMaterial) float4 _BaseMap_ST; half4 _BaseColor; half4 _SpecColor; half4 _EmissionColor; half _Cutoff; half _Smoothness; half _Metallic; half _BumpScale; half _OcclusionStrength; CBUFFER_END
рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рдпрд╛ рд╡рд┐рднрд┐рдиреНрди рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдХ рд╕реЗрдЯ рдЕрдк (рдХреЛрдб рдпрд╛ рдПрдиреАрдореЗрд╢рди рд╕реЗ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП) рдХреА рдШреЛрд╖рдгрд╛ рдкреБрд░рд╛рдиреЗ рдврдВрдЧ рд╕реЗ рдПрдХ shader рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд╢рд░реАрд░ рдХреЗ рдЕрдВрджрд░ рдЬрдЧрд╣ рд▓реЗрддрд╛ рд╣реИредLWRP рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд┐рд░рдВрддрд░ рдмрдлрд╝рд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ - UnityPerObject рдФрд░ UnityPerMaterial ред рдЗрди рдмрдлрд╝рд░реНрд╕ рдХреЛ рдПрдХ рдмрд╛рд░ рдмрд╛рдБрдз рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЗрдиреНрд╣реЗрдВ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рдореЛрдЯреЗ рддреМрд░ рдкрд░, рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдбреНрд░рд╛рдЗрдВрдЧ рдХреЗ рджреМрд░рд╛рди, рдирд┐рд░рдВрддрд░ рдмрдлрд╝рд░реНрд╕ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкреНрд░рдмрд▓рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдпрд╛ рд╕рд╛рдордЧреНрд░реА рдХреЗ рд▓рд┐рдП рд╕реЗрдЯрдкрд╛рд╕ рдХреЛ рдирд╣реАрдВ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рдлрд╛рдпрджреЗрдордВрдж рд╣реИ рдЬрдм рдХрдИ рд╢реЗрдбреНрд╕ рдПрдХ рд╣реА рдирд┐рд░рдВрддрд░ рдмрдлрд░ рд╕рд╛рдЭрд╛ рдХрд░рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ LWRP рдЗрд╕рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рд╕рд╛рдордЧреНрд░рд┐рдпреЛрдВ рдХреЛ рдкреИрдХреЗрдЬ рдХрд░ рд╕рдХрддрд╛ рд╣реИредрд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрджрд┐ рдЖрдк рдзреНрдпрд╛рди рд╕реЗ рд╢реИрдбрд░ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдирдХ рдбреЗрдЯрд╛ рд╣рд░ рдЬрдЧрд╣ рдирд┐рд░рдВрддрд░ рдмрдлрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИредрдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ, рд╕рднреА рдорддрднреЗрджреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рд▓реЗрдХрд┐рди рдЕрдВрдЧреНрд░реЗрдЬреА рдореЗрдВ, рдЖрдк рдпрд╣рд╛рдВ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ редрд╡реИрд╕реЗ, рдЕрдЧрд░ рдЖрдк рд╕рд░рдлреЗрд╕рдбрд╛рдЯрд╛ рдХреЛ рдХрд░реАрдм рд╕реЗ рджреЗрдЦрддреЗ рд╣реИрдВ: SurfaceData surfaceData;
рдЖрдк рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ ShaderGraph рд╕реЗ рдкреЛрд╖рд┐рдд PBR рдорд╛рд╕реНрдЯрд░ рд╣реИ редрдЙрджрд╛рд╣рд░рдг
рддреЛ, рдЕрдм рд╣рдорд╛рд░реЗ рд╣рд╛рде рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдЫреВрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐рдПрдХ рдмреИрдЪреЗрдирд▓ рдХреА рд╡реНрдпрд╡рд╕реНрдерд╛ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рдЖ рдЧрдпрд╛ рд╣реИ! рдЖрдЗрдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд░реНрдЯреЗрдХреНрд╕ рд╡рд┐рд╕реНрдерд╛рдкрди рдФрд░ рднрдВрдЧ рдкреНрд░рднрд╛рд╡ рдЬреЛрдбрд╝реЗрдВ , рдФрд░ рдмрд╛рдХреА рдиреГрддреНрдп рдХрд░реЗрдВред рдпрд╣ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ рдХрд┐ рд╕рднреА рдкрд╛рд╕ рд╣рдорд╛рд░реА рдЖрдВрдЦреЛрдВ рдХреЗ рд╕рд╛рдордиреЗ рд╣реИрдВ рдФрд░ рд╣рдо рд╕рдм рдХреБрдЫ рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЧреБрдгреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ:
Properties { ... _DissolveMap("Dissolve Map", 2D) = "white" {} _DissolveFactor("Dissolve Factor", Range(0, 1)) = 0.0 _DissolveWidth("Dissolve Width", Range(0, 1)) = 0.0 [HDR]_DissolveColor("Color", Color) = (1,1,0) }
рдЬреЛ рдирд┐рд╕реНрд╕рдВрджреЗрд╣ рдирд┐рд░реАрдХреНрд╖рдХ рдореЗрдВ рд╣рдорд╛рд░реЗ рдЕрдкрдиреЗ рдФрд░ рдкреНрд░рд┐рдп рдЯреИрдм рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛: рдЪрд░ рдЬреЛрдбрд╝реЗрдВ:
CBUFFER_START(UnityPerMaterial) ... float4 _DissolveMap_ST;
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╢рд░рд╛рдмреА рд╢рд░рд╛рдмреА рдХреЛ рдЬреНрдпрд╛рдорд┐рддрд┐ рднреЗрдЬреЗрдВ: Varyings LitPassVertex(Attributes input) { ... input.positionOS.xyz += normalize(input.positionOS.xyz) * sin(input.positionOS.x) * sin(_Time.x * 100); ... }
рдлрд┐рд░ рдЫрд╛рдпрд╛: Varyings ShadowPassVertex(Attributes input) { ... input.positionOS.xyz += normalize(input.positionOS.xyz) * sin(input.positionOS.x) * sin(_Time.x * 100); ... }
рдЧрд╣рд░рд╛рдИ: Varyings DepthOnlyVertex(Attributes input) { ... input.position.xyz += normalize(input.position.xyz) * sin(input.position.x) * sin(_Time.x * 100); ... }
рдЦреИрд░, рдЕрдм рд╕рдордп рдФрд░ рдЖрдВрджреЛрд▓рди рднрдВрдЧ: half4 LitPassFragment(Varyings input) : SV_Target { ...
рдЖрдк рдЫрд╛рдпрд╛ рдореЗрдВ рднреА рднрдВрдЧ рдХреЛ рд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдлрд┐рд░ рдХрд▓рд╛рдИ рдХреА рдПрдХ рдЭрд┐рд▓рдорд┐рд▓рд╛рд╣рдЯ рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рд╣реА рдЫрд╛рдпрд╛ рд╣реЛрдЧреА, рдЬреЛ рдХрд┐ рд╢реЗрдбрд░ рдЧреНрд░рд╛рдл рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдХрд╛рдлреА рдХрдард┐рди рд╣реИ , рдФрд░ рдпрд╣рд╛рдВ рдХреЛрдб рдХреА рдХреБрдЫ рдкрдВрдХреНрддрд┐рдпрд╛рдВ рд╣реИрдВред half4 ShadowPassFragment(Varyings input) : SV_TARGET { ... float4 mask = SAMPLE_TEXTURE2D(_DissolveMap, sampler_DissolveMap, input.uv); if (mask.r > _DissolveFactor) discard; ... }
рдЦреИрд░, рдЕрдВрддрд┐рдо shader рдХреЛрдб:SimpleDissolve Shader "TheProxor/LWRP/Dissolve + Vertex Offset" { Properties {
рдирд┐рд╖реНрдХрд░реНрд╖
рдЦреИрд░, рдпрд╣рд╛рдБ рдпрд╣ рд╕реНрдЯреЙрдХ рд▓реЗрдиреЗ рдХрд╛ рд╕рдордп рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЧрдпрд╛ рд╣реИ, LWRP рдореЗрдВ рдХреЛрдб рдХреЗ рд╕рд╛рде рд╢реЗрдб рд▓рд┐рдЦрдирд╛ рд╕рдВрднрд╡ рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЖрдкрдХреЗ рд╣рд╛рдереЛрдВ рдХреЛ рдмрд╣реБрдд рдореБрдХреНрдд рдХрд░рддрд╛ рд╣реИ, рдмреИрд╕рд╛рдЦреА рдХреЗ рдмрд┐рдирд╛ рд╢рд╛рдВрдд рдЪреАрдЬреЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдкрдХрд╛ рдкреНрд░рдХрд╛рд╢ рд╡реНрдпрд╡рд╕реНрдерд╛ред рдмреЗрд╢рдХ, рдпрд╣ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдФрд░ рдкрд░рд┐рдЪрд┐рдд рд╕реНрдЯреИрдВрдбрд░реНрдб рд╕рд░рдлреЗрд╕ рд╢реЗрдбрд░ рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдирд╣реАрдВ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ , рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рдХрд┐рд╕реА рджрд┐рди рдореБрдЭреЗ рдПрд▓рдбрдмреНрд▓реНрдпреВрдЖрд░рдкреА рдФрд░ рдПрдЪрдбреАрдЖрд░рдкреА рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдПрдирд╛рд▓реЙрдЧ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╣рд╛рде рдорд┐рд▓реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдХреБрдЫ рдФрд░ рд╕рдордп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВредрдЙрдкрдпреЛрдЧреА рд▓рд┐рдВрдХ:рд▓реЗрдЦ рдХреА рд╕рднреА рд╕рд╛рдордЧреНрд░рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рднрдВрдбрд╛рд░ рд╕рд╛рдордЧреНрд░реА рдХреАрддреИрдпрд╛рд░реА рдХреЗ рджреМрд░рд╛рди рдпрд╣ рдкрд╛рдпрд╛ рдЧрдпрд╛, рдЕрдиреМрдкрдЪрд╛рд░рд┐рдХ рдкреНрд░рд▓реЗрдЦрдиLWRP рдкреНрд░рд▓реЗрдЦрди