ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 텍스쳐 입력받기
    유니티/게임그래픽 2024. 2. 19. 21:05

    텍스쳐를 하나 입력받아 구에 적용시키는 스크립트를 짜보자

    Shader "Custom/NewSurfaceShader"
    {
        // <1>
        Properties
        {
            _MainTex ("Texture", 2D) = "white" {}
        }
        SubShader
        {
            Tags { "RenderType"="Opaque" }
    
            CGPROGRAM
            #pragma surface surf Standard fullforwardshadows
            #pragma target 3.0
            // <2>
            sampler2D _MainTex;
            
            //<3>
            struct Input
            {
                float2 uv_MainTex;
            };
            
            // <4>
            void surf (Input IN, inout SurfaceOutputStandard o)
            {
                fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
                o.Albedo = c.rgb;
            }
            ENDCG
        }
        FallBack "Diffuse"
    }

     

    스크립트에 입력해야 하는건 크게 4가지이다

     

    <1>

     Properties
        {
            _MainTex ("Texture", 2D) = "white" {}
        }

     

    _MainTex("Texture", )

    텍스쳐를 입력받는 변수 _MainTex를 선언해준다. Material 창에는 Texture라는 이름으로 출력되게 한다

     

    _MainTex("Texture", 2D)

    2D는 인터페이스가 2D 텍스쳐를 받는것을 의미한다.

    당연하지만 여기에 어떤걸 입력하냐에 따라 인터페이스가 달라진다

     

    _MainTex("Texture", 2D) = "white" {}

    이제 초기값을 넣어줘야 하는데 도대체 여기 white는 무슨의미인가 싶었다

    white란, 텍스쳐 인터페이스가 처음 생겨나서 아무것도 들어있지 않을때

    흰색 텍스쳐가 들어있다고 생각하도록 만들라는 의미이다

     

    생각하도록 만들라는게 무슨 말인가 싶어 여기에 어떤 값을 넣던 달라지는게 없을거라 생각했는데

     

    여기에 값을 어떻게 넣냐에 따라 초기 색상이 달라지는것을 볼 수 있다

     

    그렇게 Properties에 알맞게 입력하면 텍스쳐를 입력받는 공간이 생긴것을 확인할 수 있다

     

    <2>

    Sampler 2D _MainTex;

     

    입력받는 텍스쳐를 sampler로 받게한다

    우선 CGPROGRAM ~ ENDCG 사이에 위치해야하며 대소문자 구별 중요하다

     

    <3>

    struct Input

    {

         float2 uv_MainTex;

    };

     

    uv는 u와 v 2개의 숫자로 이루어지므로 float2 이고, MainTex의 uv라는 뜻으로 샘플러 이름앞에 uv를 붙인다

     

    uv : '점,선,면'으로 만들어진 오브젝트에 '외형'을 입혀주는 과정

     

    <4>

     void surf (Input IN, inout SurfaceOutputStandard o)
            {
                fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
                o.Albedo = c.rgb;
            }

     

                fixed4 c = tex2D(_MainTex, IN.uv_MainTex);

    텍스쳐를 표현하는데 fixed4 단위를 쓴 이유는 float가 32비트 영역을 가지기엔 너무 크기 때문

    하지만 익숙하지만 않다면 괜히 헷갈리게 고민하지 말고 그냥 float를 사용하자

     

                fixed4 c = tex2D (_MainTex, IN.uv_MainTex);

    tex2D라는 함수는 첫번째 매개변수로 텍스쳐 샘플러를, 두번째 매개변수로는 uv의 좌표를 받는다

     

                fixed4 c = tex2D (_MainTex, IN.uv_MainTex);

    위 코드는 _Maintex에서 uv.MainTex 좌표에 있는 텍셀을 읽어와 변수 c에 저장한다

     

                o.Albedo = c.rgb;

    이제 이 c에 저장된 값으로 해야할건 텍스쳐를 그대로 보여주는것이기에 그대로 반환하면 된다

     

    텍스쳐를 입히는 순간 잘 적용이 된것을 확인할 수 있다

    '유니티 > 게임그래픽' 카테고리의 다른 글

    UV - Time  (2) 2024.02.20
    UV  (0) 2024.02.19
    이미지 흑백으로 만들기, Lerp 함수  (0) 2024.02.19
    Shader 응용  (1) 2024.02.19
    Shader 기초지식 & 구에 색상 집어넣기  (0) 2024.02.18
Designed by Tistory.