AnyPortrait > 스크립트 > 커스텀 쉐이더

커스텀 쉐이더


AnyPortrait에서 제공하는 쉐이더가 아닌, 사용자가 직접 쉐이더를 작성해서 사용하는 방법입니다.
커스텀 쉐이더를 적용하고 Bake하는 방법은 관련 페이지를 참고하세요.
클리핑 마스크 유무에 따라 2가지 종류의 쉐이더 코드 작성 요령이 있습니다.




기본 쉐이더 작성 방법



1. 프로퍼티
_Color("2X Color (RGBA Mul)", Color) = (0.5, 0.5, 0.5, 1.0)
_MainTex("Main Texture (RGBA)", 2D) = "white" {}:
: 기본적으로 AnyPortrait는 2개의 프로퍼티만 사용을 합니다.
색상 애니메이션을 위한 _Color 프로퍼티와 텍스쳐가 적용될 _MainTex 프로퍼티를 선언해주면 연동이 됩니다.
이 두개의 프로퍼티를 외부에서 제어하면 AnyPortrait의 로직과 충돌될 수 있습니다.


2. 블렌딩
Blend SrcAlpha OneMinusSrcAlpha : Alpha Blend
Blend One One : Additive
Blend OneMinusDstColor One : Soft Additive
Blend DstColor SrcColor : Multiplicative
: AnyPortrait에서 사용되는 4개의 블렌딩 방식입니다.
위와 같이 작성하시거나 필요에 따라 다른 블렌딩 선언을 하셔도 상관없습니다.


3. Albedo, Alpha 계산
half4 c = tex2D(_MainTex, IN.uv_MainTex);
c.rgb *= _Color.rgb * 2.0f;
o.Alpha = c.a * _Color.a;
o.Albedo = c.rgb;
: 색상 계산식은 기본적으로 2X Multiply를 적용합니다.
RGB는 2배로 하며, Alpha는 그대로 곱하여 적용하는 것이 기본입니다.
필요에 따라 변경할 수 있지만 에디터의 렌더링 결과와 다르게 나타날 수 있습니다.




클리핑 마스크 쉐이더 작성 방법



1. 프로퍼티
_MaskTex("Mask Texture (A)", 2D) = "white" {}
_MaskScreenSpaceOffset("Mask Screen Space Offset (XY_Scale)", Vector) = (0, 0, 0, 1)
: 클리핑 마스크 처리를 위해서 마스크 텍스쳐를 프로퍼티에 추가합니다.
위와 같이 프로퍼티를 추가하면 AnyPortrait에서 자동으로 클리핑 렌더링을 처리합니다.
_MaskScreenSpaceOffset은 클리핑 마스크를 화면 좌표계(Screen Space)를 기준으로 적용하기 위한 프로퍼티입니다.


2. Screen Space Semantic
struct Input
{
           float2 uv_MainTex;
           float4 screenPos;
           float4 color : COLOR;
};
: 클리핑 마스크는 화면 좌표계(Screen Space)에서 처리됩니다.
따라서 유니티에서 사용하는 screenPos 변수를 프래그먼트 쉐이더(Fragment Shader),
또는 서피스 쉐이더(Surface Shader)에 전달해야합니다.


3. Mask 계산
float2 screenUV = IN.screenPos.xy / IN.screenPos.w;
screenUV -= float2(0.5f, 0.5f);
screenUV.x *= _MaskScreenSpaceOffset.z;
screenUV.y *= _MaskScreenSpaceOffset.w;
screenUV.x += _MaskScreenSpaceOffset.x * _MaskScreenSpaceOffset.z;
screenUV.y += _MaskScreenSpaceOffset.y * _MaskScreenSpaceOffset.w;
screenUV += float2(0.5f, 0.5f);
float mask = tex2D(_MaskTex, screenUV).r;
c.a *= mask;
: 클리핑 마스크를 계산하여 알파채널에 적용하는 식입니다.
이 식은 동일하게 작성해야 정상적으로 처리 됩니다.