Shader "URP/WhiteOutline" { Properties { _OutlineWidth("Outline Width", Range(0, 0.1)) = 0.00003 _OutlineColor("Outline Color", Color) = (0, 0, 0, 1) _Color("Base Color", Color) = (1, 1, 1, 1) } SubShader { Tags { "RenderType" = "Opaque" "RenderPipeline" = "UniversalPipeline" } // 描边Pass Pass { Name "Outline" Tags { "LightMode" = "SRPDefaultUnlit" } Cull Front HLSLPROGRAM #pragma vertex vert #pragma fragment frag #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" struct Attributes { float4 positionOS : POSITION; float3 normalOS : NORMAL; }; struct Varyings { float4 positionHCS : SV_POSITION; }; CBUFFER_START(UnityPerMaterial) float _OutlineWidth; float4 _OutlineColor; CBUFFER_END Varyings vert(Attributes IN) { Varyings OUT; // 顶点扩展 float3 normalOS = normalize(IN.normalOS); float3 positionOS = IN.positionOS.xyz + normalOS * _OutlineWidth; // 转换到裁剪空间 OUT.positionHCS = TransformObjectToHClip(positionOS); return OUT; } half4 frag(Varyings IN) : SV_Target { return _OutlineColor; } ENDHLSL } // 主颜色Pass Pass { Name "ForwardLit" Tags { "LightMode" = "UniversalForward" } Cull Back HLSLPROGRAM #pragma vertex vert #pragma fragment frag #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" struct Attributes { float4 positionOS : POSITION; }; struct Varyings { float4 positionHCS : SV_POSITION; }; CBUFFER_START(UnityPerMaterial) float4 _Color; CBUFFER_END Varyings vert(Attributes IN) { Varyings OUT; OUT.positionHCS = TransformObjectToHClip(IN.positionOS.xyz); return OUT; } half4 frag(Varyings IN) : SV_Target { return _Color; } ENDHLSL } } }