ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 이미지 흑백으로 만들기, Lerp 함수
    유니티/게임그래픽 2024. 2. 19. 21:05

     

    fullforwardshadows는 그림자 관련 부분이다

    이게 있으면 쉐이더를 사용한 오브젝트가 랜더링 상태일때 모든 라이트에서 그림자를 생성한다

    이 구문을 지우게 되면 포인트나 스포트라이트에서는 그림자를 생성하지 않는다

     

    흑백으로 바꾸는 방법은 매우 간단하다

    출력을 (c.r + c.g + c.b) /3 으로 바꿔버리면 된다

     

    이렇게 연산하면 c의 rgb값 평균이 나오게 되고 3으로 나누었으니 한자리 숫자로 나오게 된다

     

    <Lerp 함수>

    Lerp라는 단어 자체는 직선적인 비율로 값이 변환되는것을 의미하지만

    지금은 복잡하게 알 필요없고 두 텍스쳐를 섞어주는 함수쯤으로만 이해하자

     

    lerp(X, Y, s)

     

    이게 기본형식으로 X와 Y는 같은 단위여야 하고 s는 float이다

    이번엔 풀과 모래 텍스쳐를 lerp 함수를 이용해 합쳐보겠다

     

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

    우선 아까 만들어뒀던 텍스쳐를 똑같이 하나 더 만든다

    입력받을수 있는 텍스쳐가 2개가 생긴것을 확인하고 두번째에 모래 텍스쳐를 넣어준다

     

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

    그리고 Albedo에 lerp 함수를 사용하여 출력해보자. s값에 1을 넣자 모래 텍스쳐가 나온다

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

    s 값에 0을 넣자 풀 텍스쳐가 나오는것을 확인할수 있다

     

    그럼 이 둘을 반반 섞기 위해서는 s값에 0.5를 넣어주면 된다

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

     

    응용1 - 지난 글에서 range를 이용하여 밝기 조절 스위치를 만든것처럼 이번에도 섞이는 비율을 스위치로 만들수 있다

    Shader "Custom/NewSurfaceShader"
    {
        Properties
        {
            _MainTex ("Texture", 2D) = "white" {}
            _MainTex2 ("Texture", 2D) = "white" {}
            _Range("range", range(0,1)) = 0
        }
        SubShader
        {
            Tags { "RenderType"="Opaque" }
    
            CGPROGRAM
            #pragma surface surf Standard
            #pragma target 3.0
            sampler2D _MainTex;
            sampler2D _MainTex2;
            float _Range;
    
            struct Input
            {
                float2 uv_MainTex;
                float2 uv_MainTex2;
    
            };
    
            void surf (Input IN, inout SurfaceOutputStandard o)
            {
                fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
                fixed4 d = tex2D (_MainTex2, IN.uv_MainTex2);
    
                o.Albedo = lerp(c.rgb, d.rgb, _Range);
            }
            ENDCG
        }
        FallBack "Diffuse"
    }

     

    방법은 간단하다. 스위치 하나 range로 선언해주고 s값에 스위치 변수 _Range를 넣어주면 된다

     

     

     

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

    UV - Time  (2) 2024.02.20
    UV  (0) 2024.02.19
    텍스쳐 입력받기  (0) 2024.02.19
    Shader 응용  (1) 2024.02.19
    Shader 기초지식 & 구에 색상 집어넣기  (0) 2024.02.18
Designed by Tistory.