6 – 01 ~ 03 UV의 개념, 시각적 확인, 숫자 더하기(Unity Shader)

6 – 01 UV의 기본 개념

모델링을 하고, UV를 펴고 저장하게 되면 그 자체로 저장이 되는 것이 아닌

각각의 버텍스의 위치, UV, Normal, Vertex Color 등의 데이터가 저장되고

저장된 데이터를 엔진에서 불러오면 이 데이터를 바탕으로 엔진에서 재구성되는 것입니다.

2차원의 그림을 3차원에서 이미지로 표현하려면 UV 매핑이라는 과정이 필요합니다.

간단하게 말하면 3D 모델링의 전개도를 만드는 것입니다.

여기서 UV 좌표계는 텍스쳐의 이미지를 3차원 공간의 폴리곤에 입히기 위한 기준이 되는 2차원 좌표계입니다.

U는 가로 / V는 세로라고 부릅니다. 

아래의 사각형 안에 버텍스를 움직이면서 배치하는 것은 버텍스에 UV 숫자를 입력하는 과정입니다.

언리얼 엔진은 DirectX 방식  / Unity 엔진은 OpenGL 방식

UV는 2차원 좌표이므로 float2이고 범위는 0 ~ 1까지로 표현할 수 있습니다. (Normalized, 정규화됨)

어떤 크기의 이미지라도 이미지의 가로 세로 100%의 비율을 나타내고자 쓰는 단위라는 것을 알 수 있습니다.


6 – 02 시각적 확인

텍스쳐 한 장 받는 것 외엔 아무 기능이 없는 쉐이더를 만들어 주고 적당한 텍스쳐를 넣어줍니다.

Shader "Custom/UVTest"
{
    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;
        };

        void surf (Input IN, inout SurfaceOutputStandard o)
        {

            fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
            o.Albedo = c.rgb;
            o.Alpha = c.a;
        }
        ENDCG
    }
    FallBack "Diffuse"
}

UV는 XY와 같고, 두 자리 숫자이기 때문에 float2 단위입니다.

그리고 베텍스가 들어가 있는 데이터이므로 유니티에서 받아야 합니다.

이렇게 외부 인터페이스에서 받는 값이 아닌, 유니티 내부로부터 받는 데이터는

위와 같이 Input 구조체 안에서 선언해야 합니다. (float2 uv_MainTex  <- _MainTax의 UV)


이렇게 선언된 UV를 surf 함수에서 (tex2D 샘플러, UV)에 사용해야 하므로 위와 같이 사용됩니다.

uv_MainTex.x = U / uv_MainTex.y = V를 나타냅니다.

(빛의 영향을 받는 Albedo 대신 Emission을 넣어서 테스트)

(Albedo와 Emission을 같이 사용하면 값이 더해져서 주의해야 합니다.)

uv_MainTex.x  / uv_MainTex.y 를 이용하여 컬러풀한 이미지를 출력했습니다.

이처럼 숫자는 컬러로 컬러는 숫자로 변할 수 있습니다. 


6 – 03 UV에 숫자 더하기

UV에 일정한 숫자를 곱하거나 더하면 어떻게 될지 알아봅니다.

Shader "Custom/UVTest"
{
    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;
        };

        void surf (Input IN, inout SurfaceOutputStandard o)
        {

            fixed4 c = tex2D (_MainTex, IN.uv_MainTex + 0.5f);
            o.Emission = c.rgb;
            o.Alpha = c.a;
        }
        ENDCG
    }
    FallBack "Diffuse"
}

텍스쳐가 왼쪽 아래로 내려왔습니다.

동시에 오른쪽 아래에 계속 연속되어 있던 텍스쳐가 밀려 내려와서 보이기 시작했습니다.

이유는 모든  vertext에 있는 UV 값이 0.5씩 증가하여 UV값에 변화를 주었기 때문입니다. (왼쪽 아래로 이동한 것 처럼 보임)

(정수 값을 이용하면 정수값 만큼 사이클을 이동해서 제자리로 온 것처럼 보입니다.)

텍스쳐의 옵션에 따라서 다양한 효과를 연출 할 수 있습니다.

댓글 달기

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

위로 스크롤