[Unity Shader] 컬러마스크 쉐이더를 이용한 커스터마이징 구현Unity/Shader2022. 4. 14. 23:58
Table of Contents
<녹화 영상>
기존에 사용하던 쉐이더에 컬러 마스크 기능 코드를 추가하여,
컬러 마스크 기능을 이용하여 커스터마이징을 구현하였다.
<구현에 참고한 쉐이더 튜토리얼>
다음은 쉐이더에 추가해야하는 부분이다.
먼저 변경할 쉐이더 상단 Properties부분에 필요한 변수들을 추가해 준다.
Properties
{
.
.
.
생략
_Mask("ColorMask (Red = Prim Green = Sec Blue = Ter)", 2D) = "white" {} // mask texture
_ColorPrim("Primary Color", Color) = (0.5,0.5,0.5,1) // primary color, replaces the red masked area
[Toggle] _Emis1("Primary: Emissive?", Float) = 0 // sets the color as emissive if toggled
_Value1("Primary: Blend Main Texture", Range(0,1)) = 0.5 // blend value with the original texture
_ColorSec("Secondary Color", Color) = (0.5,0.5,0.5,1) // secondary color, replaces green masked area
[Toggle] _Emis2("Secondary: Emissive?", Float) = 0// sets the color as emissive if toggled
_Value2("Secondary: Blend Main Texture", Range(0,1)) = 0.5// blend value with the original texture
_ColorTert("Tertiary Color", Color) = (0.5,0.5,0.5,1)// tertiary color, replaces blue masked area
[Toggle] _Emis3("Tertiary: Emissive?", Float) = 0// sets the color as emissive if toggled
_Value3("Tertiary: Blend Main Texture", Range(0,1)) = 0.5// blend value with the original textur
}
추가한 변수들은
마스크맵 텍스쳐 한장,
컬러3개(각각 RGB채널을 사용),
이미션 컬러인지 체크할 변수,
메인 텍스쳐와 얼마나 블렌딩할지 조절할 변수
이렇게 종류는 4종이다.
그리고!!
이 기능을 구현할려면 아트팀과 협업을 해야하는데 그 이유는
메인텍스쳐에서 컬러마스크를 사용할 부분을 명도만 남겨야하고 마스크맵도 만들어야 하기 때문이다.
<메인텍스쳐 예시>
<마스크맵 텍스쳐 예시>
RGB채널에 각각 1개의 색을 입힐 수 있다.
다음은
SubShader부분에 이렇게 변수를 선언해준다.
sampler2D _Mask; // mask texture
float4 _ColorPrim, _ColorSec, _ColorTert;// custom colors
float _Emis1, _Emis2, _Emis3; // emission toggles
float _Value1, _Value2, _Value3;// original texture blend values
그리고 Surf 함수를 수정해준다.
void surf (Input IN, inout SurfaceOutput o)
{
half4 main = tex2D(_MainTex, IN.uv_MainTex);
o.Albedo = main.rgb * _Color.rgb;
o.Alpha = main.a * _Color.a;
//Specular
o.Gloss = main.a;
o.Specular = _Shininess;
#if TCP2_BUMP
//Normal map
o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
#endif
}
<원본>
void surf(Input IN, inout SurfaceOutput o)
{
half4 main = tex2D(_MainTex, IN.uv_MainTex);
half4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color;
half4 m = tex2D(_Mask, IN.uv_MainTex); // mask based on the uvs
float3 PrimaryColor = _ColorPrim * m.r + ((c.rgb * _Value1) * m.r); // the 3 custom colours multiplied by the mask , so it only affects the masked areas,
float3 SecondaryColor = _ColorSec * m.g + ((c.rgb * _Value2) * m.g); // also multiplied by the original texture based on a blend value slider
float3 TertiaryColor = _ColorTert * m.b + ((c.rgb * _Value3) * m.b);
float3 NonMasked = c.rgb * (1 - m.r - m.g - m.b); // the part of the model thats not affected by the colour customisation
o.Albedo = NonMasked + PrimaryColor + SecondaryColor + TertiaryColor; // all parts added together form the new look for the model
o.Emission = PrimaryColor * _Emis1 + SecondaryColor * _Emis2 + TertiaryColor * _Emis3; // emissive only shows up when the toggles for their colours are toggled
o.Alpha = c.a;
/*o.Albedo = main.rgb * _Color.rgb;
o.Alpha = main.a * _Color.a;*/
//Specular
o.Gloss = main.a;
o.Specular = _Shininess;
#if TCP2_BUMP
//Normal map
float3 normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
normal.x *= _BumpStrength;
normal.y *= _BumpStrength;
o.Normal = normalize(normal.rgb);
#endif
}
<수정본>
이렇게하면 컬러마스크의 각 채널의 색을 바꿀 수 있다.
덤으로 노말맵의 강도를 조절하는 부분도 맨밑에 추가하였다.
<컬러조절 시연 영상>
'Unity > Shader' 카테고리의 다른 글
[Unity, Shader] 유니티 내장쉐이더 AlwaysVisible하게 만들기 (0) | 2022.10.02 |
---|---|
[Unity Shader] Foil Trading Card Shader (0) | 2022.06.11 |
URP 쉐이더그래프에서 SceneColor(기존GrabPass)쓸때 주의점 (0) | 2021.04.16 |