Shader "Custom/BuiltIn_XRaySilhouette_FixedFeet" { Properties { _MainTex ("Texture", 2D) = "white" {} [HDR] _SilhouetteColor ("Silhouette Color", Color) = (0, 0.7, 1, 1) _SilhouetteInflation ("Silhouette Inflation", Range(0, 0.1)) = 0.005 // ⭐ [추가됨] 발바닥 높이 제한 설정 // 이 높이보다 아래에 있는 부분은 실루엣을 그리지 않습니다. _FeetCutoff ("Feet Cutoff Height", Range(0, 2.0)) = 0.2 } SubShader { Tags { "RenderType"="Opaque" "Queue"="Transparent" } LOD 200 // ======================================================== // Pass 1: 가려졌을 때 (실루엣) // ======================================================== Pass { Name "Silhouette" ZTest Greater // 가려지면 그림 ZWrite Off Cull Back Blend SrcAlpha OneMinusSrcAlpha CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; float3 normal : NORMAL; }; struct v2f { float4 vertex : SV_POSITION; float localY : TEXCOORD1; // ⭐ 높이 정보를 기억할 변수 }; float4 _SilhouetteColor; float _SilhouetteInflation; float _FeetCutoff; // ⭐ 추가된 변수 v2f vert (appdata v) { v2f o; // 1. 발바닥(Y) 높이를 픽셀 쉐이더로 넘겨줌 // (보통 캐릭터의 피봇(중심점)은 발바닥(0)에 있습니다) o.localY = v.vertex.y; // 2. 부풀리기 계산 float3 inflatedPos = v.vertex.xyz + v.normal * _SilhouetteInflation; o.vertex = UnityObjectToClipPos(inflatedPos); return o; } fixed4 frag (v2f i) : SV_Target { // ⭐ 핵심: 현재 그리는 픽셀의 높이가 설정값보다 낮으면 버림! // clip(x) 함수는 x가 0보다 작으면 렌더링을 포기합니다. clip(i.localY - _FeetCutoff); return _SilhouetteColor; } ENDCG } // ======================================================== // Pass 2: 안 가려졌을 때 (정상 캐릭터) - 기존과 동일 // ======================================================== Pass { Name "Forward" Tags { "LightMode" = "ForwardBase" } ZTest LEqual ZWrite On CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float4 vertex : SV_POSITION; float2 uv : TEXCOORD0; }; sampler2D _MainTex; float4 _MainTex_ST; v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = TRANSFORM_TEX(v.uv, _MainTex); return o; } fixed4 frag (v2f i) : SV_Target { return tex2D(_MainTex, i.uv); } ENDCG } } FallBack "Diffuse" }