94 lines
2.9 KiB
Plaintext
94 lines
2.9 KiB
Plaintext
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
|
|
}
|
|
}
|
|
}
|