# 对 标准着色器 Standard Shader 官方源码的分析(一)

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
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
/**
Standard Shader 架构分析:
- - [Properties]
- - [SubShader 1] 用于 Shader Model 3.0
- - - - [Pass 1]:正向基础渲染通道(Base Forward Pass)
- - - - [Pass 2]:正向附加渲染通道(Additive Forward Pass)
- - - - [Pass 3]:阴影渲染通道(Shadow Caster Pass)
- - - - [Pass 4]:延迟渲染通道(Deferred Render Pass)
- - - - [Pass 5]:元通道(Meta Pass)
- - [SubShader 2] 用于 Shader Model 2.0
- - - - [Pass 1]:正向基础渲染通道(Base Forward Pass)
- - - - [Pass 2]:正向附加渲染通道(Additive Forward Pass)
- - - - [Pass 3]:阴影渲染通道(Shadow Caster Pass)
- - - - [Pass 4]:元通道(Meta Pass)
- - [Fallback "VertexLit"]
**/

Shader "Standard"
{
// 属性 //
Properties
{
// 主颜色
_Color("Color", Color) = (1,1,1,1)
// 主纹理
_MainTex("Albedo", 2D) = "white" {}
// Alpha 剔除值
_Cutoff("Alpha Cutoff", Range(0.0, 1.0)) = 0.5
// 平滑、光泽度
_Glossiness("Smoothness", Range(0.0, 1.0)) = 0.5

_GlossMapScale("Smoothness Scale", Range(0.0, 1.0)) = 1.0
[Enum(Metallic Alpha,0,Albedo Alpha,1)] _SmoothnessTextureChannel ("Smoothness texture channel", Float) = 0

// 金属性
[Gamma] _Metallic("Metallic", Range(0.0, 1.0)) = 0.0
// 金属光泽纹理图
_MetallicGlossMap("Metallic", 2D) = "white" {}

[ToggleOff] _SpecularHighlights("Specular Highlights", Float) = 1.0
[ToggleOff] _GlossyReflections("Glossy Reflections", Float) = 1.0

// 凹凸的尺度
_BumpScale("Scale", Float) = 1.0
// 法线贴图
_BumpMap("Normal Map", 2D) = "bump" {}
// 高度缩放尺度
_Parallax ("Height Scale", Range (0.005, 0.08)) = 0.02
// 高度纹理图
_ParallaxMap ("Height Map", 2D) = "black" {}
// 遮挡强度
_OcclusionStrength("Strength", Range(0.0, 1.0)) = 1.0
// 遮挡纹理图
_OcclusionMap("Occlusion", 2D) = "white" {}
// 自发光颜色
_EmissionColor("Color", Color) = (0,0,0)
// 自发光纹理图
_EmissionMap("Emission", 2D) = "white" {}
// 细节掩膜图
_DetailMask("Detail Mask", 2D) = "white" {}
// 细节纹理图
_DetailAlbedoMap("Detail Albedo x2", 2D) = "grey" {}
// 细节法线贴图尺度
_DetailNormalMapScale("Scale", Float) = 1.0
// 细节法线贴图
_DetailNormalMap("Normal Map", 2D) = "bump" {}
// 二级纹理的 UV 设置
[Enum(UV0,0,UV1,1)] _UVSec ("UV Set for secondary textures", Float) = 0


// Blending state 混合状态的定义 //
[HideInInspector] _Mode ("__mode", Float) = 0.0
[HideInInspector] _SrcBlend ("__src", Float) = 1.0
[HideInInspector] _DstBlend ("__dst", Float) = 0.0
[HideInInspector] _ZWrite ("__zw", Float) = 1.0
}

// 开始CG着色器语言编写 //
CGINCLUDE
// BRDF 的一个宏
#define UNITY_SETUP_BRDF_INPUT MetallicSetup
// 结束CG着色器语言编写模块
ENDCG

// -----------------------【开始一个子着色器1】--------------------------------
SubShader
{
Tags {
// 渲染类型 Opaque 不透明
"RenderType"="Opaque"
"PerformanceChecks"="False"
}
// 细节层次为300
LOD 300


// ---------------------------通道1----------------------------
// Base forward pass (directional light, emission, lightmaps, ...)
// 正向基础渲染通道
// 处理方向光,自发光,光照贴图
Pass
{
// 设置通道名称
Name "FORWARD"
// 于通道标签中设置光照模型为 ForwardBase 正向渲染基础通道
Tags { "LightMode" = "ForwardBase" }
// 混合操作 源混合乘以目标混合
Blend [_SrcBlend] [_DstBlend]
// 根据_ZWrite参数设置深度写入模式开关与否
ZWrite [_ZWrite]

// 开始CG着色器编程
CGPROGRAM
// 着色器编译目标:Model 3.0
#pragma target 3.0
// 编译指令 着色器编译多样化 //
#pragma shader_feature _NORMALMAP
#pragma shader_feature _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON
#pragma shader_feature _EMISSION
#pragma shader_feature _METALLICGLOSSMAP
#pragma shader_feature ___ _DETAIL_MULX2
#pragma shader_feature _ _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
#pragma shader_feature _ _SPECULARHIGHLIGHTS_OFF
#pragma shader_feature _ _GLOSSYREFLECTIONS_OFF
#pragma shader_feature _PARALLAXMAP
// 着色器编译多样化快捷指令 //
// 编译指令:编译正向渲染基础通道,用于正向渲染中,应用环境光照,主方向光照和顶点/球面调和光照所需的所有变体,这些变体用于处理不同的光照贴图类型、主要方向光源的阴影选项的开关与否
#pragma multi_compile_fwdbase
// 编译指令:编译几个不同变种来处理不同类型的雾效(关闭、线性、指数、二阶指数)//
#pragma multi_compile_fog
#pragma multi_compile_instancing

// 编译指令:告知编译器顶点和片段着色函数的名称 //
#pragma vertex vertBase
#pragma fragment fragBase
// 包含的 CG 头文件
#include "UnityStandardCoreForward.cginc"

ENDCG
}
// 通道 2 //
// 正向附加渲染通道 Additive forward pass (one light per pass)
Pass
{
// 设置通道名称
Name "FORWARD_DELTA"
// 于通道标签中设置光照模型为ForwardAdd,正向渲染附加通道
Tags { "LightMode" = "ForwardAdd" }
// 混合操作:源混合乘以1
Blend [_SrcBlend] One
// 附加通道中的雾效 是黑色
Fog { Color (0,0,0,0) } // in additive pass fog should be black
// 关闭深度写入模式
ZWrite Off
// 设置深度测试模式:小于等于
ZTest LEqual

CGPROGRAM
#pragma target 3.0

// 编译指令:着色器编译多样化 //
#pragma shader_feature _NORMALMAP
#pragma shader_feature _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON
#pragma shader_feature _METALLICGLOSSMAP
#pragma shader_feature _ _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
#pragma shader_feature _ _SPECULARHIGHLIGHTS_OFF
#pragma shader_feature ___ _DETAIL_MULX2
#pragma shader_feature _PARALLAXMAP

// 使用Unity内置的着色器编译多样化快捷指令 //
// 编译指令:编译正向渲染基础通道所需的所有变体,但同时为上述通道的处理赋予了光照实时阴影的能力
#pragma multi_compile_fwdadd_fullshadows
// 编译指令:编译几个不同变种来处理不同类型的雾效(关闭、线性、指数、二阶指数)
#pragma multi_compile_fog

// 编译指令:告知编译器顶点和片段着色函数的名称 //
#pragma vertex vertAdd
#pragma fragment fragAdd
#include "UnityStandardCoreForward.cginc"

ENDCG
}

// 通道3 //
// 阴影渲染通道 Shadow rendering pass
Pass {
// 设置通道名称
Name "ShadowCaster"
// 此光照模型代表着将物体的深度渲染到阴影贴图或深度纹理
Tags { "LightMode" = "ShadowCaster" }
// 开启深度写入模式,设置深度测试模式:小于等于
ZWrite On ZTest LEqual

CGPROGRAM
#pragma target 3.0

// 编译指令:着色器编译多样化 //
#pragma shader_feature _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON
#pragma shader_feature _METALLICGLOSSMAP
#pragma shader_feature _PARALLAXMAP
// 进行阴影投射相关的多着色器变体的编译
#pragma multi_compile_shadowcaster
#pragma multi_compile_instancing

// 编译指令:告知编译器顶点和片段着色器的名称
#pragma vertex vertShadowCaster
#pragma fragment fragShadowCaster

#include "UnityStandardShadow.cginc"

ENDCG
}
// 通道4 //
// 延迟渲染通道 Deferred pass
Pass
{
// 设置通道名称
Name "DEFERRED"
// 于通道标签中设置光照模型为 Deferred,延迟渲染通道
Tags { "LightMode" = "Deferred" }

CGPROGRAM
#pragma target 3.0
#pragma exclude_renderers nomrt

#pragma shader_feature _NORMALMAP
#pragma shader_feature _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON
#pragma shader_feature _EMISSION
#pragma shader_feature _METALLICGLOSSMAP
#pragma shader_feature _ _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
#pragma shader_feature _ _SPECULARHIGHLIGHTS_OFF
#pragma shader_feature ___ _DETAIL_MULX2
#pragma shader_feature _PARALLAXMAP

#pragma multi_compile_prepassfinal
#pragma multi_compile_instancing

#pragma vertex vertDeferred
#pragma fragment fragDeferred

#include "UnityStandardCore.cginc"

ENDCG
}

// 通道5 //
// Extracts information for lightmapping, GI (emission, albedo, ...)
// This pass it not used during regular rendering.
// 元通道(Meta Pass),是全局光照 GI,光照贴图等技术提取相关参数,如(emission,albedo 等参数值)
// 此通道并不在常规的渲染过程中使用
Pass
{
// 设置通道名称
Name "META"
// 于通道中设置光照模型为 Meta
Tags { "LightMode"="Meta" }
// 关闭剔除操作
Cull Off

CGPROGRAM
#pragma vertex vert_meta
#pragma fragment frag_meta

#pragma shader_feature _EMISSION
#pragma shader_feature _METALLICGLOSSMAP
#pragma shader_feature _ _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
#pragma shader_feature ___ _DETAIL_MULX2
#pragma shader_feature EDITOR_VISUALIZATION

#include "UnityStandardMeta.cginc"
ENDCG
}
}

// ------------------------- 【子着色器 2】 ----------------------------
SubShader
{
// 渲染类型设置:不透明
Tags { "RenderType"="Opaque" "PerformanceChecks"="False" }
// 细节层次设置为 150
LOD 150

// 通道 1 //
// 正向基础渲染通道 Base forward pass (directional light, emission, lightmaps, ...)
// 处理方向光、自发光、光照贴图等等
Pass
{
// 设置通道名称
Name "FORWARD"
// 于通道标签中设置光照模型为 Forward 正向渲染基础通道
Tags { "LightMode" = "ForwardBase" }
// 混合操作:源混合乘以目标混合,结果为两者的混合
Blend [_SrcBlend] [_DstBlend]
// 根据 _Write 参数设置深度写入模式开关与否
ZWrite [_ZWrite]

CGPROGRAM
// 着色器编译目标:Model 2.0 /////
#pragma target 2.0

#pragma shader_feature _NORMALMAP
#pragma shader_feature _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON
#pragma shader_feature _EMISSION
#pragma shader_feature _METALLICGLOSSMAP
#pragma shader_feature _ _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
#pragma shader_feature _ _SPECULARHIGHLIGHTS_OFF
#pragma shader_feature _ _GLOSSYREFLECTIONS_OFF
// SM2.0: NOT SUPPORTED shader_feature ___ _DETAIL_MULX2
// SM2.0: NOT SUPPORTED shader_feature _PARALLAXMAP

// 跳过如下变体的编译,简化编译过程
#pragma skip_variants SHADOWS_SOFT DIRLIGHTMAP_COMBINED

// 着色器编译多样化快捷指令
#pragma multi_compile_fwdbase
#pragma multi_compile_fog

#pragma vertex vertBase
#pragma fragment fragBase
#include "UnityStandardCoreForward.cginc"

ENDCG
}
// 通道2 //
// 正向附加渲染通道 Additive forward pass (one light per pass)
// 以每一个光照一个通道的方式应用附加的逐像素光照
Pass
{
Name "FORWARD_DELTA"
// 通道标签中设置光照模型为 ForwardAdd,正向渲染附加通道
Tags { "LightMode" = "ForwardAdd" }
// 混合操作:源混合乘以1
Blend [_SrcBlend] One
// 附加通道中的雾效为黑色
Fog { Color (0,0,0,0) } // in additive pass fog should be black
// 关闭深度写入模式
ZWrite Off
// 设置深度测试模式:小于等于
ZTest LEqual

CGPROGRAM
#pragma target 2.0

#pragma shader_feature _NORMALMAP
#pragma shader_feature _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON
#pragma shader_feature _METALLICGLOSSMAP
#pragma shader_feature _ _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
#pragma shader_feature _ _SPECULARHIGHLIGHTS_OFF
#pragma shader_feature ___ _DETAIL_MULX2
// SM2.0: NOT SUPPORTED shader_feature _PARALLAXMAP
#pragma skip_variants SHADOWS_SOFT

// 编译指令:编译正向渲染基础通道所需的所有变体,但同时为上述通道的处理赋予了光照实时阴影的能力
#pragma multi_compile_fwdadd_fullshadows
// 编译指令:编译几个不同变种来处理不同类型的雾效
#pragma multi_compile_fog

#pragma vertex vertAdd
#pragma fragment fragAdd
#include "UnityStandardCoreForward.cginc"

ENDCG
}

// 阴影渲染通道,将物体的深度渲染到阴影贴图或深度纹理中
// Shadow rendering pass
Pass {
// 设置通道名字
Name "ShadowCaster"
// 于通道标签中设置光照模型为 ShadowCaster,此光照模型代表着将物体的深度渲染到阴影贴图或深度纹理
Tags { "LightMode" = "ShadowCaster" }

ZWrite On ZTest LEqual

CGPROGRAM
#pragma target 2.0

#pragma shader_feature _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON
#pragma shader_feature _METALLICGLOSSMAP
// 编译指令:跳过某些变体的编译
#pragma skip_variants SHADOWS_SOFT
#pragma multi_compile_shadowcaster

#pragma vertex vertShadowCaster
#pragma fragment fragShadowCaster

#include "UnityStandardShadow.cginc"

ENDCG
}

// 通道4 //
// 元通道 Meta Pass,全局光照 GI,光照贴图等技术提取相关参数,如 emission、albedo 等参数值 Extracts information for lightmapping, GI (emission, albedo, ...)
// This pass it not used during regular rendering. 此通道并不在常规的渲染过程中使用
Pass
{
Name "META"
Tags { "LightMode"="Meta" }

Cull Off

CGPROGRAM
#pragma vertex vert_meta
#pragma fragment frag_meta

#pragma shader_feature _EMISSION
#pragma shader_feature _METALLICGLOSSMAP
#pragma shader_feature _ _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
#pragma shader_feature ___ _DETAIL_MULX2
#pragma shader_feature EDITOR_VISUALIZATION

#include "UnityStandardMeta.cginc"
ENDCG
}
}

// 回退 Shader 为顶点光照 Shader
FallBack "VertexLit"
// 使用特定自定义的编译器 UI 界面
CustomEditor "StandardShaderGUI"
}

End.