Shader "URP_Test/PostOutline_2" { Properties { _MainTex ("Texture", 2D) = "white" {} _SampleDistance ("SampleDistance", Float) = 0.01 } SubShader { Tags { "RenderType"="Opaque" "RenderPipeline" = "UniversalPipeline" } Cull Off ZWrite Off ZTest Off Pass { Name "DrawEdge" // 轮廓 HLSLPROGRAM #pragma vertex VERT #pragma fragment FRAG #pragma target 2.0 #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" CBUFFER_START(UnityPerMaterial) float4 _MainTex_TexelSize; float _SampleDistance; CBUFFER_END TEXTURE2D(_MainTex); SAMPLER(sampler_MainTex); struct a2v { float4 positionOS : POSITION; float2 uv0 : TEXCOORD; }; struct v2f { float4 positionCS : SV_POSITION; float4 texcoord0 : TEXCOORD0; }; v2f VERT(a2v i) { v2f o; o.positionCS = TransformObjectToHClip(i.positionOS.xyz); o.texcoord0 = float4(i.uv0, _SampleDistance * _MainTex_TexelSize.x, _SampleDistance * _MainTex_TexelSize.y); return o; } half4 FRAG(v2f i):SV_TARGET { half4 centerCol = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, i.texcoord0.xy); half offsetX = i.texcoord0.z; half offsetY = i.texcoord0.w; half4 leftCol = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, i.texcoord0.xy + float2(-offsetX, 0)); half4 rightCol = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, i.texcoord0.xy + float2(offsetX, 0)); half4 upCol = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, i.texcoord0.xy + float2(0, offsetY)); half4 downCol = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, i.texcoord0.xy + float2(0, -offsetY)); // // 左下角 // half4 leftDownCol = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, i.texcoord0.xy + float2(-offsetX, -offsetY)); // // 右下角 // half4 rightDownCol = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, i.texcoord0.xy + float2(offsetX, -offsetY)); // // 左上角 // half4 leftUpCol = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, i.texcoord0.xy + float2(-offsetX, offsetY)); // // 右上角 // half4 rightUpCol = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, i.texcoord0.xy + float2(offsetX, offsetY)); // 检测是否是边缘 if (centerCol.a < 0.5) { if (leftCol.a > 0.5) { return half4(leftCol.xyz, 1); } if (rightCol.a > 0.5) { return half4(rightCol.xyz, 1); } if (upCol.a > 0.5) { return half4(upCol.xyz, 1); } if (downCol.a > 0.5) { return half4(downCol.xyz, 1); } // if (leftDownCol.a > 0.5) { // return half4(leftDownCol.xyz, 1); // } // if (rightDownCol.a > 0.5) { // return half4(rightDownCol.xyz, 1); // } // if (leftUpCol.a > 0.5) { // return half4(leftUpCol.xyz, 1); // } // if (rightUpCol.a > 0.5) { // return half4(rightUpCol.xyz, 1); // } } return half4(0,0,0,0); } ENDHLSL } } }