7 – 01 ~ 02 버텍스 컬러(Vertex Color) / 마스킹 기능 (Unity Shader)

7 – 01 버텍스 컬러(Vertex Color)

Version : Unity 2021.3.5f1

버텍스 안에 내장되어 있는 값을 엔진으로부터 요청해야 사용할 수 있는 정보

위치(position), UV(Texcoord), 컬러(Color), 노멀(Normal), 탄젠트(Tangent) 등에서 컬러를 이용하여 사용하는 방법입니다.

아무런 작업도 진행하지 않은 버텍스 컬러는 무조건 흰색입니다.

float4(1,1,1,1)이 들어 있다고 할 수 있습니다.

https://docs.unity3d.com/kr/2021.3/Manual/SL-SurfaceShaders.html

버텍스 컬러를 적용하는 방법은 다양한 방법이 있는데

3ds Max와 같은 3D DCC(Digital Contents Creation) 툴을 이용하거나 엔진의 자체 기능을 이용해서 그리는 것입니다.

Unity 내부에서 사용하기 위해서 Packages Manager에서 Polybrush를 받아줍니다.

다음은 버텍스를 확인하기 위한 설정입니다.

이때 아무리 색을 칠해도 변화가 없습니다.

유니티는 자체적으로 Texture만 보여주도록 쉐이더가 적용되어 있기 때문에,

버텍스 컬러를 따로 보기 위한 쉐이더가 필요합니다.

다음은 버텍스 컬러를 눈으로 확인 하기 위하여 쉐이더 코드를 수정합니다.

Shader "Custom/VertextTest"
{
    Properties
    {
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 200

        CGPROGRAM
        #pragma surface surf Standard
        #pragma target 3.0
        sampler2D _MainTex;

        struct Input
        {
            float2 uv_MainTex;
            float4 color:COLOR; // float4 color 변수를 만들고 태그를 달아줌
        };

        void surf (Input IN, inout SurfaceOutputStandard o)
        {
            fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
            o.Emission = IN.color.rgb;
            o.Alpha = c.a;
        }
        ENDCG
    }
    FallBack "Diffuse"
}

버텍스 컬러라는 것도 결국 버텍스의 값, 즉 엔진에서 가지고 있는 값을 요청해야 하므로 Input에서 float4를 통해서

Color(색)을 요청해야 합니다.

Input에 요청해서 가져 왔다면 IN. 을 통해서 Input 안의 color 값을 가져오고

Albedo 에 적용하게 되면 버텍스 컬러가 정상적으로 출력됩니다.

이제 이쁘게 색칠해 줍니다.

잘 보이네요

이제 적당한 텍스쳐를 넣고  버텍스 컬러를 더하거나 곱해줍니다.

이러한 기능을 이용하여 저렴한 비용으로 다양한 효과를 줄 수 있습니다.


7 – 02 버텍스 컬러(Vertex Color)의 마스킹 기능

버텍스 컬러는 일반적인 컬러와 동일하게 RGBA로 구성되어 있으며,

일반적인 텍스쳐가 가지고 있어야 하는 UV와 아무 상관이 없기 때문에 활용 범위가 매우 다양합니다.

아까 코드에서 4가지의 텍스쳐를 받을 수 있는 쉐이더로 변경합니다.

Shader "Custom/VertextTest"
{
    Properties
    {
        _MainTex1("Albedo1 (RGB)", 2D) = "white" {}
        _MainTex2("Albedo2 (RGB)", 2D) = "white" {}
        _MainTex3("Albedo3 (RGB)", 2D) = "white" {}
        _MainTex4("Albedo4 (RGB)", 2D) = "white" {}
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 200

        CGPROGRAM
        #pragma surface surf Standard
        #pragma target 3.0
        sampler2D _MainTex1;
        sampler2D _MainTex2;
        sampler2D _MainTex3;
        sampler2D _MainTex4;

        struct Input
        {
            float2 uv_MainTex1;
            float2 uv_MainTex2;
            float2 uv_MainTex3;
            float2 uv_MainTex4;
            float4 color:COLOR;
        };

        void surf (Input IN, inout SurfaceOutputStandard o)
        {
            fixed4 c = tex2D (_MainTex1, IN.uv_MainTex1);
            fixed4 d = tex2D(_MainTex2, IN.uv_MainTex2);
            fixed4 e = tex2D(_MainTex3, IN.uv_MainTex3);
            fixed4 f = tex2D(_MainTex4, IN.uv_MainTex4);
            o.Emission = c.rgb;
            o.Alpha = c.a;
        }
        ENDCG
    }
    FallBack "Diffuse"
}

지금은 텍스쳐가 한장만 보이게 o.Emission 을 설정 했습니다. 

lerp 함수를 이용하여 마스킹 기능으로 활용해 봅시다.

lerp 함수로 버텍스 컬러의 R 값을 이용하여 마스킹 기능으로 이용했습니다.

Shader "Custom/Vertex"
{
    Properties
    {
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _MainTex2 ("Albedo (RGB)", 2D) = "white" {}
        _MainTex3 ("Albedo (RGB)", 2D) = "white" {}
        _MainTex4 ("Albedo (RGB)", 2D) = "white" {}
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 200

        CGPROGRAM
        
        #pragma surface surf Standard noambient
        #pragma target 3.0

        sampler2D _MainTex;
        sampler2D _MainTex2;
        sampler2D _MainTex3;
        sampler2D _MainTex4;

        struct Input
        {
            float2 uv_MainTex;
            float2 uv_MainTex2;
            float2 uv_MainTex3;
            float2 uv_MainTex4;
            float4 color:COLOR;
        };

        void surf (Input IN, inout SurfaceOutputStandard o)
        {
            fixed4 c = tex2D(_MainTex, IN.uv_MainTex);
            fixed4 d = tex2D(_MainTex2, IN.uv_MainTex2);
            fixed4 e = tex2D(_MainTex3, IN.uv_MainTex3);
            fixed4 f = tex2D(_MainTex4, IN.uv_MainTex4);
            // o.Emission = IN.color.rgb; 버텍스 컬러 확인용

            // lerp 함수를 이용함
            o.Albedo = lerp(c.rgb, d.rgb, IN.color.r);
            o.Albedo = lerp(o.Albedo, e.rgb, IN.color.g);
            o.Albedo = lerp(o.Albedo, f.rgb, IN.color.b);

            o.Alpha = c.a;
        }
        ENDCG
    }
    FallBack "Diffuse"
}

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

위로 스크롤