记录Unity的标准着色器实现,基于Unity 2017.1版本的代码进行分析。

Standard Shader

文件位于\DefaultResourcesExtra\Standard.shader

  1 // Unity built-in shader source. Copyright (c) 2016 Unity Technologies. MIT license (see license.txt)
  2 
  3 Shader "Standard"
  4 {
  5     Properties
  6     {
  7         _Color("Color", Color) = (1,1,1,1)
  8         _MainTex("Albedo", 2D) = "white" {}
  9 
 10         _Cutoff("Alpha Cutoff", Range(0.0, 1.0)) = 0.5
 11 
 12         _Glossiness("Smoothness", Range(0.0, 1.0)) = 0.5
 13         _GlossMapScale("Smoothness Scale", Range(0.0, 1.0)) = 1.0
 14         [Enum(Metallic Alpha,0,Albedo Alpha,1)] _SmoothnessTextureChannel ("Smoothness texture channel", Float) = 0
 15 
 16         [Gamma] _Metallic("Metallic", Range(0.0, 1.0)) = 0.0
 17         _MetallicGlossMap("Metallic", 2D) = "white" {}
 18 
 19         [ToggleOff] _SpecularHighlights("Specular Highlights", Float) = 1.0
 20         [ToggleOff] _GlossyReflections("Glossy Reflections", Float) = 1.0
 21 
 22         _BumpScale("Scale", Float) = 1.0
 23         _BumpMap("Normal Map", 2D) = "bump" {}
 24 
 25         _Parallax ("Height Scale", Range (0.005, 0.08)) = 0.02
 26         _ParallaxMap ("Height Map", 2D) = "black" {}
 27 
 28         _OcclusionStrength("Strength", Range(0.0, 1.0)) = 1.0
 29         _OcclusionMap("Occlusion", 2D) = "white" {}
 30 
 31         _EmissionColor("Color", Color) = (0,0,0)
 32         _EmissionMap("Emission", 2D) = "white" {}
 33 
 34         _DetailMask("Detail Mask", 2D) = "white" {}
 35 
 36         _DetailAlbedoMap("Detail Albedo x2", 2D) = "grey" {}
 37         _DetailNormalMapScale("Scale", Float) = 1.0
 38         _DetailNormalMap("Normal Map", 2D) = "bump" {}
 39 
 40         [Enum(UV0,0,UV1,1)] _UVSec ("UV Set for secondary textures", Float) = 0
 41 
 42 
 43         // Blending state
 44         [HideInInspector] _Mode ("__mode", Float) = 0.0
 45         [HideInInspector] _SrcBlend ("__src", Float) = 1.0
 46         [HideInInspector] _DstBlend ("__dst", Float) = 0.0
 47         [HideInInspector] _ZWrite ("__zw", Float) = 1.0
 48     }
 49 
 50     CGINCLUDE
 51         #define UNITY_SETUP_BRDF_INPUT MetallicSetup
 52     ENDCG
 53 
 54     SubShader
 55     {
 56         Tags { "RenderType"="Opaque" "PerformanceChecks"="False" }
 57         LOD 300
 58 
 59 
 60         // ------------------------------------------------------------------
 61         //  Base forward pass (directional light, emission, lightmaps, ...)
 62         Pass
 63         {
 64             Name "FORWARD"
 65             Tags { "LightMode" = "ForwardBase" }
 66 
 67             Blend [_SrcBlend] [_DstBlend]
 68             ZWrite [_ZWrite]
 69 
 70             CGPROGRAM
 71             #pragma target 3.0
 72 
 73             // -------------------------------------
 74 
 75             #pragma shader_feature _NORMALMAP
 76             #pragma shader_feature _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON
 77             #pragma shader_feature _EMISSION
 78             #pragma shader_feature _METALLICGLOSSMAP
 79             #pragma shader_feature ___ _DETAIL_MULX2
 80             #pragma shader_feature _ _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
 81             #pragma shader_feature _ _SPECULARHIGHLIGHTS_OFF
 82             #pragma shader_feature _ _GLOSSYREFLECTIONS_OFF
 83             #pragma shader_feature _PARALLAXMAP
 84 
 85             #pragma multi_compile_fwdbase
 86             #pragma multi_compile_fog
 87             #pragma multi_compile_instancing
 88             // Uncomment the following line to enable dithering LOD crossfade. Note: there are more in the file to uncomment for other passes.
 89             //#pragma multi_compile _ LOD_FADE_CROSSFADE
 90 
 91             #pragma vertex vertBase
 92             #pragma fragment fragBase
 93             #include "UnityStandardCoreForward.cginc"
 94 
 95             ENDCG
 96         }
 97         // ------------------------------------------------------------------
 98         //  Additive forward pass (one light per pass)
 99         Pass
100         {
101             Name "FORWARD_DELTA"
102             Tags { "LightMode" = "ForwardAdd" }
103             Blend [_SrcBlend] One
104             Fog { Color (0,0,0,0) } // in additive pass fog should be black
105             ZWrite Off
106             ZTest LEqual
107 
108             CGPROGRAM
109             #pragma target 3.0
110 
111             // -------------------------------------
112 
113 
114             #pragma shader_feature _NORMALMAP
115             #pragma shader_feature _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON
116             #pragma shader_feature _METALLICGLOSSMAP
117             #pragma shader_feature _ _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
118             #pragma shader_feature _ _SPECULARHIGHLIGHTS_OFF
119             #pragma shader_feature ___ _DETAIL_MULX2
120             #pragma shader_feature _PARALLAXMAP
121 
122             #pragma multi_compile_fwdadd_fullshadows
123             #pragma multi_compile_fog
124             // Uncomment the following line to enable dithering LOD crossfade. Note: there are more in the file to uncomment for other passes.
125             //#pragma multi_compile _ LOD_FADE_CROSSFADE
126 
127             #pragma vertex vertAdd
128             #pragma fragment fragAdd
129             #include "UnityStandardCoreForward.cginc"
130 
131             ENDCG
132         }
133         // ------------------------------------------------------------------
134         //  Shadow rendering pass
135         Pass {
136             Name "ShadowCaster"
137             Tags { "LightMode" = "ShadowCaster" }
138 
139             ZWrite On ZTest LEqual
140 
141             CGPROGRAM
142             #pragma target 3.0
143 
144             // -------------------------------------
145 
146 
147             #pragma shader_feature _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON
148             #pragma shader_feature _METALLICGLOSSMAP
149             #pragma shader_feature _PARALLAXMAP
150             #pragma multi_compile_shadowcaster
151             #pragma multi_compile_instancing
152             // Uncomment the following line to enable dithering LOD crossfade. Note: there are more in the file to uncomment for other passes.
153             //#pragma multi_compile _ LOD_FADE_CROSSFADE
154 
155             #pragma vertex vertShadowCaster
156             #pragma fragment fragShadowCaster
157 
158             #include "UnityStandardShadow.cginc"
159 
160             ENDCG
161         }
162         // ------------------------------------------------------------------
163         //  Deferred pass
164         Pass
165         {
166             Name "DEFERRED"
167             Tags { "LightMode" = "Deferred" }
168 
169             CGPROGRAM
170             #pragma target 3.0
171             #pragma exclude_renderers nomrt
172 
173 
174             // -------------------------------------
175 
176             #pragma shader_feature _NORMALMAP
177             #pragma shader_feature _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON
178             #pragma shader_feature _EMISSION
179             #pragma shader_feature _METALLICGLOSSMAP
180             #pragma shader_feature _ _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
181             #pragma shader_feature _ _SPECULARHIGHLIGHTS_OFF
182             #pragma shader_feature ___ _DETAIL_MULX2
183             #pragma shader_feature _PARALLAXMAP
184 
185             #pragma multi_compile_prepassfinal
186             #pragma multi_compile_instancing
187             // Uncomment the following line to enable dithering LOD crossfade. Note: there are more in the file to uncomment for other passes.
188             //#pragma multi_compile _ LOD_FADE_CROSSFADE
189 
190             #pragma vertex vertDeferred
191             #pragma fragment fragDeferred
192 
193             #include "UnityStandardCore.cginc"
194 
195             ENDCG
196         }
197 
198         // ------------------------------------------------------------------
199         // Extracts information for lightmapping, GI (emission, albedo, ...)
200         // This pass it not used during regular rendering.
201         Pass
202         {
203             Name "META"
204             Tags { "LightMode"="Meta" }
205 
206             Cull Off
207 
208             CGPROGRAM
209             #pragma vertex vert_meta
210             #pragma fragment frag_meta
211 
212             #pragma shader_feature _EMISSION
213             #pragma shader_feature _METALLICGLOSSMAP
214             #pragma shader_feature _ _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
215             #pragma shader_feature ___ _DETAIL_MULX2
216             #pragma shader_feature EDITOR_VISUALIZATION
217 
218             #include "UnityStandardMeta.cginc"
219             ENDCG
220         }
221     }
222 
223     SubShader
224     {
225         Tags { "RenderType"="Opaque" "PerformanceChecks"="False" }
226         LOD 150
227 
228         // ------------------------------------------------------------------
229         //  Base forward pass (directional light, emission, lightmaps, ...)
230         Pass
231         {
232             Name "FORWARD"
233             Tags { "LightMode" = "ForwardBase" }
234 
235             Blend [_SrcBlend] [_DstBlend]
236             ZWrite [_ZWrite]
237 
238             CGPROGRAM
239             #pragma target 2.0
240 
241             #pragma shader_feature _NORMALMAP
242             #pragma shader_feature _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON
243             #pragma shader_feature _EMISSION
244             #pragma shader_feature _METALLICGLOSSMAP
245             #pragma shader_feature _ _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
246             #pragma shader_feature _ _SPECULARHIGHLIGHTS_OFF
247             #pragma shader_feature _ _GLOSSYREFLECTIONS_OFF
248             // SM2.0: NOT SUPPORTED shader_feature ___ _DETAIL_MULX2
249             // SM2.0: NOT SUPPORTED shader_feature _PARALLAXMAP
250 
251             #pragma skip_variants SHADOWS_SOFT DIRLIGHTMAP_COMBINED
252 
253             #pragma multi_compile_fwdbase
254             #pragma multi_compile_fog
255 
256             #pragma vertex vertBase
257             #pragma fragment fragBase
258             #include "UnityStandardCoreForward.cginc"
259 
260             ENDCG
261         }
262         // ------------------------------------------------------------------
263         //  Additive forward pass (one light per pass)
264         Pass
265         {
266             Name "FORWARD_DELTA"
267             Tags { "LightMode" = "ForwardAdd" }
268             Blend [_SrcBlend] One
269             Fog { Color (0,0,0,0) } // in additive pass fog should be black
270             ZWrite Off
271             ZTest LEqual
272 
273             CGPROGRAM
274             #pragma target 2.0
275 
276             #pragma shader_feature _NORMALMAP
277             #pragma shader_feature _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON
278             #pragma shader_feature _METALLICGLOSSMAP
279             #pragma shader_feature _ _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
280             #pragma shader_feature _ _SPECULARHIGHLIGHTS_OFF
281             #pragma shader_feature ___ _DETAIL_MULX2
282             // SM2.0: NOT SUPPORTED shader_feature _PARALLAXMAP
283             #pragma skip_variants SHADOWS_SOFT
284 
285             #pragma multi_compile_fwdadd_fullshadows
286             #pragma multi_compile_fog
287 
288             #pragma vertex vertAdd
289             #pragma fragment fragAdd
290             #include "UnityStandardCoreForward.cginc"
291 
292             ENDCG
293         }
294         // ------------------------------------------------------------------
295         //  Shadow rendering pass
296         Pass {
297             Name "ShadowCaster"
298             Tags { "LightMode" = "ShadowCaster" }
299 
300             ZWrite On ZTest LEqual
301 
302             CGPROGRAM
303             #pragma target 2.0
304 
305             #pragma shader_feature _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON
306             #pragma shader_feature _METALLICGLOSSMAP
307             #pragma skip_variants SHADOWS_SOFT
308             #pragma multi_compile_shadowcaster
309 
310             #pragma vertex vertShadowCaster
311             #pragma fragment fragShadowCaster
312 
313             #include "UnityStandardShadow.cginc"
314 
315             ENDCG
316         }
317 
318         // ------------------------------------------------------------------
319         // Extracts information for lightmapping, GI (emission, albedo, ...)
320         // This pass it not used during regular rendering.
321         Pass
322         {
323             Name "META"
324             Tags { "LightMode"="Meta" }
325 
326             Cull Off
327 
328             CGPROGRAM
329             #pragma vertex vert_meta
330             #pragma fragment frag_meta
331 
332             #pragma shader_feature _EMISSION
333             #pragma shader_feature _METALLICGLOSSMAP
334             #pragma shader_feature _ _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
335             #pragma shader_feature ___ _DETAIL_MULX2
336             #pragma shader_feature EDITOR_VISUALIZATION
337 
338             #include "UnityStandardMeta.cginc"
339             ENDCG
340         }
341     }
342 
343 
344     FallBack "VertexLit"
345     CustomEditor "StandardShaderGUI"
346 }
Standard Shader

相关文章: