Shader "Hidden/AlphaFromNiloToon" { Properties { _MainTex ("Main Texture", 2D) = "white" {} _AlphaTex ("Alpha Texture (NiloToon Prepass)", 2D) = "white" {} _BlurRadius ("Blur Radius", Float) = 1.0 } SubShader { Tags { "RenderType"="Transparent" "Queue"="Transparent" } LOD 100 ZWrite Off Blend SrcAlpha OneMinusSrcAlpha Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; }; sampler2D _MainTex; sampler2D _AlphaTex; float4 _MainTex_ST; float4 _AlphaTex_TexelSize; float _BlurRadius; v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = TRANSFORM_TEX(v.uv, _MainTex); return o; } // 3x3 가우시안 블러 커널 (매우 가벼운 블러) fixed GaussianBlurAlpha(float2 uv) { float2 texelSize = _AlphaTex_TexelSize.xy * _BlurRadius; // 가우시안 가중치 (3x3 커널) fixed alpha = 0.0; // 중앙 픽셀 (가장 높은 가중치) alpha += tex2D(_AlphaTex, uv).g * 0.25; // 상하좌우 (중간 가중치) alpha += tex2D(_AlphaTex, uv + float2(0, texelSize.y)).g * 0.125; alpha += tex2D(_AlphaTex, uv + float2(0, -texelSize.y)).g * 0.125; alpha += tex2D(_AlphaTex, uv + float2(texelSize.x, 0)).g * 0.125; alpha += tex2D(_AlphaTex, uv + float2(-texelSize.x, 0)).g * 0.125; // 대각선 (낮은 가중치) alpha += tex2D(_AlphaTex, uv + float2(texelSize.x, texelSize.y)).g * 0.0625; alpha += tex2D(_AlphaTex, uv + float2(-texelSize.x, texelSize.y)).g * 0.0625; alpha += tex2D(_AlphaTex, uv + float2(texelSize.x, -texelSize.y)).g * 0.0625; alpha += tex2D(_AlphaTex, uv + float2(-texelSize.x, -texelSize.y)).g * 0.0625; return alpha; } fixed4 frag (v2f i) : SV_Target { // 메인 텍스처에서 RGB 가져오기 fixed4 col = tex2D(_MainTex, i.uv); // NiloToon Prepass 버퍼의 G 채널에서 알파 가져오기 (가우시안 블러 적용) fixed alpha = GaussianBlurAlpha(i.uv); // RGB는 그대로, 알파는 블러 처리된 값 사용 col.a = alpha; return col; } ENDCG } } }