본문 바로가기

Unity3D C#/유니티 쉐이더 공부

lerp 함수의 응용

lerp 함수의 응용


lerp 함수는 lerp(X,Y,s) 형태로 사용되고 X와 Y는 반드시 같은 단위여야 함(float/float2/float3/float4)

s인자는 반드시 한 자리의 수인 float 사용. 이 수치가 0이면 X가 출력되고 1이면 Y가 출력되고, 0.5면 X,Y가 반씩 섞여서 출력됨

마지막 인자인 s를 인터페이스와 연결하여 X 텍스쳐가 Y 텍스쳐로 변하는 기능 생성 가능

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Shader "Custom/NewSurfaceShader" {
    Properties {
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _MainTex2 ("Albedo (RGB)", 2D) = "white" {}
        _lerpTest("lerp 인터페이스", Range(0,1)) = 0;
    }
    SubShader {
        Tags { "RenderType"="Opaque" }
        
        CGPROGRAM
        #pragma surface surf Standard fullforwardshadows
 
        sampler2D _MainTex;
        sampler2D _MainTex2;
        float _lerpTest;
 
        struct Input {
            float2 uv_MainTex;
        };
 
        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, _lerptest);
            o.Alpha = c.a;
        }
        ENDCG
    }
    FallBack "Diffuse"
}
 
cs

인터페이스를 조절하여 텍스쳐1번과 2번 사이를 오갈 수 있음


만약 c가 알파채널이 존재하는 텍스쳐라면 

            o.Albedo = lerp(c.rgb, d.rgb, c.a);
이와 같이 입력했을 때 알파 채널의 강도에 의해 합쳐지게 됨.
알파채널의 강도에 의해 합쳐지는 것을 응용하면 
반복된 타일로 이루어진 벽에 검은 물이 흐른 자국 등을 만들거나 마을의 벽돌 바닥에 새겨진 마크 등을 그릴 수 있음.