ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Vertex Color Masking
    유니티/게임그래픽 2024. 2. 21. 14:18

    이번엔 Vertex Color를 마스킹으로 이용하여 멀티 텍스쳐 기능을 만들어보겠다

     

    Shader "Custom/NewSurfaceShader"
    {
        Properties
        {
            _MainTex ("MainTex", 2D) = "white" {}
            _MainTex2 ("MainTex", 2D) = "white" {}
            _MainTex3 ("MainTex", 2D) = "white" {}
            _MainTex4 ("MainTex", 2D) = "white" {}
        }
        SubShader
        {
            Tags { "RenderType"="Opaque" }
    
            CGPROGRAM
            #pragma surface surf Standard
            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;
                o.Alpha = c.a;
            }
            ENDCG
        }
        FallBack "Diffuse"
    }

    우선 텍스쳐 4개를 입력받아 우선은 Vertex color를 출력하는 스크립트를 짜준다

                o.Emission = IN.color.r;

    만약 여기서 R채널만 출력하면 흑백으로 변하고 R영역만 흰색으로 출력된다 (물론 G나 B도 마찬가지)

     

     

    이제 전에 배웠던 lerp함수를 이용해 텍스쳐들을 한번 섞어보자

     

    14-3일차 이미지 흑백으로 만들기, Lerp 함수

    fullforwardshadows는 그림자 관련 부분이다 이게 있으면 쉐이더를 사용한 오브젝트가 랜더링 상태일때 모든 라이트에서 그림자를 생성한다 이 구문을 지우게 되면 포인트나 스포트라이트에서는 그

    sangeun00.tistory.com

                o.Emission = lerp(c.rgb, d.rgb, IN.color.r);

    lerp를 이용하여 텍스쳐 c와 d를 color의 r값의 비율만큼 섞어준다

    그럼 R의 영역에 텍스쳐 d가 섞인 모습을 볼 수 있다

     

    이렇게 하나 섞었으니 이번엔 G와 B의 영역도 동시에 섞이도록 코드를 짜보겠다

     o.Emission = lerp(c.rgb, d.rgb, IN.color.r);
     o.Emission = lerp(c.rgb, e.rgb, IN.color.g);
     o.Emission = lerp(c.rgb, f.rgb, IN.color.b);

    처음엔 단순하게 생각해서 이렇게 하면 될줄 알았다. 하지만 이렇게 만드니 

    마지막줄에 적은 f값만 출력된다. 이렇듯 출력코드 3줄을 적으면 그 3줄을 전부 출력해주는것이 아니라

    마지막 1줄만 출력한다는것을 알 수 있다

     

     o.Emission = lerp(c.rgb, d.rgb, IN.color.r);
     o.Emission = lerp(o.Emission, e.rgb, IN.color.g);
     o.Emission = lerp(o.Emission, f.rgb, IN.color.b);

    결국 마지막 한줄만 적용되는거라면 첫번째, 두번째 o.Emission을 그대로 끌고와 마지막 줄에 적어주면 된다

     

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

    NormalMap  (0) 2024.02.21
    SurfaceOutputStandard(Metallic & Smoothness)  (0) 2024.02.21
    Vertex Color  (1) 2024.02.21
    _Time 변수 스크립트 기본형  (0) 2024.02.20
    불 이펙트  (1) 2024.02.20
Designed by Tistory.