unity-shader-光照shader详解之standard

关于 standard shader 的详细解释


前篇


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
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496

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

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

//凹凸的尺度
_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

//混合状态的定义
[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】------------------------------------
// 此子着色器用于Shader Model 3.0
//----------------------------------------------------------------------------------------
SubShader
{
//渲染类型设置:不透明
Tags { "RenderType"="Opaque" "PerformanceChecks"="False" }

//细节层次设为:300
LOD 300

//--------------------------------通道1-------------------------------
// 正向基础渲染通道(Base forward pass)
// 处理方向光,自发光,光照贴图等 ...
Pass
{
//设置通道名称
Name "FORWARD"

//于通道标签中设置光照模型为ForwardBase,正向渲染基础通道
Tags { "LightMode" = "ForwardBase" }

//混合操作:源混合乘以目标混合
Blend [_SrcBlend] [_DstBlend]
// 根据_ZWrite参数,设置深度写入模式开关与否
ZWrite [_ZWrite]

//===========开启CG着色器语言编写模块===========
CGPROGRAM

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

//编译指令:不使用GLES渲染器编译
#pragma exclude_renderers gles

// ---------编译指令:着色器编译多样化--------
#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 _PARALLAXMAP

//--------着色器编译多样化快捷指令------------
//编译指令:编译正向渲染基础通道(用于正向渲染中,应用环境光照、主方向光照和顶点/球面调和光照)所需的所有变体。
//这些变体用于处理不同的光照贴图类型、主要方向光源的阴影选项的开关与否
#pragma multi_compile_fwdbase
//编译指令:编译几个不同变种来处理不同类型的雾效(关闭/线性/指数/二阶指数/)
#pragma multi_compile_fog

//编译指令:告知编译器顶点和片段着色函数的名称
#pragma vertex vertForwardBase
#pragma fragment fragForwardBase

//包含辅助CG头文件
#include "UnityStandardCore.cginc"

//===========结束CG着色器语言编写模块===========
ENDCG
}
//--------------------------------通道2-------------------------------
// 正向附加渲染通道(Additive forward pass)
// 以每个光照一个通道的方式应用附加的逐像素光照
Pass
{
//设置通道名称
Name "FORWARD_DELTA"

//于通道标签中设置光照模型为ForwardAdd,正向渲染附加通道
Tags { "LightMode" = "ForwardAdd" }

//混合操作:源混合乘以1
Blend [_SrcBlend] One

//附加通道中的雾效应该为黑色
Fog { Color (0,0,0,0) }

//关闭深度写入模式
ZWrite Off
//设置深度测试模式:小于等于
ZTest LEqual

//===========开启CG着色器语言编写模块===========
CGPROGRAM

//着色器编译目标:Model 3.0
#pragma target 3.0
//编译指令:不使用GLES渲染器编译
#pragma exclude_renderers gles

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

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

//编译指令:告知编译器顶点和片段着色函数的名称
#pragma vertex vertForwardAdd
#pragma fragment fragForwardAdd

//包含辅助CG头文件
#include "UnityStandardCore.cginc"

//===========结束CG着色器语言编写模块===========
ENDCG
}

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

//开启深入写入模式
ZWrite On
//设置深度测试模式:小于等于
ZTest LEqual

//===========开启CG着色器语言编写模块===========
CGPROGRAM

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

//编译指令:不使用GLES渲染器编译
#pragma exclude_renderers gles


// ---------编译指令:着色器编译多样化--------
#pragma shader_feature _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON

//--------着色器编译多样化快捷指令------------
//进行阴影投射相关的多着色器变体的编译
#pragma multi_compile_shadowcaster

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

//包含辅助CG头文件
#include "UnityStandardShadow.cginc"

//===========结束CG着色器语言编写模块===========
ENDCG
}

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

CGPROGRAM
#pragma target 3.0
// TEMPORARY: GLES2.0 temporarily disabled to prevent errors spam on devices without textureCubeLodEXT
#pragma exclude_renderers nomrt gles


//---------编译指令:着色器编译多样化(shader_feature)--------
#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 _PARALLAXMAP

//---------编译指令:着色器编译多样化(multi_compile)--------
#pragma multi_compile ___ UNITY_HDR_ON
#pragma multi_compile LIGHTMAP_OFF LIGHTMAP_ON
#pragma multi_compile DIRLIGHTMAP_OFF DIRLIGHTMAP_COMBINED DIRLIGHTMAP_SEPARATE
#pragma multi_compile DYNAMICLIGHTMAP_OFF DYNAMICLIGHTMAP_ON

//编译指令:告知编译器顶点和片段着色函数的名称
#pragma vertex vertDeferred
#pragma fragment fragDeferred

//包含辅助CG头文件
#include "UnityStandardCore.cginc"

//===========结束CG着色器语言编写模块===========
ENDCG
}

// --------------------------------通道5-------------------------------
//元通道(Meta Pass)
//为全局光照(GI),光照贴图等技术提取相关参数,如(emission, albedo等参数值)
//此通道并不在常规的渲染过程中使用
Pass
{
//设置通道名称
Name "META"

//于通道标签中设置光照模型为Meta
//(截止2015年10月22日,Unity 5.2.1的官方文档中并没有收录此光照模型,应该是Unity官方的疏漏)
Tags { "LightMode"="Meta" }
//关闭剔除操作
Cull Off

//===========开启CG着色器语言编写模块===========
CGPROGRAM

//编译指令:告知编译器顶点和片段着色函数的名称
#pragma vertex vert_meta
#pragma fragment frag_meta

//---------编译指令:着色器编译多样化--------
#pragma shader_feature _EMISSION
#pragma shader_feature _METALLICGLOSSMAP
#pragma shader_feature ___ _DETAIL_MULX2

//包含辅助CG头文件
#include "UnityStandardMeta.cginc"

//===========结束CG着色器语言编写模块===========
ENDCG
}
}

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

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

//===========开启CG着色器语言编写模块===========
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 ___ _DETAIL_MULX2
// SM2.0: NOT SUPPORTED shader_feature _PARALLAXMAP

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

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

//编译指令:告知编译器顶点和片段着色函数的名称
#pragma vertex vertForwardBase
#pragma fragment fragForwardBase

//包含辅助CG头文件
#include "UnityStandardCore.cginc"

//===========结束CG着色器语言编写模块===========
ENDCG
}

//--------------------------------通道2-------------------------------
// 正向附加渲染通道(Additive forward pass)
// 以每个光照一个通道的方式应用附加的逐像素光照
Pass
{
//设置通道名称
Name "FORWARD_DELTA"

//于通道标签中设置光照模型为ForwardAdd,正向渲染附加通道
Tags { "LightMode" = "ForwardAdd" }

//混合操作:源混合乘以1
Blend [_SrcBlend] One

//附加通道中的雾效应该为黑色
Fog { Color (0,0,0,0) }

//关闭深度写入模式
ZWrite Off

//设置深度测试模式:小于等于
ZTest LEqual

//===========开启CG着色器语言编写模块===========
CGPROGRAM
//着色器编译目标:Model 2.0
#pragma target 2.0

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

//跳过一些变体的编译
// SM2.0: NOT SUPPORTED shader_feature _PARALLAXMAP
#pragma skip_variants SHADOWS_SOFT

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

//编译指令:告知编译器顶点和片段着色函数的名称
#pragma vertex vertForwardAdd
#pragma fragment fragForwardAdd

//包含辅助CG头文件
#include "UnityStandardCore.cginc"

//===========结束CG着色器语言编写模块===========
ENDCG
}

// --------------------------------通道3-------------------------------
// 阴影渲染通道(Shadow Caster pass)
// 将将物体的深度渲染到阴影贴图或深度纹理中
Pass
{
//设置通道名称
Name "ShadowCaster"

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

//开启深入写入模式
ZWrite On

//设置深度测试模式:小于等于
ZTest LEqual

//===========开启CG着色器语言编写模块===========
CGPROGRAM
//着色器编译目标:Model 2.0
#pragma target 2.0

//---------编译指令:着色器编译多样化(shader_feature)--------
#pragma shader_feature _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON

//编译指令:跳过某些变体的编译
#pragma skip_variants SHADOWS_SOFT

//快捷编译指令:进行阴影投射相关的多着色器变体的编译
#pragma multi_compile_shadowcaster

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

//包含辅助CG头文件
#include "UnityStandardShadow.cginc"

//===========结束CG着色器语言编写模块===========
ENDCG
}

// --------------------------------通道4-------------------------------
//元通道(Meta Pass)
//为全局光照(GI),光照贴图等技术提取相关参数,如(emission, albedo等参数值)
//此通道并不在常规的渲染过程中使用
Pass
{
//设置通道名称
Name "META"

//于通道标签中设置光照模型为Meta
//(截止2015年10月22日,Unity 5.2.1的官方文档中并没有收录此光照模型,应该是Unity官方的疏漏)
Tags { "LightMode"="Meta" }
//关闭剔除操作
Cull Off

//===========开启CG着色器语言编写模块===========
CGPROGRAM

//编译指令:告知编译器顶点和片段着色函数的名称
#pragma vertex vert_meta
#pragma fragment frag_meta

//---------编译指令:着色器编译多样化--------
#pragma shader_feature _EMISSION
#pragma shader_feature _METALLICGLOSSMAP
#pragma shader_feature ___ _DETAIL_MULX2

//包含辅助CG头文件
#include "UnityStandardMeta.cginc"

//===========结束CG着色器语言编写模块===========
ENDCG
}
}

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