Shader "Custom/URPOutline" { Properties { _BaseColor("Base Color", Color) = (1,1,1,1) _OutlineColor("Outline Color", Color) = (1,0,0,1) _OutlineWidth("Outline Width", Range(0, 0.1)) = 0.05 } SubShader { Tags { "RenderType"="Opaque" "RenderPipeline"="UniversalPipeline" "Queue"="Geometry" } // 第一个Pass:渲染描边 Pass { Name "Outline" Tags { "LightMode" = "SRPDefaultUnlit" } Cull Front ZWrite On 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 positionCS : SV_POSITION; }; CBUFFER_START(UnityPerMaterial) float4 _OutlineColor; float _OutlineWidth; CBUFFER_END Varyings vert(Attributes input) { Varyings output; // 沿法线方向膨胀顶点 float3 normalOS = normalize(input.normalOS); float3 positionOS = input.positionOS.xyz + normalOS * _OutlineWidth; output.positionCS = TransformObjectToHClip(positionOS); return output; } half4 frag(Varyings input) : SV_Target { return _OutlineColor; } ENDHLSL } // 第二个Pass:渲染物体本身 Pass { Name "ForwardLit" Tags { "LightMode" = "UniversalForward" } Cull Back ZWrite On HLSLPROGRAM #pragma vertex vert #pragma fragment frag #pragma multi_compile _ _MAIN_LIGHT_SHADOWS #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" struct Attributes { float4 positionOS : POSITION; float3 normalOS : NORMAL; }; struct Varyings { float4 positionCS : SV_POSITION; float3 normalWS : TEXCOORD0; }; CBUFFER_START(UnityPerMaterial) float4 _BaseColor; CBUFFER_END Varyings vert(Attributes input) { Varyings output; output.positionCS = TransformObjectToHClip(input.positionOS.xyz); output.normalWS = TransformObjectToWorldNormal(input.normalOS); return output; } half4 frag(Varyings input) : SV_Target { // 基础光照 Light mainLight = GetMainLight(); float3 normalWS = normalize(input.normalWS); float NdotL = saturate(dot(normalWS, mainLight.direction)); float3 color = _BaseColor.rgb * (mainLight.color * NdotL + 0.2); return half4(color, _BaseColor.a); } ENDHLSL } } }