ShaderLab: Properties


쉐이더 생성후 테스트

참고자료

https://www.slideshare.net/iFunFactory/ss-74059131

http://chulin28ho.tistory.com/290

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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
Shader "Custom/TestShader" {
    // Properties영역 인스팩터에 노출된다.
    Properties {
        _Color("Color", Color) = (1111)
        _MainTexture("Albedo (RGB)", 2D) = "white" {}
        _Glossiness("Smoothness", Range(0,1)) = 0.5
        _Metallic("Metallic", Range(0,1)) = 0.0
        _Vector("TestVector", Vector) = (0000)
        _Float("TestFloat", Float) = 0.5
    }
 
    // 쉐이더 영역 여러개의 SubShader {}를 만들수 있다.
    SubShader {
        Tags { "RenderType" = "Opaque" }
        // CGPROGRAM ~ ENDCG CG언어를 이용해서 쉐이더 작성
        // CGPROGRAM ~ ENDCG CGPROGRAM ~ ENDCG CGPROGRAM ~ ENDCG = 3 Pass
        CGPROGRAM 
        // 전처리, 스니핏(snippet) 이라고 불림.
        // 조명계산 설정이나 기타 세부적인 분기를 정해할 수 있음.
        #pragma surface surf Standard fullforwardshadows
        #pragma target 3.0
 
        // 인스팩터에 노출된 프로퍼티의 값을 저장할 변수정의(이름 동일해야함.)
        // sampler는 텍스쳐정보를 받아준다. uv이름(uv_MainTexture)
        sampler2D _MainTexture;
        struct Input {
            float2 uv_MainTexture;
        };
 
        fixed4 _Color;
        half _Glossiness;
        half _Metallic;
        
        float4 _Vector;
        float _Float;
 
        /* 내부 인클루드 파일에 정의됨.
        struct SurfaceOutputStandard {
            fiexd3 Albedo;
            fiexd3 Normal;
            fiexd3 Emission;
            half Metallic;
            half Smoothness;
            half Occlusion;
            half Alpha;
        };
        // 여기부턴 버텍스 쉐이더 사용할
        struct appdate_base {
            float4 vartex: POSTION;
            float3 normal : NORMAL;
            float4 texcoord : TEXCOORD0;
            UNITY_VERTEX_INPUT_INSTANCE_ID
        }
        struct appdate_tan {
            float4 vartex: POSTION;
            float4 tangent : TANGENT;
            float3 normal : NORMAL;
            float4 texcoord : TEXCOORD0;
            UNITY_VERTEX_INPUT_INSTANCE_ID
        }
        
        struct appdate_full {
            float4 vartex: POSTION;
            float4 tangent : TANGENT;
            float3 normal : NORMAL;
            float4 texcoord : TEXCOORD0;
            float4 texcoord1 : TEXCOORD1;
            float4 texcoord2 : TEXCOORD2;
            float4 texcoord3 : TEXCOORD3;
            fixed4 color : COLOR;
            UNITY_VERTEX_INPUT_INSTANCE_ID
        }
        
        // 버텍스의 위치
        float4 vartex: POSTION
        // 접선 방향(NormalMap 연산할 때 주로 사용되는 축)
        float4 tangent : TANGENT;
        // 버텍스의 노멀
        float3 normal : NORMAL;
        // 첫 번째 UV좌표
        float4 texcoord : TEXCOORD0;
        // 두 번째 UV좌표 라이트맵용 커스텀 UV 데이터를 사용할 때 많이사용
        float4 texcoord1 : TEXCOORD1;
        // 세 번째 UV좌표 특별한 경우 사용함.
        float4 texcoord2 : TEXCOORD2;
        // 네 번째 UV좌표 특별한 경우 사용함.
        float4 texcoord3 : TEXCOORD3;
        // 버텍스 컬러를 의미합니다.
        fixed4 color : COLOR;
        */
 
        #pragma surface surf vertex:vert noshadow
        void vert(inout appdata_full v) {
            // 버텍스 쉐이더를 작성
        }
 
        void surf(Input IN, inout SurfaceOutputStandard o) {
            // tex2D는 UV좌표에 _MainTexture 컬러값을 찾아줌
            fixed4 c = tex2D(_MainTexture, IN.uv_MainTexture) * _Color;
            // 순서에 상관없이 꺼내 사용 가능함.
            o.Albedo = c.rgb;
            // o.Albedo = c.rrr;
            // o.Albedo = c.ggg;
            // o.Albedo = c.bbb;
            // o.Albedo = c.rrb;
            // o.Albedo = c.bbg;
            // o.Albedo = c.gbb;
            // o.Albedo = c.rgg;
            // o.Albedo = c.bgr;
 
            o.Smoothness = _Glossiness;
            o.Metallic = _Metallic;
            o.Alpha = c.a;
        }
 
        // #pragma surface surf Test noambient
        float4 LightingTest(SurfaceOutput s, float3 lightDir, float3 viewDir, float atten)
        {
            // Lambert
            float3 diffuseColor;
            float ndot1 = saturate(dot(s.Normal, lightDir));
            diffuseColor.rgb = ndot1 * s.Albedo * _LightColor0.rgb * atten;
            
            // Specular
            float3 specularColor;
            float3 harp = normalize(lightDir + viewDir);
            float specular = saturate(dot(harp, s.Normal));
            specular = pow(specular, _SpecularPower);
            specularColor = specular * _SpecularColor.rgb * s.Gloss;
 
            // RimLight
            float3 rimColor;
            float rim = abs(dot(viewDir, s.Normal));
            float inverim = 1 - rim;
            rimColor = pow(inverim, _RimPower) * _RimColor.rgb;
 
            // Fare Specular
            float3 specularColor2;
            specularColor2 = pow(rim, 50* float3(0.20.20.2* s.Gloss;
 
            float4 final;
            final.rgb = diffuseColor + specularColor + rimColor;
            final.a = s.Alpha;
            return final;
        }
 
        // #pragma surface surf NoLighting
        fixed4 LightingNoLighting(SurfaceOutput s, fixed3 lightDir, fixed atten)
        {
            return fixed4(0001);
        }
 
        // #pragma surface surf Toon
        fixed4 LightingToon(SurfaceOutput s, fixed3 lightDir, fixed atten)
        {
            return fixed4(0001);
        }
 
        // #pragma surface surf SimpleSpecular
        half4 LightingSimpleSpecular (SurfaceOutput s, half3 lightDir, half3 viewDir, half atten) {
            return half4(0000);
        }
        ENDCG
    }
    FallBack "Diffuse"
}
cs

쉐이더를 처음 접하면 float / half / fixed 중에 float만 본적이 있을듯 함.

정밀도에 따라 골라서 사용하면 됨.

Nvidia쪽 GPU의 경우 hlaf로 연산할 때 연산수가 2배로 빨라진다.


ShaderLab: Pass

Pass 블록은 GameObject의 기하학을 한 번 렌더링합니다.


ShaderLab: UsePass

UsePass 명령은 다른 쉐이더에서 명명 된 패스를 사용합니다.


ShaderLab: GrabPass

GrabPass는 특수 패스 유형입니다.

오브젝트가 화면에 그려지는 화면의 내용을 텍스처로 가져옵니다.

이 텍스쳐는 후속 패스에서 고급 이미지 기반 효과를 수행하는 데 사용할 수 있습니다.


ShaderLab: SubShader Tags

서브 쉐이더는 태그를 사용하여 렌더링 엔진에 렌더링 할 방법과시기를 알려줍니다.


Writing vertex and fragment shaders


Material Property Drawer


Semantics

반응형