C#/수업내용

2020.06.23. 수업내용 - Shader2 (Range, lerp)

dev_sr 2020. 6. 24. 09:18

스니핏 - 조각
코드 스니핏 - 코드 조각

 셰이더는 서브셰이더의 리스트로 구성됩니다. 최소한 하나의 서브셰이더가 있어야 합니다. Unity는 셰이더를 로드할 때 서브셰이더의 리스트를 살펴보고 최종 사용자의 기기가 지원하는 셰이더 리스트 중 가장 위에 있는 것을 선택합니다. 만약 지원되는 서브셰이더가 없으면 Unity는 폴백 셰이더 사용을 시도합니다.

->서브셰이더를 여러개 짜놓고 가장 위에 있는 걸 우선적으로 돌리는데
그게 안되면 그 밑에 있는 쉐이더를 돌리고
안되면 그 밑에 있는 쉐이더를 돌리고
그것도 안되면 폴벡 쉐이더를 돌림

 

 

슬라이더 만들기

 

이런거

 

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
Shader "NewShader"
{
    Properties
    {
       
        _TestColor1 ("TestColor1",Color) = (1,1,1,1)
        _TestColor2("TestColor2",Color) = (1,1,1,1)
        _Red("Red",Range(0,1))=0    //외부에서 값을 조정할 있도록 슬라이더를 만듦
        _Green("Green",Range(0,1)) = 0
        _Blue("Blue",Range(0,1)) = 0
        _BrightDark("Bright $ Darkness", Range(-1,1))=0
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
 
        CGPROGRAM
 
        //1: 설정 부분
        //전처리라고도 할수 있고 스니핏이라고 부르기도 한다.
        //쉐이더의 조명설정이나 기타 세부적인 분기를 정해주는 부분이다.
 
        #pragma surface surf Standard fullforwardshadows
 
        //2: Input이라는 구조체다
        //이안에 코드는 엔진으로 부터 받아와야 할 데이터가 들어간다.
        struct Input
        {
            float4 color : COLOR;   //Input안에 아무것도 없으면 에러가 난다.
        };  //2
 
        //변수 추가
        float4 _TestColor1;  
        float4 _TestColor2;
        float _Red;
        float _Green;
        float _Blue;
        float _BrightDark;
 
        //3: surf라는 이름을 가진 함수 영역이다.
        //색상이나 이미지가 출력되는 부분을 만들수 있다.
        void surf (Input IN, inout SurfaceOutputStandard o)
        {
            float4 test = float4 (1,0,0,1);
            //o.Albedo = float3(1, 0, 0);
            //o.Emission = _TestColor1 + _TestColor2;
            o.Emission = float3(_Red,_Green,_Blue) + _BrightDark;
        }   //3
        ENDCG
    }
    FallBack "Diffuse"
}

 

 

 

lerp를 이용해서 그라디언트를 만들 수 있음 

lerp(X,Y, a)

X, Y는 타입이 같아야함

 

포토샵에서 다른 이름으로 저장 ->TGA파일로 만들어서 넣거나

PSD 파일 자체를 유니티에 넣으면 알파가 보임

텍스쳐 두장을 겹쳐 보이게 할 수 있음

 

 

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
32
33
34
35
36
37
38
39
40
Shader "Custom/tex"
{
    Properties
    {
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _MainTex2 ("Albedo (RGB)", 2D) = "white" {}
        _TestGradient("TestGradient",Range(0,1)) = 0
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
 
        CGPROGRAM
        // Physically based Standard lighting model, and enable shadows on all light types
        #pragma surface surf Standard
 
        sampler2D _MainTex;
        sampler2D _MainTex2;
        float _TestGradient;
 
        struct Input
        {
            float2 uv_MainTex;
            float2 uv_MainTex2;
        };
 
       
 
        void surf (Input IN, inout SurfaceOutputStandard o)
        {
            fixed4 d = tex2D(_MainTex2, IN.uv_MainTex2);
            fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
           o.Emission = lerp(c.rgb, d.rgb, 1-c.a); //앞 두개는 타입이 같아야함, 순서 변경
            o.Alpha = c.a;
        }
        ENDCG
    }
    FallBack "Diffuse"
}