рдПрдХрддрд╛ рдореЗрдВ LWRP рдкрд░ рдПрдХ рд░реВрдкрд░реЗрдЦрд╛ рддреИрдпрд╛рд░ рдХрд░рдирд╛

рдирдорд╕реНрддреЗ

рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рддрд╛ рд╣реВрдВ рдХрд┐ рдПрдХрддрд╛ рдореЗрдВ рдирдИ рд▓рд╛рдЗрдЯрд╡реЗрдЯ рд░реЗрдВрдбрд░ рдкрд╛рдЗрдкрд▓рд╛рдЗрди (LWRP) рдкрд░ рдПрдХ рд╕рд░рд▓ рд░реВрдкрд░реЗрдЦрд╛ рдкреНрд░рднрд╛рд╡ рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдПред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХрддрд╛ рд╕рдВрд╕реНрдХрд░рдг 2018.3 рдФрд░ рдЙрдЪреНрдЪрддрд░, рд╕рд╛рде рд╣реА LWRP рд╕рдВрд╕реНрдХрд░рдг 4.0.0 рдФрд░ рдЙрдЪреНрдЪрддрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдХреНрд▓рд╛рд╕рд┐рдХ рд░реВрдкрд░реЗрдЦрд╛ рдореЗрдВ рджреЛ-рдкрд╛рд╕ рд╢реЗрдбрд░ рд╣реЛрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди LWRP рдХреЗрд╡рд▓ рд╕рд┐рдВрдЧрд▓-рдкрд╛рд╕ рд╢реЗрдбреНрд╕ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред LWRP рдореЗрдВ рдЗрд╕ рдЦрд╛рдореА рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХреЗ рдХреБрдЫ рдЪрд░рдгреЛрдВ рдореЗрдВ рдХрд╕реНрдЯрдо рдкрд╛рд╕ рдЬреЛрдбрд╝рдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЧрдпрд╛:

IAfterDepthPrePass IAfterOpaquePass IAfterOpaquePostProcess IAfterSkyboxPass IAfterTransparentPass IAfterRender 

рдЯреНрд░реЗрдирд┐рдВрдЧ


рд╣рдореЗрдВ рджреЛ рд╢реЗрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

рдкрд╣рд▓реЗ рдореИрдВ рдЕрдирд▓рд┐рдЯ рдХрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдЖрдк рдПрдХ рдФрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдореБрдЦреНрдп рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рд╕реНрдЯреИрдВрд╕рд┐рд▓ рдирд┐рд░реНрдорд╛рдг рдХреЛ shader рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рд╣реИред

рдмрд┐рдирд╛ рд░рдВрдЧ рдХрд╛
 Shader "Unlit/SimpleColor" { SubShader { Tags { "RenderType"="Opaque" } LOD 100 Pass { Tags { "LightMode" = "LightweightForward" } Stencil { Ref 2 Comp always Pass replace } HLSLPROGRAM #pragma vertex vert #pragma fragment frag #include "Packages/com.unity.render-pipelines.lightweight/ShaderLibrary/Core.hlsl" struct appdata { float4 vertex : POSITION; }; struct v2f { float4 vertex : SV_POSITION; }; v2f vert (appdata v) { v2f o; o.vertex = TransformObjectToHClip(v.vertex.xyz); return o; } half4 frag (v2f i) : SV_Target { return half4(0.5h, 0.0h, 0.0h, 1.0h); } ENDHLSL } } } 


рджреВрд╕рд░рд╛ рд╕рдмрд╕реЗ рд╕рд░рд▓ рд░реВрдкрд░реЗрдЦрд╛ рд╕реНрд╡рдпрдВ рд╣реИред

рд╕рд░рд▓ рд░реВрдкрд░реЗрдЦрд╛
 Shader "Unlit/SimpleOutline" { SubShader { Tags { "RenderType"="Opaque" } LOD 100 Pass { Stencil { Ref 2 Comp notequal Pass keep } HLSLPROGRAM #pragma vertex vert #pragma fragment frag #include "Packages/com.unity.render-pipelines.lightweight/ShaderLibrary/Core.hlsl" struct appdata { float4 vertex : POSITION; }; struct v2f { float4 vertex : SV_POSITION; }; half4 _OutlineColor; v2f vert (appdata v) { v2f o; v.vertex.xyz += 0.2 * normalize(v.vertex.xyz); o.vertex = TransformObjectToHClip(v.vertex.xyz); return o; } half4 frag (v2f i) : SV_Target { return _OutlineColor; } ENDHLSL } } } 


рдХрд╕реНрдЯрдо рдкрд╛рд╕


рдПрдХ рдХрд╕реНрдЯрдо рдкрд╛рд╕ рд▓рд┐рдЦрдирд╛ рд╕рд╛рдорд╛рдиреНрдп рдореЛрдиреЛрд╣реЗрд╡рд┐рдпрд░ рдмрдирд╛рдиреЗ рдФрд░ рдЙрдкрд░реЛрдХреНрдд рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдЗрдВрдЯрд░рдлреЗрд╕ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред рд╣рдо IAfterOpaquePass рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд░реВрдкрд░реЗрдЦрд╛ рдХреЗрд╡рд▓ рдЕрдкрд╛рд░рджрд░реНрд╢реА рд╡рд╕реНрддреБрдУрдВ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрдЧреАред

 public class OutlinePass : MonoBehaviour, IAfterOpaquePass { public ScriptableRenderPass GetPassToEnqueue(RenderTextureDescriptor baseDescriptor, RenderTargetHandle colorAttachmentHandle, RenderTargetHandle depthAttachmentHandle) { //... } } 

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

рдЕрдм рдЖрдЗрдП рд╕реНрд╡рдпрдВ рдЧрджреНрдпрд╛рдВрд╢ рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, ScriptableRenderPass рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рдПрдХ рд╡рд░реНрдЧ рдмрдирд╛рдПрдВ

 public class OutlinePassImpl : ScriptableRenderPass { public OutlinePassImpl() { //... } public override void Execute(ScriptableRenderer renderer, ScriptableRenderContext context, ref RenderingData renderingData) { //... } } 

рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ, рд╣рдо рдорд╛рд░реНрдЧ рдХрд╛ рдирд╛рдо рдкрдВрдЬреАрдХреГрдд рдХрд░рддреЗ рд╣реИрдВ, рдардВрдбрд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рджреГрд╢реНрдп рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рдордЧреНрд░реА рдФрд░ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдмрдирд╛рддреЗ рд╣реИрдВред рдлрд╝рд┐рд▓реНрдЯрд░ рдореЗрдВ, рд╣рдо рдХреЗрд╡рд▓ рдЕрдкрд╛рд░рджрд░реНрд╢реА рд╡рд╕реНрддреБрдПрдБ рд╕реЗрдЯ рдХрд░реЗрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЕрдкрд╛рд░рджрд░реНрд╢реА рдкрд╛рд╕ рдХреЗ рдмрд╛рдж рдЕрдкрдирд╛ рдкрд╛рд╕ рдЬреЛрдбрд╝ рджреЗрдВрдЧреЗред

рдирд┐рд╖реНрдкрд╛рджрди рд╕рдорд╛рд░реЛрд╣ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд░реЗрдВрдбрд░ рдлрд╝рдВрдХреНрд╢рди рд╣реИред рдЗрд╕рдореЗрдВ, рд╣рдо рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдмрдирд╛рддреЗ рд╣реИрдВ, рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдмрдирд╛рдИ рдЧрдИ рд╕рд╛рдордЧреНрд░реА рдХреЛ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдмрдирд╛рдП рдЧрдП рдлрд╝рд┐рд▓реНрдЯрд░ рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╕рднреА рджреГрд╢реНрдпрдорд╛рди рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд░реЗрдВрдбрд░ рдХрд░рддреЗ рд╣реИрдВред

OutlinePassImpl рдЬреЛ рдореБрдЭ рдкрд░ рдирд┐рдХрд▓рд╛
 public class OutlinePassImpl : ScriptableRenderPass { private Material outlineMaterial; private FilterRenderersSettings m_OutlineFilterSettings; private int OutlineColorId; public OutlinePassImpl(Color outlineColor) { //      ,   ,    // SimpleColor RegisterShaderPassName("LightweightForward"); //   outline shader,   outlineMaterial = CoreUtils.CreateEngineMaterial("Unlit/SimpleOutline"); OutlineColorId = Shader.PropertyToID("_OutlineColor"); outlineMaterial.SetColor(OutlineColorId, outlineColor); m_OutlineFilterSettings = new FilterRenderersSettings(true) { renderQueueRange = RenderQueueRange.opaque, }; } public override void Execute(ScriptableRenderer renderer, ScriptableRenderContext context, ref RenderingData renderingData) { Camera camera = renderingData.cameraData.camera; SortFlags sortFlags = renderingData.cameraData.defaultOpaqueSortFlags; // a       DrawRendererSettings drawSettings = CreateDrawRendererSettings(camera, sortFlags, RendererConfiguration.None, renderingData.supportsDynamicBatching); drawSettings.SetOverrideMaterial(outlineMaterial, 0); context.DrawRenderers(renderingData.cullResults.visibleRenderers, ref drawSettings, m_OutlineFilterSettings); } } 


рдЕрдм OutlinePass рдХреНрд▓рд╛рд╕ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ OutlinePassImpl рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ рдФрд░ рд▓рд┐рдВрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЖрдк рд░рдирдЯрд╛рдЗрдо рдореЛрдб рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрд╛рд╕ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд░реВрдкрд░реЗрдЦрд╛ рдХрд╛ рд░рдВрдЧ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдПред

рдЖрдЙрдЯрд▓рд╛рдЗрдирдкрд╛рд╕ рдЬреЛ рдореЗрд░реЗ рд▓рд┐рдП рдирд┐рдХрд▓рд╛
 public class OutlinePass : MonoBehaviour, IAfterOpaquePass { public Color OutlineColor; private OutlinePassImpl outlinePass; public ScriptableRenderPass GetPassToEnqueue(RenderTextureDescriptor baseDescriptor, RenderTargetHandle colorAttachmentHandle, RenderTargetHandle depthAttachmentHandle) { return outlinePass ?? (outlinePass = new OutlinePassImpl(OutlineColor)); } } 


рдЕрдм рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рджреГрд╢реНрдп рд╕реЗрдЯ рдХрд░реЗрдВред

  1. SimpleColor рдЫрд╛рдпрд╛ рд╕реЗ рд╕рд╛рдордЧреНрд░реА рдмрдирд╛рдПрдБ
  2. рдЙрд╕ рдкрд░ рдПрдХ рдХреНрдпреВрдм рдФрд░ рд╣реИрдВрдЧ рдордЯреЗрд░рд┐рдпрд▓ рдмрдирд╛рдПрдВред
  3. рдХреИрдорд░реЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрдЙрдЯрд▓рд╛рдЗрдирдкрд╛рд╕ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЬреЛрдбрд╝реЗрдВ рдФрд░ рд░рдВрдЧ рд╕реЗрдЯ рдХрд░реЗрдВред
  4. рдФрд░ рдкреНрд▓реЗ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ

рдЖрдЙрдЯрд▓рд╛рдЗрди рдХреЗрд╡рд▓ рдЧреЗрдо рд╡реНрдпреВ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдЧреАред

рдпрд╣рд╛рдБ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред



рдмреЛрдирд╕: рджреЛрд╕реНрдд-рджреБрд╢реНрдорди рдмреИрдХрд▓рд╛рдЗрдЯ


рджреГрд╢реНрдпрдорд╛рди рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдЖрдк рдЗрд╕ рдорд╛рд░реНрдЧ рдХреЛ рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдпрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рдореВрд╣ рдкрд░ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░рдд рдпрд╛ рд░реЗрдВрдбрд░ рдкрд░рдд рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдЧреЗрдо рд▓реЙрдЬрд┐рдХ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЛ рдмрджрд▓ рджреЗрдВ рддрд╛рдХрд┐ "рдорд┐рддреНрд░" рдкрд░рдд рд╡рд╛рд▓реА рд╕рднреА рд╡рд╕реНрддреБрдУрдВ рдореЗрдВ рдПрдХ рд╣рд░реЗ рд░рдВрдЧ рдХреА рд░реВрдкрд░реЗрдЦрд╛ рд╣реЛ, рдФрд░ "рджреБрд╢реНрдорди" рдкрд░рдд рд▓рд╛рд▓ рд╣реЛред

OutlinePass рдФрд░ OutlinePassImpl
 public class OutlinePass : MonoBehaviour, IAfterOpaquePass { [System.Serializable] public class OutlineData { public Color Color; public LayerMask Layer; } public List<OutlineData> outlineDatas = new List<OutlineData>(); private OutlinePassImpl outlinePass; public ScriptableRenderPass GetPassToEnqueue(RenderTextureDescriptor baseDescriptor, RenderTargetHandle colorAttachmentHandle, RenderTargetHandle depthAttachmentHandle) { return outlinePass ?? (outlinePass = new OutlinePassImpl(outlineDatas)); } } public class OutlinePassImpl : ScriptableRenderPass { private Material[] outlineMaterial; private FilterRenderersSettings[] m_OutlineFilterSettings; public OutlinePassImpl(List<OutlinePass.OutlineData> outlineDatas) { RegisterShaderPassName("LightweightForward"); outlineMaterial = new Material[outlineDatas.Count]; m_OutlineFilterSettings = new FilterRenderersSettings[outlineDatas.Count]; Shader outlineShader = Shader.Find("Unlit/SimpleOutline"); int OutlineColorId = Shader.PropertyToID("_OutlineColor"); for (int i = 0; i < outlineDatas.Count; i++) { OutlinePass.OutlineData outline = outlineDatas[i]; Material material = CoreUtils.CreateEngineMaterial(outlineShader); material.SetColor(OutlineColorId, outline.Color); outlineMaterial[i] = material; m_OutlineFilterSettings[i] = new FilterRenderersSettings(true) { renderQueueRange = RenderQueueRange.opaque, layerMask = outline.Layer }; } } public override void Execute(ScriptableRenderer renderer, ScriptableRenderContext context, ref RenderingData renderingData) { Camera camera = renderingData.cameraData.camera; SortFlags sortFlags = renderingData.cameraData.defaultOpaqueSortFlags; DrawRendererSettings drawSettings = CreateDrawRendererSettings(camera, sortFlags, RendererConfiguration.None, renderingData.supportsDynamicBatching); for (int i = 0; i < outlineMaterial.Length; i++) { drawSettings.SetOverrideMaterial(outlineMaterial[i], 0); context.DrawRenderers(renderingData.cullResults.visibleRenderers, ref drawSettings, m_OutlineFilterSettings[i]); } } } 


рджреГрд╢реНрдп рдкрд░, "рдорд┐рддреНрд░" рдФрд░ "рд╢рддреНрд░реБ" рдкрд░рддреЗрдВ рдЬреЛрдбрд╝реЗрдВ, рдХреНрдпреВрдм рдХреЛ рдХрдИ рдмрд╛рд░ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХрд░реЗрдВ, рдЙрдиреНрд╣реЗрдВ "рдорд┐рддреНрд░" рдпрд╛ "рджреБрд╢реНрдорди" рдХреЛ рдкрд░рддреЗрдВ рдЕрд╕рд╛рдЗрди рдХрд░реЗрдВ, рдЖрдЙрдЯрд▓рд╛рдЗрди рдкрд╛рд╕ рд╕реЗрдЯ рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рдЪрд▓рд╛рдПрдВред



рдФрд░ рдпрд╣реА рд╣рдореЗрдВ рдорд┐рд▓рддрд╛ рд╣реИред



рдирд┐рд╖реНрдХрд░реНрд╖


рдПрдХрддрд╛ рдореЗрдВ рдирдпрд╛ рдкреНрд░рддрд┐рдкрд╛рджрди рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдЬреЛ рджрд┐рд▓рдЪрд╕реНрдк рдкреНрд░рднрд╛рд╡реЛрдВ рдХреЛ рдмрд╣реБрдд рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИред

рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд▓реЗрдЦ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд░рд╣рд╛ рд╣реЛрдЧрд╛ред рдпрджрд┐ рдХрд┐рд╕реА рдХреЗ рдкрд╛рд╕ рдХреЛрдИ рдкреНрд░рд╢реНрди рд╣реИрдВ, рддреЛ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рджреЗрдЦреЗрдВред

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


All Articles