├── .gitattributes
├── .gitignore
├── README.md
├── Volume 01 凹凸纹理显示+自选边缘颜色和强度Shader
├── 0.TheFirstShader.shader
└── README.md
├── Volume 02 Unity基本Shader框架写法
├── 0.Shader框架示例.shader
├── 1.基础单色Shader.shader
├── 2.材质颜色设置&开启光照.shader
├── 3.简单的可调漫反射光照.shader
├── 4.光照材质完备beta版.shader
├── 5.简单的纹理载入Shader.shader
├── 6.光照材质完备正式版Shader.shader
└── README.md
├── Volume 03 子着色器、通道与标签的写法 & 纹理混合
├── 1. Alpha纹理混合.shader
├── 2.纹理的Alpha通道与自发光相混合.shader
├── 3. 纹理Alpha与自发光混合可调色版.shader
├── 4. 顶点光照+纹理Alpha自发光混合.shader
├── 5. 顶点光照+自发光混合+纹理混合.shader
└── README.md
├── Volume 04 剔除、深度测试、Alpha测试以及基本雾效合辑
├── 1.用剔除操作渲染对象背面.shader
├── 2.用剔除操作渲染对象背面v2.shader
├── 3.用剔除实现玻璃效果.shader
├── 4.基本Alpha测试.shader
├── 5.顶点光照+可调透明度.shader
├── 6.简单的植被Shader.shader
└── README.md
├── Volume 05 Unity中Shader的三种形态对比&混合操作
├── 1.纹理载入.shader
├── 2.基本blend使用.shader
├── 3.基本blend使用+颜色可调.shader
├── 4.基本blend使用+顶点光照.shader
├── 5.玻璃效果v2版.shader
├── 6.玻璃效果v3版.shader
├── README.md
├── 一、固定功能Shader示例.shader
├── 三、可编程Shader示例.shader
└── 二、表面Shader示例.shader
├── Volume 06 表面着色器(Surface Shader)的写法(一)
├── 1.最基本的SurfaceShader.shader
├── 2.颜色可调.shader
├── 3.基本纹理载入.shader
├── 4.凹凸纹理.shader
├── 5.纹理+颜色修改.shader
├── 6.凹凸纹理+边缘光照.shader
├── 7.凹凸纹理+颜色可调+边缘光照.shader
├── 8.细节纹理.shader
├── 9.凹凸纹理+颜色可调+边缘光照+细节纹理.shader
└── README.md
├── Volume 07 表面着色器的写法(二)-自定义光照模式
├── 0.漫反射.shader
├── 1.自定义高光效果.shader
├── 2.自制简单的Lambert光照.shader
├── 3.自制半Lambert光照.shader
├── 4.自定义卡通渐变光照.shader
├── 5.自定义卡通渐变光照v2.shader
└── README.md
├── Volume 08 径向模糊屏幕特效Shader&自定义Shader template
├── MotionBlurEffects
│ ├── MotionBlurEffects.cs
│ └── MotionBlurEffects.shader
├── README.md
└── ShaderTemplates
│ ├── ImageEffectShaderTemplate.shader
│ ├── SurfaceShaderTemplate.shader
│ └── UnlitShaderTemplate.shader
├── Volume 09 屏幕水幕特效Shader&Standard Shader
├── README.md
├── ScreenWaterDropEffect
│ ├── Resources
│ │ └── ScreenWaterDrop.png
│ ├── ScreenWaterDropEffect.cs
│ └── ScreenWaterDropEffect.shader
└── Unity5.2.1 Built-in Standard Shader
│ └── Standard.shader
├── Volume 10 屏幕油画特效Shader
├── README.md
└── ScreenOilPaintEffect
│ ├── ScreenOilPaintEffect.cs
│ └── ScreenOilPaintEffect.shader
├── Volume 11 屏幕像素化特效Shader
├── PixelEffect
│ ├── PixelEffect.cs
│ └── PixelEffect.shader
└── README.md
├── Volume 12 可编程Shader初步 & 标准漫反射可编程Shader
├── 1.SimpleShader.shader
├── 2.ColorChange.shader
├── 3.RGB Cube.shader
├── 4.Adjustable RGB Cube.shader
├── 5.RGB Adjustable RGB Cube.shader
├── 6.Diffuse(Lambert) Shader.shader
├── 7.Diffuse(Lambert) Shader with Texture.shader
└── README.md
├── Volume 13 单色透明Shader & 标准镜面高光Shader
├── 1.SimpleAlphaShader.shader
├── 2.ColorChangeAlpha.shader
├── 3.TwoSideColorChangeAlpha.shader
├── 4.Specular.shader
├── 5.Specular with Texture.shader
└── README.md
├── Volume 14 边缘发光Shader(Rim Shader)的两种实现形态
├── BasicRimShader.shader
├── README.md
└── SurfaceRimShader.shader
├── Volume 15 屏幕高斯模糊(Gaussian Blur)特效的实现
├── README.md
├── RapidBlurEffect.cs
└── RapidBlurEffect.shader
└── Volume 16 基于MatCap实现高真实感车漆Shader
├── CarPaint-MatCap.png
├── CarPaintShader.shader
├── CubeMap-Lit.cubemap
└── MatCap Textrues
├── 12719-normal.jpg
├── 12719-v1.jpg
├── 23b9a7bd7706e4789f83aa0aa68970f1.jpg
├── BAwGNg5CUAAE2F7.png
├── b0a043453b8fd95de47df72b4372e9df.jpg
├── ddf2919e5a5ed43ade15f46108eea632.jpg
├── e0ab9eab64c3500e0ff4ff1631d88c9e.jpg
├── e2204847f0b6ffa335bd94c74ef1a4d1.jpg
├── ee22ee998a0e12e674ff118006c807c5.jpg
├── generator8.jpg
├── im1gres.jpg
├── ima1ges.jpg
├── imagetes.jpg
├── j0PUwxm.png
├── static1.squarespace.jpg
├── u1rl.jpg
└── url.jpg
/.gitattributes:
--------------------------------------------------------------------------------
1 | # Auto detect text files and perform LF normalization
2 | * text=auto
3 |
4 | # Custom for Visual Studio
5 | *.cs diff=csharp
6 |
7 | # Standard to msysgit
8 | *.doc diff=astextplain
9 | *.DOC diff=astextplain
10 | *.docx diff=astextplain
11 | *.DOCX diff=astextplain
12 | *.dot diff=astextplain
13 | *.DOT diff=astextplain
14 | *.pdf diff=astextplain
15 | *.PDF diff=astextplain
16 | *.rtf diff=astextplain
17 | *.RTF diff=astextplain
18 |
19 | *.shader linguist-language=shaderlab
20 | *.cginc linguist-language=shaderlab
21 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Windows image file caches
2 | Thumbs.db
3 | ehthumbs.db
4 |
5 | # Folder config file
6 | Desktop.ini
7 |
8 | # Recycle Bin used on file shares
9 | $RECYCLE.BIN/
10 |
11 | # Windows Installer files
12 | *.cab
13 | *.msi
14 | *.msm
15 | *.msp
16 |
17 | # Windows shortcuts
18 | *.lnk
19 |
20 | # =========================
21 | # Operating System Files
22 | # =========================
23 |
24 | # OSX
25 | # =========================
26 |
27 | .DS_Store
28 | .AppleDouble
29 | .LSOverride
30 |
31 | # Thumbnails
32 | ._*
33 |
34 | # Files that might appear on external disk
35 | .Spotlight-V100
36 | .Trashes
37 |
38 | # Directories potentially created on remote AFP share
39 | .AppleDB
40 | .AppleDesktop
41 | Network Trash Folder
42 | Temporary Items
43 | .apdisk
44 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Awesome-Unity-Shader
2 | 这是一个关于Unity3D Shader的Rep。目前主要是自己博客专栏《【浅墨Unity3D Shader编程】》中推出的一些Shader代码的收集。
3 | * Shader专栏地址:[https://blog.csdn.net/zhmxy555/category_9264739.html](https://blog.csdn.net/zhmxy555/category_9264739.html)
4 |
5 |
6 | ## 推荐新的高品质Unity Shader项目 | Recommend New Awesome Unity Shader Library
7 |
8 | X-PostProcessing Libray,简称XPL,是针对Unity引擎的高品质开源后处理库,旨在提供业界主流的高品质后处理特效的完整解决方案。目前已完美支持Unity Post-processing Stack v2,后续也将提供对Unity引擎URP/LWRP/HDRP的兼容支持。
9 |
10 | X-PostProcessing Library (XPL) is a high quality post processing library for for Unity Post Processing Stack v2/LWRP/URP/HDRP
11 |
12 | 
13 | **【详情可见 | The X-PostProcessing Libray Repo is here:[https://github.com/QianMo/X-PostProcessing-Library](https://github.com/QianMo/X-PostProcessing-Library)】**
14 |
15 |
16 |
17 |
18 | 以下是各个Shader的图示。
19 |
20 |
21 |
22 | ## Volume 1 凹凸纹理显示+自选边缘颜色和强度Shader
23 |
24 |
25 |
26 | ### 0.TheFirstShader
27 |
28 | 
29 |
30 |
31 |
32 |
33 | ## Volume 02 Unity基本Shader框架写法
34 |
35 |
36 |
37 | ### 1.单色Shader
38 |
39 | 
40 |
41 |
42 | ### 2.材质颜色&开启光照Shader
43 |
44 | 
45 |
46 |
47 | ### 3.可调漫反射光Shader
48 |
49 | 
50 |
51 |
52 | ### 4.光照材质完备beta版Shader
53 |
54 | 
55 |
56 |
57 | ### 5.简单的纹理载入Shader
58 |
59 | 
60 |
61 |
62 | ### 6.光照材质完备正式版Shader
63 |
64 | 
65 |
66 |
67 | ## Volume 03 子着色器、通道与标签的写法 & 纹理混合
68 |
69 |
70 |
71 | ### 1. Alpha纹理混合
72 |
73 | 
74 |
75 |
76 | ### 2.纹理的Alpha通道与自发光相混合
77 |
78 | 
79 |
80 |
81 | ### 3. 纹理Alpha与自发光混合可调色版
82 |
83 | 
84 |
85 |
86 | ### 4. 顶点光照+纹理Alpha自发光混合
87 |
88 | 
89 |
90 |
91 |
92 | ### 5. 顶点光照+自发光混合+纹理混合
93 |
94 | 
95 |
96 |
97 |
98 | ## Volume 04 剔除、深度测试、Alpha测试以及基本雾效
99 |
100 |
101 |
102 | ### 1.用剔除操作渲染对象背面
103 |
104 | 
105 |
106 |
107 | 
108 |
109 |
110 | 
111 |
112 |
113 | ### 2. 用剔除操作渲染对象背面(第二版)
114 |
115 | 
116 |
117 |
118 | 
119 |
120 |
121 | 
122 |
123 |
124 | ### 3.用剔除实现玻璃效果
125 |
126 | 
127 |
128 |
129 |
130 | 
131 |
132 |
133 |
134 | ### 4.基本Alpha测试
135 |
136 | 
137 |
138 |
139 |
140 | ### 5.顶点光照+可调透明度
141 |
142 | 
143 |
144 |
145 |
146 | ### 6.简单的植被Shader
147 |
148 | 
149 |
150 |
151 |
152 |
153 | ## Volume 05 Unity中Shader的三种形态对比&混合操作
154 |
155 |
156 |
157 | ### 一:固定功能Shader示例
158 |
159 | 
160 |
161 |
162 |
163 | 
164 |
165 |
166 |
167 | ### 二:表面着色器Surface Shader示例
168 |
169 | 
170 |
171 |
172 |
173 | 
174 |
175 |
176 |
177 | ### 三:可编程Shader示例
178 |
179 | 
180 |
181 |
182 |
183 | 
184 |
185 |
186 |
187 | ### 1. 纹理载入Shader
188 |
189 | 
190 |
191 |
192 |
193 | 
194 |
195 |
196 |
197 | ### 2.基本blend使用
198 |
199 | 
200 |
201 |
202 |
203 | 
204 |
205 |
206 |
207 | ### 3.基本blend使用+颜色可调
208 |
209 | 
210 |
211 |
212 |
213 | 
214 |
215 |
216 |
217 | ### 4.基本blend使用+顶点光照
218 |
219 | 
220 |
221 |
222 |
223 | 
224 |
225 |
226 |
227 | ### 5.实现玻璃效果第二版
228 |
229 | 
230 |
231 |
232 |
233 | 
234 |
235 |
236 |
237 | ### 6.实现玻璃效果第三版
238 |
239 | 
240 |
241 |
242 |
243 | 
244 |
245 |
246 |
247 |
248 |
249 | ## Volume 06 表面着色器(Surface Shader)的写法(一)
250 |
251 |
252 |
253 | ### 1.最基本的Surface Shader
254 |
255 | 
256 |
257 |
258 |
259 | 
260 |
261 |
262 |
263 | ### 2.颜色可调
264 |
265 | 
266 |
267 |
268 |
269 | 
270 |
271 |
272 |
273 | ### 3.基本纹理载入
274 |
275 | 
276 |
277 |
278 |
279 | 
280 |
281 |
282 |
283 | ### 4.凹凸纹理载入
284 |
285 | 
286 |
287 |
288 |
289 | 
290 |
291 |
292 |
293 | ### 5.纹理载入+颜色可调
294 |
295 | 
296 |
297 |
298 |
299 | 
300 |
301 |
302 |
303 | ### 6. 凹凸纹理+边缘光照
304 |
305 | 
306 |
307 |
308 |
309 | 
310 |
311 |
312 |
313 | ### 7.凹凸纹理+颜色可调
314 |
315 | 
316 |
317 |
318 |
319 | 
320 |
321 |
322 |
323 | ### 8.细节纹理
324 |
325 | 
326 |
327 |
328 |
329 | 
330 |
331 |
332 |
333 | ### 9.凹凸纹理+颜色可调+边缘光照+细节纹理
334 |
335 | 
336 |
337 |
338 |
339 | 
340 |
341 |
342 |
343 |
344 | ## Volume 07 表面着色器的写法(二):自定义光照模式
345 |
346 | ### 0.内置的漫反射光照
347 |
348 | 
349 |
350 |
351 |
352 | ### 1.简单的高光光照模型
353 |
354 | 
355 |
356 |
357 |
358 | ### 2.自制简单的Lambert光照
359 |
360 | 
361 |
362 |
363 | ### 3.自定义的半Lambert光照
364 |
365 | 
366 |
367 |
368 | ### 4.自定义卡通渐变光照
369 |
370 | 第一组:
371 |
372 | 
373 |
374 | 
375 |
376 | 第二组:
377 |
378 | 
379 |
380 | 
381 |
382 | 第三组:
383 |
384 | 
385 |
386 | 
387 |
388 |
389 |
390 | ### 5.自定义卡通渐变光照v2
391 |
392 | 
393 |
394 |
395 |
396 | 
397 |
398 |
399 |
400 | 
401 |
402 |
403 |
404 |
405 |
406 |
407 | ## Volume 08 径向模糊屏幕特效
408 |
409 | 
410 |
411 |
412 |
413 | 
414 |
415 |
416 |
417 | ## Volume 09 屏幕水幕特效的实现
418 |
419 | 
420 |
421 |
422 |
423 | 
424 |
425 |
426 |
427 | ## Volume 10 屏幕油画特效的实现
428 |
429 | 
430 |
431 |
432 |
433 | 
434 |
435 |
436 |
437 | ## Volume 11 屏幕像素化特效的实现
438 |
439 | 
440 |
441 |
442 |
443 | 
444 |
445 |
446 |
447 | ## Volume 12 可编程Shader初步 & 漫反射可编程Shader
448 |
449 | ### 1.单色Shader
450 |
451 | 
452 |
453 |
454 |
455 | ### 2.单色可调Shader的书写
456 |
457 | 
458 |
459 |
460 |
461 | ### 4.颜色单项可调的RGB Cube
462 |
463 | 
464 |
465 |
466 |
467 | ###5.三色分量可调的RGB Cube
468 |
469 | 
470 |
471 |
472 | ### 6.单色可调的漫反射光照Shader书写
473 |
474 | 
475 |
476 |
477 | ### 7.可调颜色和自定义纹理的漫反射光照Shader
478 |
479 | 
480 |
481 |
482 |
483 | 下图是此漫反射Shader使用到皮卡丘模型上的效果图。
484 |
485 | 
486 |
487 | 
488 |
489 | 
490 |
491 |
492 |
493 |
494 | ## Volume 13 单色透明Shader & 标准镜面高光Shader
495 |
496 |
497 |
498 | ### 1.单色透明Shader
499 |
500 | 
501 |
502 |
503 | ### 2.颜色可以调版单色透明Shader
504 |
505 | 
506 |
507 |
508 | ### 3.双面双色颜色可以调版透明Shader
509 |
510 | 
511 | 从物体外部看:
512 |
513 | 
514 |
515 | 从物体内部看:
516 |
517 | 
518 |
519 | ### 4.镜面反射(Specular)Shader
520 |
521 | 
522 |
523 |
524 | ### 5.带纹理载入的specular shader
525 |
526 | 
527 |
528 | 将此Shader施于妙蛙草的模型之上,得到的便是如端游《剑灵》一般油腻腻的画风感觉:
529 |
530 | 
531 |
532 | 
533 |
534 |
535 |
536 |
537 | ## Volume 14.边缘发光Shader(Rim Shader)的两种实现形态 || Two Way to Write Rim Shader
538 |
539 |
540 |
541 | ### 1
542 |
543 | 
544 |
545 |
546 | ### 2
547 | 
548 |
549 |
550 | ### 3
551 |
552 | 
553 |
554 |
555 | ### 4
556 |
557 | 
558 |
559 | ### 5
560 |
561 | 
562 |
563 |
564 |
565 | ## Volume 15. 屏幕高斯模糊(Gaussian Blur)后期特效的实现 || Gaussian Blur Post Effect
566 |
567 |
568 |
569 | ### 1
570 |
571 | 
572 |
573 |
574 |
575 | ### 2
576 |
577 | 
578 |
579 |
580 | ### 3
581 |
582 | 
583 |
584 |
585 |
586 | ## Volume 16. 基于MatCap实现适于移动平台的“次时代”车漆Shader || Car Paint Shader Suitable for Mobile Platform Based On MatCap
587 |
588 |
589 |
590 | ### 1
591 |
592 | 
593 |
594 |
595 |
596 | ### 2
597 |
598 | 
599 |
600 |
601 |
602 | ### 3
603 |
604 | 
605 |
606 |
--------------------------------------------------------------------------------
/Volume 01 凹凸纹理显示+自选边缘颜色和强度Shader/0.TheFirstShader.shader:
--------------------------------------------------------------------------------
1 |
2 | //-----------------------------------------------【Shader说明】----------------------------------------------
3 | // Shader功能: 凹凸纹理显示+自选边缘颜色和强度
4 | // 使用语言: Shaderlab
5 | // 开发所用IDE版本:Unity4.5 06f 、Monodevelop
6 | // 2014年11月2日 Created by 浅墨
7 | // 更多内容或交流请访问浅墨的博客:http://blog.csdn.net/poem_qianmo
8 | //---------------------------------------------------------------------------------------------------------------------
9 |
10 |
11 | Shader "浅墨Shader编程/0.TheFirstShader"
12 | {
13 | //-------------------------------【属性】-----------------------------------------
14 | Properties
15 | {
16 | _MainTex ("【纹理】Texture", 2D) = "white" {}
17 | _BumpMap ("【凹凸纹理】Bumpmap", 2D) = "bump" {}
18 | _RimColor ("【边缘颜色】Rim Color", Color) = (0.17,0.36,0.81,0.0)
19 | _RimPower ("【边缘颜色强度】Rim Power", Range(0.6,9.0)) = 1.0
20 | }
21 |
22 | //----------------------------【开始一个子着色器】---------------------------
23 | SubShader
24 | {
25 | //渲染类型为Opaque,不透明
26 | Tags { "RenderType" = "Opaque" }
27 |
28 | //-------------------开始CG着色器编程语言段-----------------
29 | CGPROGRAM
30 |
31 | //使用兰伯特光照模式
32 | #pragma surface surf Lambert
33 |
34 | //输入结构
35 | struct Input
36 | {
37 | float2 uv_MainTex;//纹理贴图
38 | float2 uv_BumpMap;//法线贴图
39 | float3 viewDir;//观察方向
40 | };
41 |
42 | //变量声明
43 | sampler2D _MainTex;//主纹理
44 | sampler2D _BumpMap;//凹凸纹理
45 | float4 _RimColor;//边缘颜色
46 | float _RimPower;//边缘颜色强度
47 |
48 | //表面着色函数的编写
49 | void surf (Input IN, inout SurfaceOutput o)
50 | {
51 | //表面反射颜色为纹理颜色
52 | o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb;
53 | //表面法线为凹凸纹理的颜色
54 | o.Normal = UnpackNormal (tex2D (_BumpMap, IN.uv_BumpMap));
55 | //边缘颜色
56 | half rim = 1.0 - saturate(dot (normalize(IN.viewDir), o.Normal));
57 | //边缘颜色强度
58 | o.Emission = _RimColor.rgb * pow (rim, _RimPower);
59 | }
60 |
61 | //-------------------结束CG着色器编程语言段------------------
62 | ENDCG
63 | }
64 |
65 | //“备胎”为普通漫反射
66 | Fallback "Diffuse"
67 | }
68 |
--------------------------------------------------------------------------------
/Volume 01 凹凸纹理显示+自选边缘颜色和强度Shader/README.md:
--------------------------------------------------------------------------------
1 |
2 | #内容图示
3 | ##Volume 1 凹凸纹理显示+自选边缘颜色和强度Shader
4 | 
5 |
--------------------------------------------------------------------------------
/Volume 02 Unity基本Shader框架写法/0.Shader框架示例.shader:
--------------------------------------------------------------------------------
1 |
2 | Shader "浅墨Shader编程/0.Shader框架示例"
3 | {
4 | //-------------------------------【属性】-----------------------------------------
5 | Properties
6 | {
7 | //纹理
8 | _MainTex("基本纹理",2D)="White"{TexGen ObjectLinear}
9 | }
10 |
11 | //---------------------------------【子着色器1】----------------------------------
12 | SubShader
13 | {
14 | //----------------通道---------------
15 | Pass
16 | {
17 | //设置纹理为属性中选择的纹理
18 | SetTexture[_MainTex]{combine texture}
19 | }
20 |
21 | }
22 |
23 | //---------------------------------【备胎】----------------------------------------
24 | //备胎设为Unity自带的普通漫反射
25 | Fallback "Diffuse"
26 | }
27 |
28 |
29 |
30 |
31 |
--------------------------------------------------------------------------------
/Volume 02 Unity基本Shader框架写法/1.基础单色Shader.shader:
--------------------------------------------------------------------------------
1 |
2 | Shader"浅墨Shader编程/1.基础单色"
3 | {
4 | //---------------------------------【子着色器】----------------------------------
5 | SubShader
6 | {
7 | //----------------通道---------------
8 | Pass
9 | {
10 | //设为蓝色单色
11 | Color(0,0,0.6,0)
12 | }
13 | }
14 | }
--------------------------------------------------------------------------------
/Volume 02 Unity基本Shader框架写法/2.材质颜色设置&开启光照.shader:
--------------------------------------------------------------------------------
1 |
2 | Shader"浅墨Shader编程/2.材质颜色设置&开启光照"
3 | {
4 | //---------------------------------【子着色器1】----------------------------------
5 | SubShader
6 | {
7 | //----------------通道---------------
8 | Pass
9 | {
10 | //----------材质------------
11 | Material
12 | {
13 | //将漫反射和环境光反射颜色设为相同
14 | Diffuse(0.9,0.5,0.4,1)
15 | Ambient(0.9,0.5,0.4,1)
16 | }
17 | //开启光照
18 | Lighting On
19 | }
20 | }
21 | }
--------------------------------------------------------------------------------
/Volume 02 Unity基本Shader框架写法/3.简单的可调漫反射光照.shader:
--------------------------------------------------------------------------------
1 |
2 | Shader "浅墨Shader编程/3.简单的可调漫反射光照"
3 | {
4 | //-------------------------------【属性】-----------------------------------------
5 | Properties
6 | {
7 | _MainColor ("主颜色", Color) = (1,.1,.5,1)
8 |
9 | }
10 |
11 | //---------------------------------【子着色器】----------------------------------
12 | SubShader
13 | {
14 | //----------------通道---------------
15 | Pass
16 | {
17 | //-----------材质------------
18 | Material
19 | {
20 | //可调节的漫反射光和环境光反射颜色
21 | Diffuse [_MainColor]
22 | Ambient[_MainColor]
23 | }
24 | Lighting On
25 | }
26 | }
27 | }
28 |
29 |
--------------------------------------------------------------------------------
/Volume 02 Unity基本Shader框架写法/4.光照材质完备beta版.shader:
--------------------------------------------------------------------------------
1 |
2 |
3 | Shader "浅墨Shader编程/4.光照材质完备beta版Shader"
4 | {
5 | //-------------------------------【属性】-----------------------------------------
6 | Properties
7 | {
8 | _Color ("主颜色", Color) = (1,1,1,0)
9 | _SpecColor ("反射高光颜色", Color) = (1,1,1,1)
10 | _Emission ("自发光颜色", Color) = (0,0,0,0)
11 | _Shininess ("光泽度", Range (0.01, 1)) = 0.7
12 | }
13 |
14 | //---------------------------------【子着色器】----------------------------------
15 | SubShader
16 | {
17 | //----------------通道---------------
18 | Pass
19 | {
20 | //-----------材质------------
21 | Material
22 | {
23 | //可调节的漫反射光和环境光反射颜色
24 | Diffuse [_Color]
25 | Ambient [_Color]
26 | //光泽度
27 | Shininess [_Shininess]
28 | //高光颜色
29 | Specular [_SpecColor]
30 | //自发光颜色
31 | Emission [_Emission]
32 | }
33 | //开启光照
34 | Lighting On
35 | }
36 | }
37 | }
38 |
--------------------------------------------------------------------------------
/Volume 02 Unity基本Shader框架写法/5.简单的纹理载入Shader.shader:
--------------------------------------------------------------------------------
1 | Shader "浅墨Shader编程/5.简单的纹理载入Shader"
2 | {
3 | //-------------------------------【属性】-----------------------------------------
4 | Properties
5 | {
6 | //纹理
7 | _MainTex("基本纹理",2D)="White"{TexGen SphereMap}
8 | }
9 | //---------------------------------【子着色器】----------------------------------
10 | SubShader
11 | {
12 | //----------------通道---------------
13 | Pass
14 | {
15 | //设置纹理为属性中选择的纹理
16 | SetTexture[_MainTex]{combine texture}
17 | }
18 | }
19 | //---------------------------------【备胎】----------------------------------------
20 | //备胎设为Unity自带的普通漫反射
21 | Fallback " Diffuse "
22 | }
23 |
--------------------------------------------------------------------------------
/Volume 02 Unity基本Shader框架写法/6.光照材质完备正式版Shader.shader:
--------------------------------------------------------------------------------
1 |
2 |
3 | Shader "浅墨Shader编程/6.光照材质完备正式版Shader"
4 | {
5 | //-------------------------------【属性】-----------------------------------------
6 | Properties
7 | {
8 | _Color ("主颜色", Color) = (1,1,1,0)
9 | _SpecColor ("高光颜色", Color) = (1,1,1,1)
10 | _Emission ("自发光颜色", Color) = (0,0,0,0)
11 | _Shininess ("光泽度", Range (0.01, 1)) = 0.7
12 | _MainTex ("基本纹理", 2D) = "white" {}
13 | }
14 |
15 | //--------------------------------【子着色器】--------------------------------
16 | SubShader
17 | {
18 | //----------------通道---------------
19 | Pass
20 | {
21 | //-----------材质------------
22 | Material
23 | {
24 | //可调节的漫反射光和环境光反射颜色
25 | Diffuse [_Color]
26 | Ambient [_Color]
27 | //光泽度
28 | Shininess [_Shininess]
29 | //高光颜色
30 | Specular [_SpecColor]
31 | //自发光颜色
32 | Emission [_Emission]
33 | }
34 | //开启光照
35 | Lighting On
36 | //开启独立镜面反射
37 | SeparateSpecular On
38 | //设置纹理并进行纹理混合
39 | SetTexture [_MainTex]
40 | {
41 | Combine texture * primary DOUBLE/*, texture * primary*/
42 | }
43 | }
44 | }
45 | }
--------------------------------------------------------------------------------
/Volume 02 Unity基本Shader框架写法/README.md:
--------------------------------------------------------------------------------
1 |
2 | #内容图示
3 | ##Volume 02 Unity基本Shader框架写法
4 |
5 | ###1.单色Shader
6 |
7 | 
8 |
9 | ###2.材质颜色&开启光照Shader
10 | 
11 |
12 | ###3.可调漫反射光Shader
13 | 
14 |
15 | ###4.光照材质完备beta版Shader
16 | 
17 |
18 | ###5.简单的纹理载入Shader
19 | 
20 |
21 | ###6.光照材质完备正式版Shader
22 | 
--------------------------------------------------------------------------------
/Volume 03 子着色器、通道与标签的写法 & 纹理混合/1. Alpha纹理混合.shader:
--------------------------------------------------------------------------------
1 |
2 |
3 | Shader "浅墨Shader编程/Volume3/7.Alpha纹理混合"
4 | {
5 | //-------------------------------【属性】-----------------------------------------
6 | Properties
7 | {
8 | _MainTex ("基础纹理(RGB)", 2D) = "white" {}
9 | _BlendTex ("混合纹理(RGBA) ", 2D) = "white" {}
10 | }
11 |
12 | //--------------------------------【子着色器】--------------------------------
13 | SubShader
14 | {
15 | Pass
16 | {
17 | // 【1】应用主纹理
18 | SetTexture [_MainTex] { combine texture }
19 | // 【2】使用相乘操作来进行Alpha纹理混合
20 | SetTexture [_BlendTex] {combine texture * previous}
21 | }
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/Volume 03 子着色器、通道与标签的写法 & 纹理混合/2.纹理的Alpha通道与自发光相混合.shader:
--------------------------------------------------------------------------------
1 |
2 |
3 | Shader "浅墨Shader编程/Volume3/8.纹理的Alpha通道与自发光相混合"
4 | {
5 | //-------------------------------【属性】-----------------------------------------
6 | Properties
7 | {
8 | _MainTex ("基础纹理 (RGB)-自发光(A)", 2D) = "red" { }
9 | }
10 |
11 | //--------------------------------【子着色器】----------------------------------
12 | SubShader
13 | {
14 | Pass
15 | {
16 | //【1】设置白色的顶点光照
17 | Material
18 | {
19 | Diffuse (1,1,1,1)
20 | Ambient (1,1,1,1)
21 | }
22 |
23 | //【2】开光照
24 | Lighting On
25 |
26 | //【3】使用纹理的Alpha通道来插值混合颜色(1,1,1,1)
27 | SetTexture [_MainTex]
28 | {
29 | constantColor (1,1,1,1)
30 | combine constant lerp(texture) previous
31 | }
32 |
33 | //【4】和纹理相乘
34 | SetTexture [_MainTex]
35 | {
36 | combine previous * texture
37 | }
38 | }
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/Volume 03 子着色器、通道与标签的写法 & 纹理混合/3. 纹理Alpha与自发光混合可调色版.shader:
--------------------------------------------------------------------------------
1 |
2 |
3 | Shader "浅墨Shader编程/Volume3/9.纹理Alpha与自发光混合可调色版"
4 | {
5 | //-------------------------------【属性】---------------------------------------
6 | Properties
7 | {
8 | _IlluminCol ("自发光(RGB)", Color) = (1,1,1,1)
9 | _MainTex ("基础纹理 (RGB)-自发光(A)", 2D) = "white" {}
10 | }
11 |
12 | //--------------------------------【子着色器】--------------------------------
13 | SubShader
14 | {
15 | Pass
16 | {
17 | //【1】设置白色的顶点光照
18 | Material
19 | {
20 | Diffuse (1,1,1,1)
21 | Ambient (1,1,1,1)
22 | }
23 |
24 | //【2】开启光照
25 | Lighting On
26 |
27 | // 【3】将自发光颜色混合上纹理
28 | SetTexture [_MainTex]
29 | {
30 | // 使颜色属性进入混合器
31 | constantColor [_IlluminCol]
32 | // 使用纹理的alpha通道混合顶点颜色
33 | combine constant lerp(texture) previous
34 | }
35 |
36 | // 【4】乘以纹理
37 | SetTexture [_MainTex] {combine previous * texture }
38 |
39 | }
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/Volume 03 子着色器、通道与标签的写法 & 纹理混合/4. 顶点光照+纹理Alpha自发光混合.shader:
--------------------------------------------------------------------------------
1 |
2 |
3 | Shader "浅墨Shader编程/Volume3/10.顶点光照+纹理Alpha自发光混合"
4 | {
5 | //-------------------------------【属性】---------------------------------------
6 | Properties
7 | {
8 | _IlluminCol ("自发光色", Color) = (1,1,1,1)
9 | _Color ("主颜色", Color) = (1,1,1,0)
10 | _SpecColor ("高光颜色", Color) = (1,1,1,1)
11 | _Emission ("光泽颜色", Color) = (0,0,0,0)
12 | _Shininess ("光泽度", Range (0.01, 1)) = 0.7
13 | _MainTex ("基础纹理 (RGB)-自发光(A)", 2D) = "white" { }
14 | }
15 |
16 | //--------------------------------【子着色器】--------------------------------
17 | SubShader
18 | {
19 | Pass
20 | {
21 | //【1】设置顶点光照值
22 | Material
23 | {
24 | Diffuse [_Color]
25 | Ambient [_Color]
26 | Shininess [_Shininess]
27 | Specular [_SpecColor]
28 | Emission [_Emission]
29 | }
30 |
31 | //【2】开启光照
32 | Lighting On
33 |
34 | //【3】---------------------开启独立镜面反射----------------
35 | SeparateSpecular On
36 |
37 | // 【3】将自发光颜色混合上纹理
38 | SetTexture [_MainTex]
39 | {
40 | // 使颜色属性进入混合器
41 | constantColor [_IlluminCol]
42 | // 使用纹理的alpha通道插值混合顶点颜色
43 | combine constant lerp(texture) previous
44 | }
45 |
46 | // 【4】乘上纹理
47 | SetTexture [_MainTex] { combine previous * texture }
48 |
49 | //【5】乘以顶点纹理
50 | SetTexture [_MainTex] { Combine previous * primary DOUBLE, previous * primary}
51 |
52 | }
53 |
54 | }
55 | }
56 |
57 |
58 |
59 |
--------------------------------------------------------------------------------
/Volume 03 子着色器、通道与标签的写法 & 纹理混合/5. 顶点光照+自发光混合+纹理混合.shader:
--------------------------------------------------------------------------------
1 |
2 |
3 | Shader "浅墨Shader编程/Volume3/11.顶点光照+自发光混合+纹理混合"
4 | {
5 | //-------------------------------【属性】-----------------------------------------
6 | Properties
7 | {
8 | _IlluminCol ("自发光色", Color) = (0,0,0,0)
9 | _Color ("主颜色", Color) = (1,1,1,0)
10 | _SpecColor ("高光颜色", Color) = (1,1,1,1)
11 | _Emission ("光泽颜色", Color) = (0,0,0,0)
12 | _Shininess ("光泽度", Range (0.01, 1)) = 0.7
13 | _MainTex ("基础纹理 (RGB)-自发光(A)", 2D) = "white" {}
14 | _BlendTex ("混合纹理(RGBA) ", 2D) = "white" {}
15 | }
16 |
17 | //--------------------------------【子着色器】--------------------------------
18 | SubShader
19 | {
20 | //----------------通道---------------
21 | Pass
22 | {
23 | //【1】设置顶点光照值
24 | Material
25 | {
26 | //可调节的漫反射光和环境光反射颜色
27 | Diffuse [_Color]
28 | Ambient [_Color]
29 | //光泽度
30 | Shininess [_Shininess]
31 | //高光颜色
32 | Specular [_SpecColor]
33 | //自发光颜色
34 | Emission [_Emission]
35 | }
36 |
37 | //【2】开启光照
38 | Lighting On
39 | //【3】--------------开启独立镜面反射--------------
40 | SeparateSpecular On
41 |
42 |
43 | //【4】将自发光颜色混合上纹理
44 | SetTexture [_MainTex]
45 | {
46 | // 使颜色属性进入混合器
47 | constantColor [_IlluminCol]
48 | // 使用纹理的alpha通道插值混合顶点颜色
49 | combine constant lerp(texture) previous
50 | }
51 |
52 | //【5】乘上基本纹理
53 | SetTexture [_MainTex] { combine previous * texture }
54 |
55 | //【6】使用差值操作混合Alpha纹理
56 | SetTexture [_BlendTex] { combine previous*texture }
57 |
58 | //【7】乘以顶点纹理
59 | SetTexture [_MainTex] {Combine previous * primary DOUBLE, previous * primary }
60 |
61 | }
62 | }
63 | }
--------------------------------------------------------------------------------
/Volume 03 子着色器、通道与标签的写法 & 纹理混合/README.md:
--------------------------------------------------------------------------------
1 |
2 | #内容图示
3 |
4 | ##Volume 03 子着色器、通道与标签的写法 & 纹理混合
5 |
6 | ###1. Alpha纹理混合
7 | 
8 |
9 | ###2.纹理的Alpha通道与自发光相混合
10 | 
11 |
12 | ###3. 纹理Alpha与自发光混合可调色版
13 | 
14 |
15 | ###4. 顶点光照+纹理Alpha自发光混合
16 | 
17 |
18 | ###5. 顶点光照+自发光混合+纹理混合
19 | 
--------------------------------------------------------------------------------
/Volume 04 剔除、深度测试、Alpha测试以及基本雾效合辑/1.用剔除操作渲染对象背面.shader:
--------------------------------------------------------------------------------
1 |
2 |
3 | Shader "浅墨Shader编程/Volume4/12.用剔除操作渲染对象背面"
4 | {
5 | //--------------------------------【子着色器】--------------------------------
6 | SubShader
7 | {
8 | Pass
9 | {
10 | //【1】设置顶点光照
11 | Material
12 | {
13 | Emission(0.3,0.3,0.3,0.3)
14 | Diffuse (1,1,1,1)
15 | }
16 | //【2】开启光照
17 | Lighting On
18 |
19 | //【3】剔除正面(不绘制面向观察者的几何面)
20 | Cull Front
21 | }
22 | }
23 | }
--------------------------------------------------------------------------------
/Volume 04 剔除、深度测试、Alpha测试以及基本雾效合辑/2.用剔除操作渲染对象背面v2.shader:
--------------------------------------------------------------------------------
1 |
2 |
3 | Shader "浅墨Shader编程/Volume4/13.渲染对象背面v2"
4 | {
5 | //-------------------------------【属性】---------------------------------------
6 | Properties
7 | {
8 | _Color ("主颜色", Color) = (1,1,1,0)
9 | _SpecColor ("高光颜色", Color) = (1,1,1,1)
10 | _Emission ("光泽颜色", Color) = (0,0,0,0)
11 | _Shininess ("光泽度", Range (0.01, 1)) = 0.7
12 | _MainTex ("基础纹理 (RGB)-透明度(A)", 2D) = "white" {}
13 | }
14 |
15 | //--------------------------------【子着色器】--------------------------------
16 | SubShader
17 | {
18 |
19 | //---------------------------【通道一】------------------------------
20 | // 说明:绘制对象的前面部分,使用简单的白色材质,并应用主纹理
21 | //----------------------------------------------------------------------
22 | Pass
23 | {
24 | //【1】设置顶点光照
25 | Material
26 | {
27 | Diffuse [_Color]
28 | Ambient [_Color]
29 | Shininess [_Shininess]
30 | Specular [_SpecColor]
31 | Emission [_Emission]
32 | }
33 |
34 | //【2】开启光照
35 | Lighting On
36 |
37 | // 【3】将顶点颜色混合上纹理
38 | SetTexture [_MainTex]
39 | {
40 | Combine Primary * Texture
41 | }
42 |
43 | }
44 |
45 | //--------------------------【通道二】-------------------------------
46 | // 说明:采用亮蓝色来渲染背面
47 | //----------------------------------------------------------------------
48 | Pass
49 | {
50 | Color (0,0,1,1)
51 | Cull Front
52 | }
53 | }
54 | }
55 |
--------------------------------------------------------------------------------
/Volume 04 剔除、深度测试、Alpha测试以及基本雾效合辑/3.用剔除实现玻璃效果.shader:
--------------------------------------------------------------------------------
1 |
2 | Shader "浅墨Shader编程/Volume4/14.用剔除实现玻璃效果"
3 | {
4 | //-------------------------------【属性】---------------------------------------
5 | Properties
6 | {
7 | _Color ("主颜色", Color) = (1,1,1,0)
8 | _SpecColor ("高光颜色", Color) = (1,1,1,1)
9 | _Emission ("光泽颜色", Color) = (0,0,0,0)
10 | _Shininess ("光泽度", Range (0.01, 1)) = 0.7
11 | _MainTex ("基础纹理 (RGB)-透明度(A)", 2D) = "white" {}
12 | }
13 |
14 | //--------------------------------【子着色器】--------------------------------
15 | SubShader
16 | {
17 | //【1】定义材质
18 | Material
19 | {
20 | Diffuse [_Color]
21 | Ambient [_Color]
22 | Shininess [_Shininess]
23 | Specular [_SpecColor]
24 | Emission [_Emission]
25 | }
26 | //【2】开启光照
27 | Lighting On
28 | //【3】开启独立镜面反射
29 | SeparateSpecular On
30 |
31 | //【4】开启透明度混合(alpha blending)
32 | Blend SrcAlpha OneMinusSrcAlpha
33 |
34 | //--------------------------【通道一】-------------------------------
35 | // 说明:渲染对象的背面部分
36 | //----------------------------------------------------------------------
37 | Pass
38 | {
39 | // 如果对象是凸型, 那么总是离镜头离得比前面更远
40 | Cull Front //不绘制面向观察者的几何面
41 | SetTexture [_MainTex]
42 | {
43 | Combine Primary * Texture
44 | }
45 | }
46 |
47 | //----------------------------【通道二】-----------------------------
48 | // 说明:渲染对象背对我们的部分
49 | //----------------------------------------------------------------------
50 | Pass
51 | {
52 | // 如果对象是凸型,那么总是离镜头离得比背面更远
53 | Cull Back //不绘制背离观察者的几何面
54 | SetTexture [_MainTex]
55 | {
56 | Combine Primary * Texture
57 | }
58 | }
59 | }
60 | }
--------------------------------------------------------------------------------
/Volume 04 剔除、深度测试、Alpha测试以及基本雾效合辑/4.基本Alpha测试.shader:
--------------------------------------------------------------------------------
1 |
2 | Shader "浅墨Shader编程/Volume4/15.基本Alpha测试"
3 | {
4 | //-------------------------------【属性】-----------------------------------------
5 | Properties
6 | {
7 | _MainTex ("基础纹理 (RGB)-透明度(A)", 2D) = "white" {}
8 | }
9 |
10 | //--------------------------------【子着色器】--------------------------------
11 | SubShader
12 | {
13 | //----------------------------【通道】-------------------------------
14 | // 说明:进行Alpha测试操作,且只渲染透明度大于60%的像素
15 | //----------------------------------------------------------------------
16 | Pass
17 | {
18 | // 只渲染透明度大于60%的像素
19 | AlphaTest Greater 0.6
20 | SetTexture [_MainTex] { combine texture }
21 | }
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/Volume 04 剔除、深度测试、Alpha测试以及基本雾效合辑/5.顶点光照+可调透明度.shader:
--------------------------------------------------------------------------------
1 |
2 | Shader "浅墨Shader编程/Volume4/16.顶点光照+可调透明度"
3 | {
4 | //-------------------------------【属性】-----------------------------------------
5 | Properties
6 | {
7 | _Color ("主颜色", Color) = (1,1,1,0)
8 | _SpecColor ("高光颜色", Color) = (1,1,1,1)
9 | _Emission ("光泽颜色", Color) = (0,0,0,0)
10 | _Shininess ("光泽度", Range (0.01, 1)) = 0.7
11 | _MainTex ("基础纹理 (RGB)-透明度(A)", 2D) = "white" { }
12 | _Cutoff ("Alpha透明度阈值", Range (0,1)) = 0.5
13 | }
14 |
15 | //--------------------------------【子着色器】--------------------------------
16 | SubShader
17 | {
18 | Pass
19 | {
20 | // 【1】使用Cutoff参数定义能被渲染的透明度阈值
21 | AlphaTest Greater [_Cutoff]
22 |
23 | //【2】设置顶点光照参数值
24 | Material
25 | {
26 | Diffuse [_Color]
27 | Ambient [_Color]
28 | Shininess [_Shininess]
29 | Specular [_SpecColor]
30 | Emission [_Emission]
31 | }
32 |
33 | //【3】开启光照
34 | Lighting On
35 |
36 | // 【4】进行纹理混合
37 | SetTexture [_MainTex] { combine texture * primary }
38 | }
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/Volume 04 剔除、深度测试、Alpha测试以及基本雾效合辑/6.简单的植被Shader.shader:
--------------------------------------------------------------------------------
1 |
2 | Shader "浅墨Shader编程/Volume4/17.简单的植被Shader"
3 | {
4 | //-------------------------------【属性】-----------------------------------------
5 | Properties
6 | {
7 | _Color ("主颜色", Color) = (.5, .5, .5, .5)
8 | _MainTex ("基础纹理 (RGB)-透明度(A)", 2D) = "white" {}
9 | _Cutoff ("Alpha透明度阈值", Range (0,.9)) = .5
10 | }
11 |
12 | //--------------------------------【子着色器】--------------------------------
13 | SubShader
14 | {
15 | //【1】定义材质
16 | Material
17 | {
18 | Diffuse [_Color]
19 | Ambient [_Color]
20 | }
21 |
22 | //【2】开启光照
23 | Lighting On
24 |
25 | //【3】关闭裁剪,渲染所有面,用于接下来渲染几何体的两面
26 | Cull Off
27 |
28 | //--------------------------【通道一】-------------------------------
29 | // 说明:渲染所有超过[_Cutoff] 不透明的像素
30 | //----------------------------------------------------------------------
31 | Pass
32 | {
33 | AlphaTest Greater [_Cutoff]
34 | SetTexture [_MainTex] {
35 | combine texture * primary, texture
36 | }
37 | }
38 |
39 | //----------------------------【通道二】-----------------------------
40 | // 说明:渲染半透明的细节
41 | //----------------------------------------------------------------------
42 | Pass
43 | {
44 | // 不写到深度缓冲中
45 | ZWrite off
46 |
47 | // 不写已经写过的像素
48 | ZTest Less
49 |
50 | // 深度测试中,只渲染小于或等于的像素值
51 | AlphaTest LEqual [_Cutoff]
52 |
53 | // 设置透明度混合
54 | Blend SrcAlpha OneMinusSrcAlpha
55 |
56 | // 进行纹理混合
57 | SetTexture [_MainTex]
58 | {
59 | combine texture * primary, texture
60 | }
61 | }
62 | }
63 | }
64 |
--------------------------------------------------------------------------------
/Volume 04 剔除、深度测试、Alpha测试以及基本雾效合辑/README.md:
--------------------------------------------------------------------------------
1 |
2 | #内容图示
3 |
4 | ##Volume 04 剔除、深度测试、Alpha测试以及基本雾效
5 |
6 | ###1.用剔除操作渲染对象背面
7 | 
8 |
9 | 
10 |
11 | 
12 |
13 | ### 2. 用剔除操作渲染对象背面(第二版)
14 | 
15 |
16 | 
17 |
18 | 
19 |
20 | ### 3.用剔除实现玻璃效果
21 | 
22 |
23 | 
24 |
25 | ### 4.基本Alpha测试
26 | 
27 |
28 | ### 5.顶点光照+可调透明度
29 | 
30 |
31 | ### 6.简单的植被Shader
32 | 
--------------------------------------------------------------------------------
/Volume 05 Unity中Shader的三种形态对比&混合操作/1.纹理载入.shader:
--------------------------------------------------------------------------------
1 | Shader "浅墨Shader编程/Volume5/18.基本纹理载入"
2 | {
3 | //-------------------------------【属性】--------------------------------------
4 | Properties
5 | {
6 | _MainTex ("基本纹理", 2D) = "black" { }
7 | }
8 |
9 | //--------------------------------【子着色器】--------------------------------
10 | SubShader
11 | {
12 | //-----------子着色器标签----------
13 | Tags { "Queue" = "Geometry" } //子着色器的标签设为几何体
14 |
15 | //----------------通道---------------
16 | Pass
17 | {
18 | //设置纹理
19 | SetTexture [_MainTex] { combine texture }
20 | }
21 | }
22 | }
--------------------------------------------------------------------------------
/Volume 05 Unity中Shader的三种形态对比&混合操作/2.基本blend使用.shader:
--------------------------------------------------------------------------------
1 | Shader "浅墨Shader编程/Volume5/19.基本blend使用"
2 | {
3 | //-------------------------------【属性】-----------------------------------------
4 | Properties
5 | {
6 | _MainTex ("将要混合的基本纹理", 2D) = "black" { }
7 | }
8 |
9 | //--------------------------------【子着色器】----------------------------------
10 | SubShader
11 | {
12 | //-----------子着色器标签----------
13 | Tags { "Queue" = "Geometry" } //子着色器的标签设为几何体
14 |
15 | //----------------通道---------------
16 | Pass
17 | {
18 | //进行混合
19 | Blend DstColor Zero // 乘法
20 | //设置纹理
21 | SetTexture [_MainTex] { combine texture }
22 | }
23 | }
24 | }
--------------------------------------------------------------------------------
/Volume 05 Unity中Shader的三种形态对比&混合操作/3.基本blend使用+颜色可调.shader:
--------------------------------------------------------------------------------
1 | Shader "浅墨Shader编程/Volume5/20.基本blend使用+颜色可调"
2 | {
3 | //-------------------------------【属性】-----------------------------------------
4 | Properties
5 | {
6 | _MainTex ("将混合的纹理", 2D) = "black" {}
7 | _Color ("主颜色", Color) = (1,1,1,0)
8 | }
9 |
10 | //--------------------------------【子着色器】--------------------------------
11 | SubShader
12 | {
13 | //-----------子着色器标签----------
14 | Tags { "Queue" = "Transparent" } //子着色器的标签设为透明
15 |
16 | //----------------通道---------------
17 | Pass
18 | {
19 | Blend One OneMinusDstColor // 柔性相加
20 | SetTexture [_MainTex]
21 | {
22 | // 使颜色属性进入混合器
23 | constantColor [_Color]
24 | // 使用纹理的alpha通道插值混合顶点颜色
25 | combine constant lerp(texture) previous
26 | }
27 | }
28 | }
29 | }
30 |
31 |
--------------------------------------------------------------------------------
/Volume 05 Unity中Shader的三种形态对比&混合操作/4.基本blend使用+顶点光照.shader:
--------------------------------------------------------------------------------
1 | Shader "浅墨Shader编程/Volume5/21.基本blend使用+顶点光照"
2 | {
3 | //-------------------------------【属性】-----------------------------------------
4 | Properties
5 | {
6 | _MainTex ("Texture to blend", 2D) = "black" {}
7 | _Color ("主颜色", Color) = (1,1,1,0)
8 | }
9 |
10 | //--------------------------------【子着色器】--------------------------------
11 | SubShader
12 | {
13 | //-----------子着色器标签----------
14 | Tags { "Queue" = "Transparent" }
15 |
16 | //----------------通道---------------
17 | Pass
18 | {
19 | //【1】设置材质
20 | Material
21 | {
22 | Diffuse [_Color]
23 | Ambient [_Color]
24 | }
25 |
26 | //【2】开启光照
27 | Lighting On
28 | Blend One OneMinusDstColor // Soft Additive
29 | SetTexture [_MainTex]
30 | {
31 | // 使颜色属性进入混合器
32 | constantColor [_Color]
33 | // 使用纹理的alpha通道插值混合顶点颜色
34 | combine constant lerp(texture) previous
35 | }
36 | }
37 | }
38 | }
39 |
40 |
--------------------------------------------------------------------------------
/Volume 05 Unity中Shader的三种形态对比&混合操作/5.玻璃效果v2版.shader:
--------------------------------------------------------------------------------
1 | Shader "浅墨Shader编程/Volume5/22.玻璃效果v2"
2 | {
3 | //-------------------------------【属性】--------------------------------------
4 | Properties
5 | {
6 | _Color ("Main Color", Color) = (1,1,1,1)
7 | _MainTex ("Base (RGB) Transparency (A)", 2D) = "white" {}
8 | _Reflections ("Base (RGB) Gloss (A)", Cube) = "skybox" { TexGen CubeReflect }
9 | }
10 |
11 | //--------------------------------【子着色器】--------------------------------
12 | SubShader
13 | {
14 | //-----------子着色器标签----------
15 | Tags { "Queue" = "Transparent" }
16 |
17 | //----------------通道---------------
18 | Pass
19 | {
20 | //进行纹理混合
21 | Blend One One
22 |
23 | //设置材质
24 | Material
25 | {
26 | Diffuse [_Color]
27 | }
28 |
29 | //开光照
30 | Lighting On
31 |
32 | //和纹理相乘
33 | SetTexture [_Reflections]
34 | {
35 | combine texture
36 | Matrix [_Reflection]
37 | }
38 | }
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/Volume 05 Unity中Shader的三种形态对比&混合操作/6.玻璃效果v3版.shader:
--------------------------------------------------------------------------------
1 | Shader "浅墨Shader编程/Volume5/23.玻璃效果v3"
2 | {
3 | //-------------------------------【属性】-----------------------------------------
4 | Properties
5 | {
6 | _Color ("Main Color", Color) = (1,1,1,1)
7 | _MainTex ("Base (RGB) Transparency (A)", 2D) = "white" {}
8 | _Reflections ("Base (RGB) Gloss (A)", Cube) = "skybox" { TexGen CubeReflect }
9 | }
10 |
11 | //--------------------------------【子着色器】----------------------------------
12 | SubShader
13 | {
14 | //-----------子着色器标签----------
15 | Tags { "Queue" = "Transparent" }
16 |
17 | //----------------通道1--------------
18 | Pass
19 | {
20 | Blend SrcAlpha OneMinusSrcAlpha
21 |
22 | Material
23 | {
24 | Diffuse [_Color]
25 | }
26 |
27 | Lighting On
28 | SetTexture [_MainTex] {
29 | combine texture * primary double, texture * primary
30 | }
31 | }
32 |
33 | //----------------通道2--------------
34 | Pass
35 | {
36 | //进行纹理混合
37 | Blend One One
38 |
39 | //设置材质
40 | Material
41 | {
42 | Diffuse [_Color]
43 | }
44 |
45 | //开光照
46 | Lighting On
47 |
48 | //和纹理相乘
49 | SetTexture [_Reflections]
50 | {
51 | combine texture
52 | Matrix [_Reflection]
53 | }
54 | }
55 | }
56 | }
57 |
--------------------------------------------------------------------------------
/Volume 05 Unity中Shader的三种形态对比&混合操作/README.md:
--------------------------------------------------------------------------------
1 |
2 | #内容图示
3 |
4 | ##Volume 05 Unity中Shader的三种形态对比&混合操作
5 |
6 | ### 一:固定功能Shader示例
7 | 
8 |
9 | 
10 |
11 |
12 | ### 二:表面着色器Surface Shader示例
13 | 
14 |
15 | 
16 |
17 |
18 | ### 三:可编程Shader示例
19 | 
20 |
21 | 
22 |
23 | ### 1. 纹理载入Shader
24 | 
25 |
26 | 
27 |
28 | ### 2.基本blend使用
29 | 
30 |
31 | 
32 |
33 | ### 3.基本blend使用+颜色可调
34 | 
35 |
36 | 
37 |
38 | ### 4.基本blend使用+顶点光照
39 | 
40 |
41 | 
42 |
43 | ### 5.实现玻璃效果第二版
44 | 
45 |
46 | 
47 |
48 |
49 | ### 6.实现玻璃效果第三版
50 | 
51 |
52 | 
--------------------------------------------------------------------------------
/Volume 05 Unity中Shader的三种形态对比&混合操作/一、固定功能Shader示例.shader:
--------------------------------------------------------------------------------
1 | Shader "浅墨Shader编程/Volume5/固定功能的Shader示例"
2 | {
3 | //-------------------------------【属性】-----------------------------------------
4 | Properties
5 | {
6 | _Color ("主颜色", Color) = (1,1,1,0)
7 | _SpecColor ("高光颜色", Color) = (1,1,1,1)
8 | _Emission ("自发光颜色", Color) = (0,0,0,0)
9 | _Shininess ("光泽度", Range (0.01, 1)) = 0.7
10 | _MainTex ("基本纹理", 2D) = "white" {}
11 | }
12 |
13 | //--------------------------------【子着色器】--------------------------------
14 | SubShader
15 | {
16 | //----------------通道---------------
17 | Pass
18 | {
19 | //-----------材质------------
20 | Material
21 | {
22 | //可调节的漫反射光和环境光反射颜色
23 | Diffuse [_Color]
24 | Ambient [_Color]
25 | //光泽度
26 | Shininess [_Shininess]
27 | //高光颜色
28 | Specular [_SpecColor]
29 | //自发光颜色
30 | Emission [_Emission]
31 | }
32 | //开启光照
33 | Lighting On
34 | //开启独立镜面反射
35 | SeparateSpecular On
36 | //设置纹理并进行纹理混合
37 | SetTexture [_MainTex]
38 | {
39 | Combine texture * primary DOUBLE, texture * primary
40 | }
41 | }
42 | }
43 | }
44 |
--------------------------------------------------------------------------------
/Volume 05 Unity中Shader的三种形态对比&混合操作/三、可编程Shader示例.shader:
--------------------------------------------------------------------------------
1 | Shader "浅墨Shader编程/Volume5/可编程Shader示例"
2 | {
3 | //-------------------------------【属性】--------------------------------------
4 | Properties
5 | {
6 | _Color ("Color", Color) = (1.0,1.0,1.0,1.0)
7 | _SpecColor ("Specular Color", Color) = (1.0,1.0,1.0,1.0)
8 | _Shininess ("Shininess", Float) = 10
9 | }
10 |
11 | //--------------------------------【子着色器】--------------------------------
12 | SubShader
13 | {
14 | //-----------子着色器标签----------
15 | Tags { "LightMode" = "ForwardBase" }
16 |
17 | //----------------通道---------------
18 | Pass
19 | {
20 | //-------------------开始CG着色器编程语言段-----------------
21 | CGPROGRAM
22 | #pragma vertex vert
23 | #pragma fragment frag
24 |
25 | //---------------声明变量--------------
26 | uniform float4 _Color;
27 | uniform float4 _SpecColor;
28 | uniform float _Shininess;
29 |
30 | //--------------定义变量--------------
31 | uniform float4 _LightColor0;
32 |
33 | //--------------顶点输入结构体-------------
34 | struct vertexInput
35 | {
36 | float4 vertex : POSITION;
37 | float3 normal : NORMAL;
38 | };
39 |
40 | //--------------顶点输出结构体-------------
41 | struct vertexOutput
42 | {
43 | float4 pos : SV_POSITION;
44 | float4 col : COLOR;
45 | };
46 |
47 | //--------------顶点函数--------------
48 | vertexOutput vert(vertexInput v)
49 | {
50 | vertexOutput o;
51 |
52 | //一些方向
53 | float3 normalDirection = normalize( mul( float4(v.normal, 0.0), _World2Object ).xyz );
54 | float3 viewDirection = normalize( float3( float4( _WorldSpaceCameraPos.xyz, 1.0) - mul(_Object2World, v.vertex).xyz ) );
55 | float3 lightDirection;
56 | float atten = 1.0;
57 |
58 | //光照
59 | lightDirection = normalize(_WorldSpaceLightPos0.xyz);
60 | float3 diffuseReflection = atten * _LightColor0.xyz * max( 0.0, dot( normalDirection, lightDirection ) );
61 | float3 specularReflection = atten * _LightColor0.xyz * _SpecColor.rgb * max( 0.0, dot( normalDirection, lightDirection ) ) * pow( max( 0.0, dot( reflect( -lightDirection, normalDirection ), viewDirection ) ), _Shininess );
62 | float3 lightFinal = diffuseReflection + specularReflection + UNITY_LIGHTMODEL_AMBIENT;
63 |
64 | //计算结果
65 | o.col = float4(lightFinal * _Color.rgb, 1.0);//颜色
66 | o.pos = mul(UNITY_MATRIX_MVP, v.vertex);//位置
67 | return o;
68 | }
69 |
70 | //--------------片段函数---------------
71 | float4 frag(vertexOutput i) : COLOR
72 | {
73 | return i.col;
74 | }
75 |
76 | //-------------------结束CG着色器编程语言段------------------
77 | ENDCG
78 | }
79 | }
80 | //备胎
81 | Fallback "Diffuse"
82 |
83 | }
--------------------------------------------------------------------------------
/Volume 05 Unity中Shader的三种形态对比&混合操作/二、表面Shader示例.shader:
--------------------------------------------------------------------------------
1 | Shader "浅墨Shader编程/Volume5/表面Shader示例 "
2 | {
3 | //-------------------------------【属性】-----------------------------------------
4 | Properties
5 | {
6 | _MainTex ("【纹理】Texture", 2D) = "white" {}
7 | _BumpMap ("【凹凸纹理】Bumpmap", 2D) = "bump" {}
8 | _RimColor ("【边缘颜色】Rim Color", Color) = (0.17,0.36,0.81,0.0)
9 | _RimPower ("【边缘颜色强度】Rim Power", Range(0.6,9.0)) = 1.0
10 | }
11 |
12 | //----------------------------【开始一个子着色器】---------------------------
13 | SubShader
14 | {
15 | //渲染类型为Opaque,不透明
16 | Tags { "RenderType" = "Opaque" }
17 |
18 | //-------------------开始CG着色器编程语言段-----------------
19 | CGPROGRAM
20 |
21 | //使用兰伯特光照模式
22 | #pragma surface surf Lambert
23 |
24 | //输入结构
25 | struct Input
26 | {
27 | float2 uv_MainTex;//纹理贴图
28 | float2 uv_BumpMap;//法线贴图
29 | float3 viewDir;//观察方向
30 | };
31 |
32 | //变量声明
33 | sampler2D _MainTex;//主纹理
34 | sampler2D _BumpMap;//凹凸纹理
35 | float4 _RimColor;//边缘颜色
36 | float _RimPower;//边缘颜色强度
37 |
38 | //表面着色函数的编写
39 | void surf (Input IN, inout SurfaceOutput o)
40 | {
41 | //表面反射颜色为纹理颜色
42 | o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb;
43 | //表面法线为凹凸纹理的颜色
44 | o.Normal = UnpackNormal (tex2D (_BumpMap, IN.uv_BumpMap));
45 | //边缘颜色
46 | half rim = 1.0 - saturate(dot (normalize(IN.viewDir), o.Normal));
47 | //边缘颜色强度
48 | o.Emission = _RimColor.rgb * pow (rim, _RimPower);
49 | }
50 |
51 | //-------------------结束CG着色器编程语言段------------------
52 | ENDCG
53 | }
54 |
55 | //“备胎”为普通漫反射
56 | Fallback "Diffuse"
57 | }
58 |
--------------------------------------------------------------------------------
/Volume 06 表面着色器(Surface Shader)的写法(一)/1.最基本的SurfaceShader.shader:
--------------------------------------------------------------------------------
1 | Shader "浅墨Shader编程/Volume6/24.最基本的SurfaceShader"
2 | {
3 | //--------------------------------【子着色器】----------------------------------
4 | SubShader
5 | {
6 | //-----------子着色器标签----------
7 | Tags { "RenderType" = "Opaque" }
8 |
9 | //-------------------开始CG着色器编程语言段-----------------
10 | CGPROGRAM
11 |
12 | //【1】光照模式声明:使用兰伯特光照模式
13 | #pragma surface surf Lambert
14 |
15 | //【2】输入结构
16 | struct Input
17 | {
18 | //四元素的颜色值(RGBA)
19 | float4 color : COLOR;
20 | };
21 |
22 | //【3】表面着色函数的编写
23 | void surf (Input IN, inout SurfaceOutput o)
24 | {
25 | //反射率
26 | o.Albedo = float3(0.5,0.8,0.3);//(0.5,0.8,0.3)分别对应于RGB分量
27 | //而o.Albedo = 0.6;等效于写o.Albedo = float3(0.6,0.6,0.6);
28 | }
29 |
30 | //-------------------结束CG着色器编程语言段------------------
31 | ENDCG
32 | }
33 |
34 | //“备胎”为普通漫反射
35 | Fallback "Diffuse"
36 | }
--------------------------------------------------------------------------------
/Volume 06 表面着色器(Surface Shader)的写法(一)/2.颜色可调.shader:
--------------------------------------------------------------------------------
1 | Shader "浅墨Shader编程/Volume6/25.颜色可调的SurfaceShader"
2 | {
3 | //--------------------------------【属性】---------------------------------------
4 | Properties
5 | {
6 | _Color ("【主颜色】Main Color", Color) = (0.1,0.3,0.9,1)
7 | }
8 |
9 | //--------------------------------【子着色器】----------------------------------
10 | SubShader
11 | {
12 | //-----------子着色器标签----------
13 | Tags { "RenderType"="Opaque" }
14 |
15 | //-------------------开始CG着色器编程语言段-----------------
16 | CGPROGRAM
17 | A
18 | //【1】光照模式声明:使用兰伯特光照模式
19 | #pragma surface surf Lambert
20 |
21 | //变量声明
22 | float4 _Color;
23 |
24 | //【2】输入结构
25 | struct Input
26 | {
27 | //四元素的颜色值(RGBA)
28 | float4 color : COLOR;
29 | };
30 |
31 | //【3】表面着色函数的编写
32 | void surf (Input IN, inout SurfaceOutput o)
33 | {
34 | //反射率
35 | o.Albedo = _Color.rgb;
36 | //透明值
37 | o.Alpha = _Color.a;
38 | }
39 |
40 | //-------------------结束CG着色器编程语言段------------------
41 | ENDCG
42 | }
43 |
44 | //“备胎”为普通漫反射
45 | FallBack "Diffuse"
46 | }
47 |
--------------------------------------------------------------------------------
/Volume 06 表面着色器(Surface Shader)的写法(一)/3.基本纹理载入.shader:
--------------------------------------------------------------------------------
1 | Shader "浅墨Shader编程/Volume6/26.基本纹理载入"
2 | {
3 | //--------------------------------【属性】----------------------------------------
4 | Properties
5 | {
6 | _MainTex ("【主纹理】Texture", 2D) = "white" {}
7 | }
8 |
9 | //--------------------------------【子着色器】----------------------------------
10 | SubShader
11 | {
12 | //-----------子着色器标签----------
13 | Tags { "RenderType" = "Opaque" }
14 |
15 | //-------------------开始CG着色器编程语言段-----------------
16 | CGPROGRAM
17 |
18 | //【1】光照模式声明:使用兰伯特光照模式
19 | #pragma surface surf Lambert
20 |
21 | //【2】输入结构
22 | struct Input
23 | {
24 | //纹理的uv值
25 | float2 uv_MainTex;
26 | };
27 |
28 | //变量声明
29 | sampler2D _MainTex;
30 |
31 | //【3】表面着色函数的编写
32 | void surf (Input IN, inout SurfaceOutput o)
33 | {
34 | //从纹理获取rgb颜色值
35 | o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb;
36 | }
37 |
38 | //-------------------结束CG着色器编程语言段------------------
39 | ENDCG
40 | }
41 |
42 | //“备胎”为普通漫反射
43 | Fallback "Diffuse"
44 | }
--------------------------------------------------------------------------------
/Volume 06 表面着色器(Surface Shader)的写法(一)/4.凹凸纹理.shader:
--------------------------------------------------------------------------------
1 | Shader "浅墨Shader编程/Volume6/27.凹凸纹理载入"
2 | {
3 | //--------------------------------【属性】----------------------------------------
4 | Properties
5 | {
6 | _MainTex ("【主纹理】Texture", 2D) = "white" {}
7 | _BumpMap ("【凹凸纹理】Bumpmap", 2D) = "bump" {}
8 | }
9 |
10 | //--------------------------------【子着色器】----------------------------------
11 | SubShader
12 | {
13 | //-----------子着色器标签----------
14 | Tags { "RenderType" = "Opaque" }
15 |
16 | //-------------------开始CG着色器编程语言段-----------------
17 | CGPROGRAM
18 |
19 | //【1】光照模式声明:使用兰伯特光照模式
20 | #pragma surface surf Lambert
21 |
22 | //【2】输入结构
23 | struct Input
24 | {
25 | //主纹理的uv值
26 | float2 uv_MainTex;
27 | //凹凸纹理的uv值
28 | float2 uv_BumpMap;
29 | };
30 |
31 | //变量声明
32 | sampler2D _MainTex;//主纹理
33 | sampler2D _BumpMap;//凹凸纹理
34 |
35 | //【3】表面着色函数的编写
36 | void surf (Input IN, inout SurfaceOutput o)
37 | {
38 | //从主纹理获取rgb颜色值
39 | o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb;
40 | //从凹凸纹理获取法线值
41 | o.Normal = UnpackNormal (tex2D (_BumpMap, IN.uv_BumpMap));
42 | }
43 |
44 | //-------------------结束CG着色器编程语言段------------------
45 | ENDCG
46 | }
47 |
48 | //“备胎”为普通漫反射
49 | Fallback "Diffuse"
50 | }
--------------------------------------------------------------------------------
/Volume 06 表面着色器(Surface Shader)的写法(一)/5.纹理+颜色修改.shader:
--------------------------------------------------------------------------------
1 | Shader "浅墨Shader编程/Volume6/28.纹理+颜色修改"
2 | {
3 | //--------------------------------【属性】----------------------------------------
4 | Properties
5 | {
6 | _MainTex ("【主纹理】Texture", 2D) = "white" {}
7 | _ColorTint ("【色泽】Tint", Color) = (0.6, 0.3, 0.6, 0.3)
8 | }
9 |
10 | //--------------------------------【子着色器】----------------------------------
11 | SubShader
12 | {
13 | //-----------子着色器标签----------
14 | Tags { "RenderType" = "Opaque" }
15 |
16 | //-------------------开始CG着色器编程语言段-----------------
17 | CGPROGRAM
18 |
19 | //【1】光照模式声明:使用兰伯特光照模式+自定义颜色函数
20 | #pragma surface surf Lambert finalcolor:setcolor
21 |
22 | //【2】输入结构
23 | struct Input
24 | {
25 | //纹理的uv值
26 | float2 uv_MainTex;
27 | };
28 |
29 | //变量声明
30 | fixed4 _ColorTint;
31 | sampler2D _MainTex;
32 |
33 | //【3】自定义颜色函数setcolor的编写
34 | void setcolor (Input IN, SurfaceOutput o, inout fixed4 color)
35 | {
36 | //将自选的颜色值乘给color
37 | color *= _ColorTint;
38 | }
39 |
40 | //【4】表面着色函数的编写
41 | void surf (Input IN, inout SurfaceOutput o)
42 | {
43 | //从主纹理获取rgb颜色值
44 | o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb;
45 | }
46 |
47 | //-------------------结束CG着色器编程语言段------------------
48 | ENDCG
49 | }
50 |
51 | //“备胎”为普通漫反射
52 | Fallback "Diffuse"
53 | }
--------------------------------------------------------------------------------
/Volume 06 表面着色器(Surface Shader)的写法(一)/6.凹凸纹理+边缘光照.shader:
--------------------------------------------------------------------------------
1 | Shader "浅墨Shader编程/Volume6/29.凹凸纹理+边缘光照"
2 | {
3 | //--------------------------------【属性】----------------------------------------
4 | Properties
5 | {
6 | _MainTex ("【主纹理】Texture", 2D) = "white" {}
7 | _BumpMap ("【凹凸纹理】Bumpmap", 2D) = "bump" {}
8 | _RimColor ("【边缘颜色】Rim Color", Color) = (0.26,0.19,0.16,0.0)
9 | _RimPower ("【边缘颜色强度】Rim Power", Range(0.5,8.0)) = 3.0
10 | }
11 |
12 | //--------------------------------【子着色器】----------------------------------
13 | SubShader
14 | {
15 | //-----------子着色器标签----------
16 | Tags { "RenderType" = "Opaque" }
17 |
18 | //-------------------开始CG着色器编程语言段-----------------
19 | CGPROGRAM
20 |
21 | //【1】光照模式声明:使用兰伯特光照模式+自定义颜色函数
22 | #pragma surface surf Lambert
23 |
24 | //【2】输入结构
25 | struct Input
26 | {
27 | //主纹理的uv值
28 | float2 uv_MainTex;
29 | //凹凸纹理的uv值
30 | float2 uv_BumpMap;
31 | //当前坐标的视角方向
32 | float3 viewDir;
33 | };
34 |
35 | //变量声明
36 | sampler2D _MainTex;//主纹理
37 | sampler2D _BumpMap;//凹凸纹理
38 | float4 _RimColor;//边缘颜色
39 | float _RimPower;//边缘颜色强度
40 |
41 | //【3】表面着色函数的编写
42 | void surf (Input IN, inout SurfaceOutput o)
43 | {
44 | //从主纹理获取rgb颜色值
45 | o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb;
46 | //从凹凸纹理获取法线值
47 | o.Normal = UnpackNormal (tex2D (_BumpMap, IN.uv_BumpMap));
48 | //从_RimColor参数获取自发光颜色
49 | half rim = 1.0 - saturate(dot (normalize(IN.viewDir), o.Normal));
50 | o.Emission = _RimColor.rgb * pow (rim, _RimPower);
51 | }
52 |
53 | //-------------------结束CG着色器编程语言段------------------
54 | ENDCG
55 | }
56 |
57 | //“备胎”为普通漫反射
58 | Fallback "Diffuse"
59 | }
--------------------------------------------------------------------------------
/Volume 06 表面着色器(Surface Shader)的写法(一)/7.凹凸纹理+颜色可调+边缘光照.shader:
--------------------------------------------------------------------------------
1 | Shader "浅墨Shader编程/Volume6/30.凹凸纹理+颜色可调+边缘光照"
2 | {
3 | //--------------------------------【属性】----------------------------------------
4 | Properties
5 | {
6 | _MainTex ("【主纹理】Texture", 2D) = "white" {}
7 | _BumpMap ("【凹凸纹理】Bumpmap", 2D) = "bump" {}
8 | _ColorTint ("【色泽】Tint", Color) = (0.6, 0.3, 0.6, 0.3)
9 | _RimColor ("【边缘颜色】Rim Color", Color) = (0.26,0.19,0.16,0.0)
10 | _RimPower ("【边缘颜色强度】Rim Power", Range(0.5,8.0)) = 3.0
11 | }
12 |
13 | //--------------------------------【子着色器】----------------------------------
14 | SubShader
15 | {
16 | //-----------子着色器标签----------
17 | Tags { "RenderType" = "Opaque" }
18 |
19 | //-------------------开始CG着色器编程语言段-----------------
20 | CGPROGRAM
21 |
22 | //【1】光照模式声明:使用兰伯特光照模式+自定义颜色函数
23 | #pragma surface surf Lambert finalcolor:setcolor
24 |
25 | //【2】输入结构
26 | struct Input
27 | {
28 | //主纹理的uv值
29 | float2 uv_MainTex;
30 | //凹凸纹理的uv值
31 | float2 uv_BumpMap;
32 | //当前坐标的视角方向
33 | float3 viewDir;
34 | };
35 |
36 | //变量声明
37 | sampler2D _MainTex;
38 | sampler2D _BumpMap;
39 | fixed4 _ColorTint;
40 | float4 _RimColor;
41 | float _RimPower;
42 |
43 | //【3】自定义颜色函数setcolor的编写
44 | void setcolor (Input IN, SurfaceOutput o, inout fixed4 color)
45 | {
46 | color *= _ColorTint;
47 | }
48 |
49 | //【4】表面着色函数的编写
50 | void surf (Input IN, inout SurfaceOutput o)
51 | {
52 | //从主纹理获取rgb颜色值
53 | o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb;
54 | //从凹凸纹理获取法线值
55 | o.Normal = UnpackNormal (tex2D (_BumpMap, IN.uv_BumpMap));
56 | //从_RimColor参数获取自发光颜色
57 | half rim = 1.0 - saturate(dot (normalize(IN.viewDir), o.Normal));
58 | o.Emission = _RimColor.rgb * pow (rim, _RimPower);
59 | }
60 |
61 | //-------------------结束CG着色器编程语言段------------------
62 | ENDCG
63 | }
64 |
65 | //“备胎”为普通漫反射
66 | Fallback "Diffuse"
67 | }
--------------------------------------------------------------------------------
/Volume 06 表面着色器(Surface Shader)的写法(一)/8.细节纹理.shader:
--------------------------------------------------------------------------------
1 | Shader "浅墨Shader编程/Volume6/31.细节纹理"
2 | {
3 | //--------------------------------【属性】----------------------------------------
4 | Properties
5 | {
6 | _MainTex ("【主纹理】Texture", 2D) = "white" {}
7 | _Detail ("【细节纹理】Detail", 2D) = "gray" {}
8 | }
9 |
10 | //--------------------------------【子着色器】----------------------------------
11 | SubShader
12 | {
13 | //-----------子着色器标签----------
14 | Tags { "RenderType" = "Opaque" }
15 |
16 | //-------------------开始CG着色器编程语言段-----------------
17 | CGPROGRAM
18 |
19 | //【1】光照模式声明:使用兰伯特光照模式
20 | #pragma surface surf Lambert
21 |
22 | //【2】输入结构
23 | struct Input
24 | {
25 | //主纹理的uv值
26 | float2 uv_MainTex;
27 | //细节纹理的uv值
28 | float2 uv_Detail;
29 | };
30 |
31 | //变量声明
32 | sampler2D _MainTex;
33 | sampler2D _Detail;
34 |
35 | //【3】表面着色函数的编写
36 | void surf (Input IN, inout SurfaceOutput o)
37 | {
38 | //先从主纹理获取rgb颜色值
39 | o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb;
40 | //设置细节纹理
41 | o.Albedo *= tex2D (_Detail, IN.uv_Detail).rgb * 2;
42 | }
43 |
44 | //-------------------结束CG着色器编程语言段------------------
45 | ENDCG
46 | }
47 |
48 | //“备胎”为普通漫反射
49 | Fallback "Diffuse"
50 | }
--------------------------------------------------------------------------------
/Volume 06 表面着色器(Surface Shader)的写法(一)/9.凹凸纹理+颜色可调+边缘光照+细节纹理.shader:
--------------------------------------------------------------------------------
1 | Shader "浅墨Shader编程/Volume6/32.凹凸纹理+颜色可调+边缘光照+细节纹理"
2 | {
3 | Properties
4 | {
5 | _MainTex ("【主纹理】Texture", 2D) = "white" {}
6 | _BumpMap ("【凹凸纹理】Bumpmap", 2D) = "bump" {}
7 | _Detail ("【细节纹理】Detail", 2D) = "gray" {}
8 | _ColorTint ("【色泽】Tint", Color) = (0.6, 0.3, 0.6, 0.3)
9 | _RimColor ("【边缘颜色】Rim Color", Color) = (0.26,0.19,0.16,0.0)
10 | _RimPower ("【边缘颜色强度】Rim Power", Range(0.5,8.0)) = 3.0
11 | }
12 |
13 | //--------------------------------【子着色器】----------------------------------
14 | SubShader
15 | {
16 | //-----------子着色器标签----------
17 | Tags { "RenderType" = "Opaque" }
18 |
19 | //-------------------开始CG着色器编程语言段-----------------
20 | CGPROGRAM
21 |
22 | //【1】光照模式声明:使用兰伯特光照模式+自定义颜色函数
23 | #pragma surface surf Lambert finalcolor:setcolor
24 |
25 | //【2】输入结构
26 | struct Input
27 | {
28 | //主纹理的uv值
29 | float2 uv_MainTex;
30 | //凹凸纹理的uv值
31 | float2 uv_BumpMap;
32 | //细节纹理的uv值
33 | float2 uv_Detail;
34 | //当前坐标的视角方向
35 | float3 viewDir;
36 | };
37 |
38 | //变量声明
39 | sampler2D _MainTex;
40 | sampler2D _BumpMap;
41 | sampler2D _Detail;
42 | fixed4 _ColorTint;
43 | float4 _RimColor;
44 | float _RimPower;
45 |
46 | //【3】自定义颜色函数setcolor的编写
47 | void setcolor (Input IN, SurfaceOutput o, inout fixed4 color)
48 | {
49 | color *= _ColorTint;
50 | }
51 |
52 | //【4】表面着色函数的编写
53 | void surf (Input IN, inout SurfaceOutput o)
54 | {
55 | //先从主纹理获取rgb颜色值
56 | o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb;
57 | //设置细节纹理
58 | o.Albedo *= tex2D (_Detail, IN.uv_Detail).rgb * 2;
59 | //从凹凸纹理获取法线值
60 | o.Normal = UnpackNormal (tex2D (_BumpMap, IN.uv_BumpMap));
61 | //从_RimColor参数获取自发光颜色
62 | half rim = 1.0 - saturate(dot (normalize(IN.viewDir), o.Normal));
63 | o.Emission = _RimColor.rgb * pow (rim, _RimPower);
64 | }
65 |
66 | //-------------------结束CG着色器编程语言段------------------
67 | ENDCG
68 | }
69 |
70 | //“备胎”为普通漫反射
71 | Fallback "Diffuse"
72 | }
--------------------------------------------------------------------------------
/Volume 06 表面着色器(Surface Shader)的写法(一)/README.md:
--------------------------------------------------------------------------------
1 |
2 | #内容图示
3 |
4 | ##Volume 06 表面着色器(Surface Shader)的写法(一)
5 |
6 | ### 1.最基本的Surface Shader
7 | 
8 |
9 | 
10 |
11 |
12 | ### 2.颜色可调
13 | 
14 |
15 | 
16 |
17 |
18 | ### 3.基本纹理载入
19 | 
20 |
21 | 
22 |
23 | ### 4.凹凸纹理载入
24 | 
25 |
26 | 
27 |
28 | ### 5.纹理载入+颜色可调
29 | 
30 |
31 | 
32 |
33 | ### 6. 凹凸纹理+边缘光照
34 | 
35 |
36 | 
37 |
38 | ### 7.凹凸纹理+颜色可调
39 | 
40 |
41 | 
42 |
43 | ### 8.细节纹理
44 | 
45 |
46 | 
47 |
48 |
49 | ### 9.凹凸纹理+颜色可调+边缘光照+细节纹理
50 | 
51 |
52 | 
--------------------------------------------------------------------------------
/Volume 07 表面着色器的写法(二)-自定义光照模式/0.漫反射.shader:
--------------------------------------------------------------------------------
1 | Shader "浅墨Shader编程/Volume7/33.内置的漫反射"
2 | {
3 | //--------------------------------【属性】----------------------------------
4 | Properties
5 | {
6 | _MainTex ("【主纹理】Texture", 2D) = "white" {}
7 | }
8 | //--------------------------------【子着色器】----------------------------------
9 | SubShader
10 | {
11 | //-----------子着色器标签----------
12 | Tags { "RenderType" = "Opaque" }
13 |
14 | //-------------------开始CG着色器编程语言段-----------------
15 | CGPROGRAM
16 |
17 | //【1】光照模式声明:使用兰伯特光照模式
18 | #pragma surface surf Lambert
19 |
20 | //【2】输入结构
21 | struct Input
22 | {
23 | float2 uv_MainTex;
24 | };
25 |
26 | //变量声明
27 | sampler2D _MainTex;
28 |
29 | //【3】表面着色函数的编写
30 | void surf (Input IN, inout SurfaceOutput o)
31 | {
32 | //从主纹理获取rgb颜色值
33 | o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb;
34 | }
35 |
36 | //-------------------结束CG着色器编程语言段------------------
37 | ENDCG
38 | }
39 |
40 | Fallback "Diffuse"
41 | }
--------------------------------------------------------------------------------
/Volume 07 表面着色器的写法(二)-自定义光照模式/1.自定义高光效果.shader:
--------------------------------------------------------------------------------
1 | Shader "浅墨Shader编程/Volume7/34.自定义高光"
2 | {
3 |
4 | //--------------------------------【属性】----------------------------------
5 | Properties
6 | {
7 | _MainTex ("【主纹理】Texture", 2D) = "white" {}
8 | }
9 |
10 | //--------------------------------【子着色器】----------------------------------
11 | SubShader
12 | {
13 | //-----------子着色器标签----------
14 | Tags { "RenderType" = "Opaque" }
15 |
16 | //-------------------开始CG着色器编程语言段-----------------
17 | CGPROGRAM
18 |
19 | //【1】光照模式声明:使用自定义的光照模式
20 | #pragma surface surf SimpleSpecular
21 |
22 | //【2】实现自定义的光照模式SimpleSpecular
23 | half4 LightingSimpleSpecular (SurfaceOutput s, half3 lightDir, half3 viewDir, half atten)
24 | {
25 | half3 h = normalize (lightDir + viewDir);
26 |
27 | half diff = max (0, dot (s.Normal, lightDir));
28 |
29 | float nh = max (0, dot (s.Normal, h));
30 | float spec = pow (nh, 48.0);
31 |
32 | half4 c;
33 | c.rgb = (s.Albedo * _LightColor0.rgb * diff + _LightColor0.rgb * spec) * (atten * 2);
34 | c.a = s.Alpha;
35 | return c;
36 | }
37 |
38 | //【3】输入结构
39 | struct Input
40 | {
41 | float2 uv_MainTex;
42 | };
43 |
44 | //变量声明
45 | sampler2D _MainTex;
46 |
47 | //【4】表面着色函数的编写
48 | void surf (Input IN, inout SurfaceOutput o)
49 | {
50 | //从主纹理获取rgb颜色值
51 | o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb;
52 | }
53 |
54 | //-------------------结束CG着色器编程语言段------------------
55 | ENDCG
56 | }
57 |
58 | //“备胎”为普通漫反射
59 | Fallback "Diffuse"
60 | }
--------------------------------------------------------------------------------
/Volume 07 表面着色器的写法(二)-自定义光照模式/2.自制简单的Lambert光照.shader:
--------------------------------------------------------------------------------
1 | Shader "浅墨Shader编程/Volume7/35.自制简单的Lambert光照"
2 | {
3 | //--------------------------------【属性】----------------------------------------
4 | Properties
5 | {
6 | _MainTex ("【主纹理】Texture", 2D) = "white" {}
7 | }
8 |
9 | //--------------------------------【子着色器】----------------------------------
10 | SubShader
11 | {
12 | //-----------子着色器标签----------
13 | Tags { "RenderType" = "Opaque" }
14 | //-------------------开始CG着色器编程语言段-----------------
15 | CGPROGRAM
16 |
17 | //【1】光照模式声明:使用自制的兰伯特光照模式
18 | #pragma surface surf QianMoLambert
19 |
20 | //【2】实现自定义的兰伯特光照模式
21 | half4 LightingQianMoLambert (SurfaceOutput s, half3 lightDir, half atten)
22 | {
23 | half NdotL =max(0, dot (s.Normal, lightDir));
24 | half4 color;
25 | color.rgb = s.Albedo * _LightColor0.rgb * (NdotL * atten * 2);
26 | color.a = s.Alpha;
27 | return color;
28 | }
29 |
30 | //【3】输入结构
31 | struct Input
32 | {
33 | float2 uv_MainTex;
34 | };
35 |
36 | //变量声明
37 | sampler2D _MainTex;
38 |
39 | //【4】表面着色函数的编写
40 | void surf (Input IN, inout SurfaceOutput o)
41 | {
42 | //从主纹理获取rgb颜色值
43 | o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb;
44 | }
45 |
46 | //-------------------结束CG着色器编程语言段------------------
47 | ENDCG
48 | }
49 | Fallback "Diffuse"
50 | }
--------------------------------------------------------------------------------
/Volume 07 表面着色器的写法(二)-自定义光照模式/3.自制半Lambert光照.shader:
--------------------------------------------------------------------------------
1 | Shader "浅墨Shader编程/Volume7/36.自制简单的半Lambert光照"
2 | {
3 | //--------------------------------【属性】----------------------------------------
4 | Properties
5 | {
6 | _MainTex ("【主纹理】Texture", 2D) = "white" {}
7 | }
8 |
9 | //--------------------------------【子着色器】----------------------------------
10 | SubShader
11 | {
12 | //-----------子着色器标签----------
13 | Tags { "RenderType" = "Opaque" }
14 | //-------------------开始CG着色器编程语言段-----------------
15 | CGPROGRAM
16 |
17 | //【1】光照模式声明:使用自制的半兰伯特光照模式
18 | #pragma surface surf QianMoHalfLambert
19 |
20 | //【2】实现自定义的半兰伯特光照模式
21 | half4 LightingQianMoHalfLambert (SurfaceOutput s, half3 lightDir, half atten)
22 | {
23 | half NdotL =max(0, dot (s.Normal, lightDir));
24 |
25 | //在兰伯特光照的基础上加上这句,增加光强
26 | float hLambert = NdotL * 0.5 + 0.5;
27 | half4 color;
28 |
29 | //修改这句中的相关参数
30 | color.rgb = s.Albedo * _LightColor0.rgb * (hLambert * atten * 2);
31 | color.a = s.Alpha;
32 | return color;
33 | }
34 |
35 | //【3】输入结构
36 | struct Input
37 | {
38 | float2 uv_MainTex;
39 | };
40 |
41 | //变量声明
42 | sampler2D _MainTex;
43 |
44 | //【4】表面着色函数的编写
45 | void surf (Input IN, inout SurfaceOutput o)
46 | {
47 | //从主纹理获取rgb颜色值
48 | o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb;
49 | }
50 |
51 | //-------------------结束CG着色器编程语言段------------------
52 | ENDCG
53 | }
54 |
55 | Fallback "Diffuse"
56 | }
--------------------------------------------------------------------------------
/Volume 07 表面着色器的写法(二)-自定义光照模式/4.自定义卡通渐变光照.shader:
--------------------------------------------------------------------------------
1 | Shader "浅墨Shader编程/Volume7/37.自定义卡通渐变光照"
2 | {
3 | //--------------------------------【属性】----------------------------------------
4 | Properties
5 | {
6 | _MainTex ("【主纹理】Texture", 2D) = "white" {}
7 | _Ramp ("【渐变纹理】Shading Ramp", 2D) = "gray" {}
8 | }
9 |
10 | //--------------------------------【子着色器】----------------------------------
11 | SubShader
12 | {
13 | //-----------子着色器标签----------
14 | Tags { "RenderType" = "Opaque" }
15 | //-------------------开始CG着色器编程语言段-----------------
16 | CGPROGRAM
17 |
18 | //【1】光照模式声明:使用自制的卡通渐变光照模式
19 | #pragma surface surf Ramp
20 |
21 | //变量声明
22 | sampler2D _Ramp;
23 |
24 | //【2】实现自制的卡通渐变光照模式
25 | half4 LightingRamp (SurfaceOutput s, half3 lightDir, half atten)
26 | {
27 | //点乘反射光线法线和光线方向
28 | half NdotL = dot (s.Normal, lightDir);
29 | //增强光强
30 | half diff = NdotL * 0.5 + 0.5;
31 | //从纹理中定义渐变效果
32 | half3 ramp = tex2D (_Ramp, float2(diff,diff)).rgb;
33 | //计算出最终结果
34 | half4 color;
35 | color.rgb = s.Albedo * _LightColor0.rgb * ramp * (atten * 2);
36 | color.a = s.Alpha;
37 |
38 | return color;
39 | }
40 |
41 | //【3】输入结构
42 | struct Input
43 | {
44 | float2 uv_MainTex;
45 | };
46 |
47 | //变量声明
48 | sampler2D _MainTex;
49 |
50 | //【4】表面着色函数的编写
51 | void surf (Input IN, inout SurfaceOutput o)
52 | {
53 | //从主纹理获取rgb颜色值
54 | o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb;
55 | }
56 |
57 | //-------------------结束CG着色器编程语言段------------------
58 | ENDCG
59 |
60 | }
61 | Fallback "Diffuse"
62 | }
--------------------------------------------------------------------------------
/Volume 07 表面着色器的写法(二)-自定义光照模式/5.自定义卡通渐变光照v2.shader:
--------------------------------------------------------------------------------
1 | Shader "浅墨Shader编程/Volume7/38.自定义卡通渐变光照v2"
2 | {
3 | //--------------------------------【属性】----------------------------------------
4 | Properties
5 | {
6 | _MainTex ("【主纹理】Texture", 2D) = "white" {}
7 | _Ramp ("【渐变纹理】Ramp Texture", 2D) = "white"{}
8 | _BumpMap ("【凹凸纹理】Bumpmap", 2D) = "bump" {}
9 | _Detail ("【细节纹理】Detail", 2D) = "gray" {}
10 | _RimColor ("【边缘颜色】Rim Color", Color) = (0.26,0.19,0.16,0.0)
11 | _RimPower ("【边缘颜色强度】Rim Power", Range(0.5,8.0)) = 3.0
12 | }
13 |
14 | //--------------------------------【子着色器】----------------------------------
15 | SubShader
16 | {
17 | //-----------子着色器标签----------
18 | Tags { "RenderType"="Opaque" }
19 | LOD 200
20 |
21 | //-------------------开始CG着色器编程语言段-----------------
22 | CGPROGRAM
23 |
24 | //【1】光照模式声明:使用自制的卡通渐变光照模式
25 | #pragma surface surf QianMoCartoonShader
26 |
27 |
28 | //变量声明
29 | sampler2D _MainTex;
30 | sampler2D _Ramp;
31 | sampler2D _BumpMap;
32 | sampler2D _Detail;
33 | float4 _RimColor;
34 | float _RimPower;
35 |
36 | //【2】实现自制的卡通渐变光照模式
37 | inline float4 LightingQianMoCartoonShader(SurfaceOutput s, fixed3 lightDir, fixed atten)
38 | {
39 | //点乘反射光线法线和光线方向
40 | half NdotL = dot (s.Normal, lightDir);
41 | //增强光强
42 | half diff = NdotL * 0.5 + 0.5;
43 | //从纹理中定义渐变效果
44 | half3 ramp = tex2D (_Ramp, float2(diff,diff)).rgb;
45 | //计算出最终结果
46 | half4 color;
47 | color.rgb = s.Albedo * _LightColor0.rgb * ramp * (atten * 2);
48 | color.a = s.Alpha;
49 |
50 | return color;
51 | }
52 |
53 | //【3】输入结构
54 | struct Input
55 | {
56 | //主纹理的uv值
57 | float2 uv_MainTex;
58 | //凹凸纹理的uv值
59 | float2 uv_BumpMap;
60 | //细节纹理的uv值
61 | float2 uv_Detail;
62 | //当前坐标的视角方向
63 | float3 viewDir;
64 | };
65 |
66 |
67 | //【4】表面着色函数的编写
68 | void surf (Input IN, inout SurfaceOutput o)
69 | {
70 | //先从主纹理获取rgb颜色值
71 | o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb;
72 | //设置细节纹理
73 | o.Albedo *= tex2D (_Detail, IN.uv_Detail).rgb * 2;
74 | //从凹凸纹理获取法线值
75 | o.Normal = UnpackNormal (tex2D (_BumpMap, IN.uv_BumpMap));
76 | //从_RimColor参数获取自发光颜色
77 | half rim = 1.0 - saturate(dot (normalize(IN.viewDir), o.Normal));
78 | o.Emission = _RimColor.rgb * pow (rim, _RimPower);
79 |
80 | }
81 |
82 | //-------------------结束CG着色器编程语言段------------------
83 | ENDCG
84 | }
85 | FallBack "Diffuse"
86 | }
--------------------------------------------------------------------------------
/Volume 07 表面着色器的写法(二)-自定义光照模式/README.md:
--------------------------------------------------------------------------------
1 |
2 | #内容图示
3 |
4 | ##Volume 07 表面着色器的写法(二):自定义光照模式
5 |
6 | ### 0.内置的漫反射光照
7 | 
8 |
9 |
10 | ### 1.简单的高光光照模型
11 | 
12 |
13 |
14 | ### 2.自制简单的Lambert光照
15 | 
16 |
17 | ### 3.自定义的半Lambert光照
18 | 
19 |
20 | ### 4.自定义卡通渐变光照
21 | 第一组:
22 |
23 | 
24 |
25 | 
26 |
27 | 第二组:
28 |
29 | 
30 |
31 | 
32 |
33 | 第三组:
34 |
35 | 
36 |
37 | 
38 |
39 |
40 |
41 | ### 5.自定义卡通渐变光照v2
42 | 
43 |
44 | 
45 |
46 | 
47 |
48 |
--------------------------------------------------------------------------------
/Volume 08 径向模糊屏幕特效Shader&自定义Shader template/MotionBlurEffects/MotionBlurEffects.cs:
--------------------------------------------------------------------------------
1 | using UnityEngine;
2 | using System.Collections;
3 |
4 | [ExecuteInEditMode]
5 |
6 | public class MotionBlurEffects : MonoBehaviour
7 | {
8 |
9 | //-------------------变量声明部分-------------------
10 | #region Variables
11 | public Shader CurShader;//着色器实例
12 | private Vector4 ScreenResolution;//屏幕分辨率
13 | private Material CurMaterial;//当前的材质
14 |
15 | [Range(5, 50)]
16 | public float IterationNumber = 15;
17 | [Range(-0.5f, 0.5f)]
18 | public float Intensity = 0.125f;
19 | [Range(-2f, 2f)]
20 | public float OffsetX = 0.5f;
21 | [Range(-2f, 2f)]
22 | public float OffsetY = 0.5f;
23 |
24 |
25 | public static float ChangeValue;
26 | public static float ChangeValue2;
27 | public static float ChangeValue3;
28 | public static float ChangeValue4;
29 | #endregion
30 |
31 |
32 | //-------------------------材质的get&set----------------------------
33 | #region MaterialGetAndSet
34 | Material material
35 | {
36 | get
37 | {
38 | if (CurMaterial == null)
39 | {
40 | CurMaterial = new Material(CurShader);
41 | CurMaterial.hideFlags = HideFlags.HideAndDontSave;
42 | }
43 | return CurMaterial;
44 | }
45 | }
46 | #endregion
47 |
48 | //-----------------------------------------【Start()函数】---------------------------------------------
49 | // 说明:此函数仅在Update函数第一次被调用前被调用
50 | //--------------------------------------------------------------------------------------------------------
51 | void Start()
52 | {
53 | //依此赋值
54 | ChangeValue = Intensity;
55 | ChangeValue2 = OffsetX;
56 | ChangeValue3 = OffsetY;
57 | ChangeValue4 = IterationNumber;
58 |
59 | //找到当前的Shader文件
60 | CurShader = Shader.Find("浅墨Shader编程/Volume8/运动模糊特效标准版");
61 |
62 | //判断是否支持屏幕特效
63 | if (!SystemInfo.supportsImageEffects)
64 | {
65 | enabled = false;
66 | return;
67 | }
68 | }
69 |
70 | //-------------------------------------【OnRenderImage()函数】------------------------------------
71 | // 说明:此函数在当完成所有渲染图片后被调用,用来渲染图片后期效果
72 | //--------------------------------------------------------------------------------------------------------
73 | void OnRenderImage(RenderTexture sourceTexture, RenderTexture destTexture)
74 | {
75 | //着色器实例不为空,就进行参数设置
76 | if (CurShader != null)
77 | {
78 | //设置Shader中的外部变量
79 | material.SetFloat("_IterationNumber", IterationNumber);
80 | material.SetFloat("_Value", Intensity);
81 | material.SetFloat("_Value2", OffsetX);
82 | material.SetFloat("_Value3", OffsetY);
83 | material.SetVector("_ScreenResolution", new Vector4(sourceTexture.width, sourceTexture.height, 0.0f, 0.0f));
84 |
85 | //拷贝源纹理到目标渲染纹理,加上我们的材质效果
86 | Graphics.Blit(sourceTexture, destTexture, material);
87 | }
88 | //着色器实例为空,直接拷贝屏幕上的效果。此情况下是没有实现屏幕特效的
89 | else
90 | {
91 | //直接拷贝源纹理到目标渲染纹理
92 | Graphics.Blit(sourceTexture, destTexture);
93 | }
94 |
95 | }
96 |
97 |
98 | //-----------------------------------------【OnValidate()函数】--------------------------------------
99 | // 说明:此函数在编辑器中该脚本的某个值发生了改变后被调用
100 | //--------------------------------------------------------------------------------------------------------
101 | void OnValidate()
102 | {
103 | //将编辑器中的值赋值回来,确保在编辑器中值的改变立刻让结果生效
104 | ChangeValue4 = IterationNumber;
105 | ChangeValue = Intensity;
106 | ChangeValue2 = OffsetX;
107 | ChangeValue3 = OffsetY;
108 |
109 | }
110 |
111 | //-----------------------------------------【Update()函数】------------------------------------------
112 | // 说明:此函数在每一帧中都会被调用
113 | //--------------------------------------------------------------------------------------------------------
114 | void Update()
115 | {
116 | if (Application.isPlaying)
117 | {
118 | //赋值
119 | IterationNumber = ChangeValue4;
120 | Intensity = ChangeValue;
121 | OffsetX = ChangeValue2;
122 | OffsetY = ChangeValue3;
123 |
124 | }
125 |
126 | //找到对应的Shader文件
127 | #if UNITY_EDITOR
128 | if (Application.isPlaying != true)
129 | {
130 | CurShader = Shader.Find("浅墨Shader编程/Volume8/运动模糊特效标准版");
131 |
132 | }
133 | #endif
134 | }
135 |
136 |
137 | //-----------------------------------------【OnDisable()函数】---------------------------------------
138 | // 说明:当对象变为不可用或非激活状态时此函数便被调用
139 | //--------------------------------------------------------------------------------------------------------
140 | void OnDisable()
141 | {
142 | if (CurMaterial)
143 | {
144 | DestroyImmediate(CurMaterial);
145 | }
146 | }
147 | }
148 |
--------------------------------------------------------------------------------
/Volume 08 径向模糊屏幕特效Shader&自定义Shader template/MotionBlurEffects/MotionBlurEffects.shader:
--------------------------------------------------------------------------------
1 |
2 | Shader "浅墨Shader编程/Volume8/运动模糊特效标准版"
3 | {
4 | //------------------------------------【属性值】------------------------------------
5 | Properties
6 | {
7 | _MainTex("主纹理 (RGB)", 2D) = "white" {}
8 | _IterationNumber("迭代次数", Int)=16
9 | }
10 |
11 | //------------------------------------【唯一的子着色器】------------------------------------
12 | SubShader
13 | {
14 | //--------------------------------唯一的通道-------------------------------
15 | Pass
16 | {
17 | //设置深度测试模式:渲染所有像素.等同于关闭透明度测试(AlphaTest Off)
18 | ZTest Always
19 |
20 | //===========开启CG着色器语言编写模块===========
21 | CGPROGRAM
22 |
23 | //编译指令: 指定着色器编译目标为Shader Model 3.0
24 | #pragma target 3.0
25 |
26 | //编译指令:告知编译器顶点和片段着色函数的名称
27 | #pragma vertex vert
28 | #pragma fragment frag
29 |
30 | //包含辅助CG头文件
31 | #include "UnityCG.cginc"
32 |
33 | //外部变量的声明
34 | uniform sampler2D _MainTex;
35 | uniform float _Value;
36 | uniform float _Value2;
37 | uniform float _Value3;
38 | uniform int _IterationNumber;
39 |
40 | //顶点输入结构
41 | struct vertexInput
42 | {
43 | float4 vertex : POSITION;//顶点位置
44 | float4 color : COLOR;//颜色值
45 | float2 texcoord : TEXCOORD0;//一级纹理坐标
46 | };
47 |
48 | //顶点输出结构
49 | struct vertexOutput
50 | {
51 | half2 texcoord : TEXCOORD0;//一级纹理坐标
52 | float4 vertex : SV_POSITION;//像素位置
53 | fixed4 color : COLOR;//颜色值
54 | };
55 |
56 |
57 | //--------------------------------【顶点着色函数】-----------------------------
58 | // 输入:顶点输入结构体
59 | // 输出:顶点输出结构体
60 | //---------------------------------------------------------------------------------
61 | vertexOutput vert(vertexInput Input)
62 | {
63 | //【1】声明一个输出结构对象
64 | vertexOutput Output;
65 |
66 | //【2】填充此输出结构
67 | //输出的顶点位置为模型视图投影矩阵乘以顶点位置,也就是将三维空间中的坐标投影到了二维窗口
68 | Output.vertex = mul(UNITY_MATRIX_MVP, Input.vertex);
69 | //输出的纹理坐标也就是输入的纹理坐标
70 | Output.texcoord = Input.texcoord;
71 | //输出的颜色值也就是输入的颜色值
72 | Output.color = Input.color;
73 |
74 | //【3】返回此输出结构对象
75 | return Output;
76 | }
77 |
78 | //--------------------------------【片段着色函数】-----------------------------
79 | // 输入:顶点输出结构体
80 | // 输出:float4型的颜色值
81 | //---------------------------------------------------------------------------------
82 | float4 frag(vertexOutput i) : COLOR
83 | {
84 | //【1】设置中心坐标
85 | float2 center = float2(_Value2, _Value3);
86 | //【2】获取纹理坐标的x,y坐标值
87 | float2 uv = i.texcoord.xy;
88 | //【3】纹理坐标按照中心位置进行一个偏移
89 | uv -= center;
90 | //【4】初始化一个颜色值
91 | float4 color = float4(0.0, 0.0, 0.0, 0.0);
92 | //【5】将Value乘以一个系数
93 | _Value *= 0.085;
94 | //【6】设置坐标缩放比例的值
95 | float scale = 1;
96 |
97 | //【7】进行纹理颜色的迭代
98 | for (int j = 1; j < _IterationNumber; ++j)
99 | {
100 | //将主纹理在不同坐标采样下的颜色值进行迭代累加
101 | color += tex2D(_MainTex, uv * scale + center);
102 | //坐标缩放比例依据循环参数的改变而变化
103 | scale = 1 + (float(j * _Value));
104 | }
105 |
106 | //【8】将最终的颜色值除以迭代次数,取平均值
107 | color /= (float)_IterationNumber;
108 |
109 | //【9】返回最终的颜色值
110 | return color;
111 | }
112 |
113 | //===========结束CG着色器语言编写模块===========
114 | ENDCG
115 | }
116 | }
117 | }
118 |
--------------------------------------------------------------------------------
/Volume 08 径向模糊屏幕特效Shader&自定义Shader template/README.md:
--------------------------------------------------------------------------------
1 |
2 | #内容图示
3 |
4 | ##Volume 08 径向模糊屏幕特效
5 | 
6 |
7 | 
--------------------------------------------------------------------------------
/Volume 08 径向模糊屏幕特效Shader&自定义Shader template/ShaderTemplates/ImageEffectShaderTemplate.shader:
--------------------------------------------------------------------------------
1 |
2 | Shader "浅墨Shader编程/Volume8/图像特效Shader模板"
3 | {
4 | //------------------------------------【属性值】------------------------------------
5 | Properties
6 | {
7 | //主纹理
8 | _MainTex ("Texture", 2D) = "white" {}
9 | }
10 |
11 | //------------------------------------【唯一的子着色器】------------------------------------
12 | SubShader
13 | {
14 | //关闭剔除操作
15 | Cull Off
16 | //关闭深度写入模式
17 | ZWrite Off
18 | //设置深度测试模式:渲染所有像素.等同于关闭透明度测试(AlphaTest Off)
19 | ZTest Always
20 |
21 | //--------------------------------唯一的通道-------------------------------
22 | Pass
23 | {
24 | //===========开启CG着色器语言编写模块===========
25 | CGPROGRAM
26 |
27 | //编译指令:告知编译器顶点和片段着色函数的名称
28 | #pragma vertex vert
29 | #pragma fragment frag
30 |
31 | //包含头文件
32 | #include "UnityCG.cginc"
33 |
34 | //顶点着色器输入结构
35 | struct appdata
36 | {
37 | float4 vertex : POSITION;//顶点位置
38 | float2 uv : TEXCOORD0;//一级纹理坐标
39 | };
40 |
41 | //顶点着色器输出结构(v2f,vertex to fragment)
42 | struct v2f
43 | {
44 | float2 uv : TEXCOORD0;//一级纹理坐标
45 | float4 vertex : SV_POSITION;//像素位置
46 | };
47 |
48 | //--------------------------------【顶点着色函数】-----------------------------
49 | // 输入:顶点输入结构体
50 | // 输出:顶点输出结构体
51 | //---------------------------------------------------------------------------------
52 | //顶点着色函数
53 | v2f vert (appdata v)
54 | {
55 | //【1】实例化一个输入结构体
56 | v2f o;
57 |
58 | //【2】填充此输出结构
59 | //输出的顶点位置(像素位置)为模型视图投影矩阵乘以顶点位置,也就是将三维空间中的坐标投影到了二维窗口
60 | o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
61 | //输入的UV纹理坐标为顶点输出的坐标
62 | o.uv = v.uv;
63 |
64 | //【3】返回此输出结构对象
65 | return o;
66 | }
67 |
68 | //变量的声明
69 | sampler2D _MainTex;
70 |
71 | //--------------------------------【片段着色函数】-----------------------------
72 | // 输入:顶点输出结构体
73 | // 输出:float4型的像素颜色值
74 | //---------------------------------------------------------------------------------
75 | fixed4 frag (v2f i) : SV_Target
76 | {
77 | //【1】采样主纹理在对应坐标下的颜色值
78 | fixed4 col = tex2D(_MainTex, i.uv);
79 | //【2】将颜色值反向
80 | col = 1 - col;
81 |
82 | //【3】返回最终的颜色值
83 | return col;
84 | }
85 |
86 | //===========结束CG着色器语言编写模块===========
87 | ENDCG
88 | }
89 | }
90 | }
91 |
--------------------------------------------------------------------------------
/Volume 08 径向模糊屏幕特效Shader&自定义Shader template/ShaderTemplates/SurfaceShaderTemplate.shader:
--------------------------------------------------------------------------------
1 |
2 | Shader "浅墨Shader编程/Volume8/Surface Shader模板"
3 | {
4 | //------------------------------------【属性值】------------------------------------
5 | Properties
6 | {
7 | //主颜色
8 | _Color ("Color", Color) = (1,1,1,1)
9 | //主纹理
10 | _MainTex ("Albedo (RGB)", 2D) = "white" {}
11 | //光泽度
12 | _Glossiness ("Smoothness", Range(0,1)) = 0.5
13 | //金属度
14 | _Metallic ("Metallic", Range(0,1)) = 0.0
15 | }
16 |
17 | //------------------------------------【唯一的子着色器】------------------------------------
18 | SubShader
19 | {
20 | //【注意:Surface Shader不能使用Pass,直接在SubShader中实现即可】
21 |
22 | //渲染类型设置:不透明
23 | Tags{ "RenderType" = "Opaque" }
24 |
25 | //细节层次设为:200
26 | LOD 200
27 |
28 | //===========开启CG着色器语言编写模块===========
29 | CGPROGRAM
30 |
31 | //编译指令:告知编译器表明着色函数的名称为surf
32 | //Standard表示光照模型为Unity标准版光照模型
33 | //fullforwardshadows表示在正向渲染路径中支持所有阴影类型
34 | #pragma surface surf Standard fullforwardshadows
35 |
36 | //编译指令: 指定着色器编译目标为Shader Model 3.0
37 | #pragma target 3.0
38 |
39 | //变量的声明
40 | sampler2D _MainTex;
41 |
42 | //表面输入结构
43 | struct Input
44 | {
45 | float2 uv_MainTex;//纹理坐标
46 | };
47 |
48 | //变量的声明
49 | half _Glossiness;
50 | half _Metallic;
51 | fixed4 _Color;
52 |
53 | //--------------------------------【表面着色函数】-----------------------------
54 | // 输入:表面输入结构体
55 | // 输出:Unity内置的SurfaceOutputStandard结构体
56 | // SurfaceOutputStandard原型如下:
57 | /*
58 | struct SurfaceOutputStandard
59 | {
60 | fixed3 Albedo; // 漫反射颜色
61 | fixed3 Normal; // 切线空间法线
62 | half3 Emission; //自发光
63 | half Metallic; // 金属度;取0为非金属, 取1为金属
64 | half Smoothness; // 光泽度;取0为非常粗糙, 取1为非常光滑
65 | half Occlusion; // 遮挡(默认值为1)
66 | fixed Alpha; // 透明度
67 | };
68 | */
69 | //---------------------------------------------------------------------------------
70 | void surf(Input IN, inout SurfaceOutputStandard o)
71 | {
72 | //【1】漫反射颜色为主纹理对应的纹理坐标,并乘以主颜色
73 | fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color;
74 | //【2】将准备好的颜色的rgb分量作为漫反射颜色
75 | o.Albedo = c.rgb;
76 | //【3】金属度取自属性值
77 | o.Metallic = _Metallic;
78 | //【4】光泽度也取自属性值
79 | o.Smoothness = _Glossiness;
80 | //【5】将准备好的颜色的alpha分量作为Alpha分量值
81 | o.Alpha = c.a;
82 | }
83 |
84 | //===========结束CG着色器语言编写模块===========
85 | ENDCG
86 | }
87 | //备胎为漫反射
88 | FallBack "Diffuse"
89 | }
90 |
--------------------------------------------------------------------------------
/Volume 08 径向模糊屏幕特效Shader&自定义Shader template/ShaderTemplates/UnlitShaderTemplate.shader:
--------------------------------------------------------------------------------
1 |
2 | Shader "浅墨Shader编程/Volume8/无灯光着色器(Unlit Shader)模板"
3 | {
4 | //------------------------------------【属性值】------------------------------------
5 | Properties
6 | {
7 | //主纹理
8 | _MainTex ("Texture", 2D) = "white" {}
9 | }
10 |
11 | //------------------------------------【唯一的子着色器】------------------------------------
12 | SubShader
13 | {
14 | //渲染类型设置:不透明
15 | Tags { "RenderType"="Opaque" }
16 |
17 | //细节层次设为:200
18 | LOD 100
19 |
20 | //--------------------------------唯一的通道-------------------------------
21 | Pass
22 | {
23 | //===========开启CG着色器语言编写模块===========
24 | CGPROGRAM
25 |
26 | //编译指令:告知编译器顶点和片段着色函数的名称
27 | #pragma vertex vert
28 | #pragma fragment frag
29 |
30 | // 着色器变体快捷编译指令:雾效。编译出几个不同的Shader变体来处理不同类型的雾效(关闭/线性/指数/二阶指数)
31 | #pragma multi_compile_fog
32 |
33 | //包含头文件
34 | #include "UnityCG.cginc"
35 |
36 | //顶点着色器输入结构
37 | struct appdata
38 | {
39 | float4 vertex : POSITION;//顶点位置
40 | float2 uv : TEXCOORD0;//纹理坐标
41 | };
42 |
43 | //顶点着色器输出结构
44 | struct v2f
45 | {
46 | float2 uv : TEXCOORD0;//纹理坐标
47 | UNITY_FOG_COORDS(1)//雾数据
48 | float4 vertex : SV_POSITION;//像素位置
49 | };
50 |
51 | //变量声明
52 | sampler2D _MainTex;
53 | float4 _MainTex_ST;
54 |
55 | //--------------------------------【顶点着色函数】-----------------------------
56 | // 输入:顶点输入结构体
57 | // 输出:顶点输出结构体
58 | //---------------------------------------------------------------------------------
59 | v2f vert (appdata v)
60 | {
61 | //【1】实例化一个输入结构体
62 | v2f o;
63 | //【2】填充此输出结构
64 | //输出的顶点位置(像素位置)为模型视图投影矩阵乘以顶点位置,也就是将三维空间中的坐标投影到了二维窗口
65 | o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
66 | //【3】用UnityCG.cginc头文件中内置定义的宏,根据uv坐标来计算真正的纹理上对应的位置(按比例进行二维变换)
67 | o.uv = TRANSFORM_TEX(v.uv, _MainTex);
68 | //【4】用UnityCG.cginc头文件中内置定义的宏处理雾效,从顶点着色器中输出雾效数据
69 | UNITY_TRANSFER_FOG(o,o.vertex);
70 |
71 | //【5】返回此输出结构对象
72 | return o;
73 | }
74 |
75 | //--------------------------------【片段着色函数】-----------------------------
76 | // 输入:顶点输出结构体
77 | // 输出:float4型的像素颜色值
78 | //---------------------------------------------------------------------------------
79 | fixed4 frag (v2f i) : SV_Target
80 | {
81 | //【1】采样主纹理在对应坐标下的颜色值
82 | fixed4 col = tex2D(_MainTex, i.uv);
83 |
84 | //【2】用UnityCG.cginc头文件中内置定义的宏启用雾效
85 | UNITY_APPLY_FOG(i.fogCoord, col);
86 |
87 | //【3】返回最终的颜色值
88 | return col;
89 | }
90 |
91 | //===========结束CG着色器语言编写模块===========
92 | ENDCG
93 | }
94 | }
95 | }
96 |
--------------------------------------------------------------------------------
/Volume 09 屏幕水幕特效Shader&Standard Shader/README.md:
--------------------------------------------------------------------------------
1 |
2 | #内容图示
3 | ##Volume 09 屏幕水幕特效的实现
4 | 
5 |
6 | 
--------------------------------------------------------------------------------
/Volume 09 屏幕水幕特效Shader&Standard Shader/ScreenWaterDropEffect/Resources/ScreenWaterDrop.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QianMo/Awesome-Unity-Shader/2e37041035cc4708aff39a5b4387cc8f47c728a8/Volume 09 屏幕水幕特效Shader&Standard Shader/ScreenWaterDropEffect/Resources/ScreenWaterDrop.png
--------------------------------------------------------------------------------
/Volume 09 屏幕水幕特效Shader&Standard Shader/ScreenWaterDropEffect/ScreenWaterDropEffect.cs:
--------------------------------------------------------------------------------
1 | //-----------------------------------------------【C#脚本说明】---------------------------------------------------
2 | // 屏幕水幕特效的实现代码-C#脚本部分
3 | // 2015年10月 Created by 浅墨
4 | // 更多内容或交流,请访问浅墨的博客:http://blog.csdn.net/poem_qianmo
5 | //---------------------------------------------------------------------------------------------------------------------
6 |
7 |
8 | using UnityEngine;
9 | using System.Collections;
10 |
11 | [ExecuteInEditMode]
12 | [AddComponentMenu("浅墨Shader编程/Volume9/ScreenWaterDropEffect")]
13 | public class ScreenWaterDropEffect : MonoBehaviour
14 | {
15 | //-------------------变量声明部分-------------------
16 | #region Variables
17 |
18 | //着色器和材质实例
19 | public Shader CurShader;//着色器实例
20 | private Material CurMaterial;//当前的材质
21 |
22 | //时间变量和素材图的定义
23 | private float TimeX = 1.0f;//时间变量
24 | private Texture2D ScreenWaterDropTex;//屏幕水滴的素材图
25 |
26 | //可以在编辑器中调整的参数值
27 | [Range(5, 64), Tooltip("溶解度")]
28 | public float Distortion = 8.0f;
29 | [Range(0, 7), Tooltip("水滴在X坐标上的尺寸")]
30 | public float SizeX = 1f;
31 | [Range(0, 7), Tooltip("水滴在Y坐标上的尺寸")]
32 | public float SizeY = 0.5f;
33 | [Range(0, 10), Tooltip("水滴的流动速度")]
34 | public float DropSpeed = 3.6f;
35 |
36 | //用于参数调节的中间变量
37 | public static float ChangeDistortion;
38 | public static float ChangeSizeX;
39 | public static float ChangeSizeY;
40 | public static float ChangeDropSpeed;
41 | #endregion
42 |
43 |
44 | //-------------------------材质的get&set----------------------------
45 | #region MaterialGetAndSet
46 | Material material
47 | {
48 | get
49 | {
50 | if (CurMaterial == null)
51 | {
52 | CurMaterial = new Material(CurShader);
53 | CurMaterial.hideFlags = HideFlags.HideAndDontSave;
54 | }
55 | return CurMaterial;
56 | }
57 | }
58 | #endregion
59 |
60 |
61 | //-----------------------------------------【Start()函数】---------------------------------------------
62 | // 说明:此函数仅在Update函数第一次被调用前被调用
63 | //--------------------------------------------------------------------------------------------------------
64 | void Start()
65 | {
66 | //依次赋值
67 | ChangeDistortion = Distortion;
68 | ChangeSizeX = SizeX;
69 | ChangeSizeY = SizeY;
70 | ChangeDropSpeed = DropSpeed;
71 |
72 | //载入素材图
73 | ScreenWaterDropTex = Resources.Load("ScreenWaterDrop") as Texture2D;
74 |
75 | //找到当前的Shader文件
76 | CurShader = Shader.Find("浅墨Shader编程/Volume9/ScreenWaterDropEffect");
77 |
78 | //判断是否支持屏幕特效
79 | if (!SystemInfo.supportsImageEffects)
80 | {
81 | enabled = false;
82 | return;
83 | }
84 | }
85 |
86 | //-------------------------------------【OnRenderImage()函数】------------------------------------
87 | // 说明:此函数在当完成所有渲染图片后被调用,用来渲染图片后期效果
88 | //--------------------------------------------------------------------------------------------------------
89 | void OnRenderImage(RenderTexture sourceTexture, RenderTexture destTexture)
90 | {
91 | //着色器实例不为空,就进行参数设置
92 | if (CurShader != null)
93 | {
94 | //时间的变化
95 | TimeX += Time.deltaTime;
96 | //时间大于100,便置0,保证可以循环
97 | if (TimeX > 100) TimeX = 0;
98 |
99 | //设置Shader中其他的外部变量
100 | material.SetFloat("_CurTime", TimeX);
101 | material.SetFloat("_Distortion", Distortion);
102 | material.SetFloat("_SizeX", SizeX);
103 | material.SetFloat("_SizeY", SizeY);
104 | material.SetFloat("_DropSpeed", DropSpeed);
105 | material.SetTexture("_ScreenWaterDropTex", ScreenWaterDropTex);
106 |
107 | //拷贝源纹理到目标渲染纹理,加上我们的材质效果
108 | Graphics.Blit(sourceTexture, destTexture, material);
109 | }
110 | //着色器实例为空,直接拷贝屏幕上的效果。此情况下是没有实现屏幕特效的
111 | else
112 | {
113 | //直接拷贝源纹理到目标渲染纹理
114 | Graphics.Blit(sourceTexture, destTexture);
115 | }
116 |
117 |
118 | }
119 |
120 | //-----------------------------------------【OnValidate()函数】--------------------------------------
121 | // 说明:此函数在编辑器中该脚本的某个值发生了改变后被调用
122 | //--------------------------------------------------------------------------------------------------------
123 | void OnValidate()
124 | {
125 | ChangeDistortion = Distortion;
126 | ChangeSizeX = SizeX;
127 | ChangeSizeY = SizeY;
128 | ChangeDropSpeed = DropSpeed;
129 | }
130 |
131 |
132 | //-----------------------------------------【Update()函数】------------------------------------------
133 | // 说明:此函数在每一帧中都会被调用
134 | //--------------------------------------------------------------------------------------------------------
135 | void Update()
136 | {
137 | //若程序在运行,进行赋值
138 | if (Application.isPlaying)
139 | {
140 | //赋值
141 | Distortion = ChangeDistortion;
142 | SizeX = ChangeSizeX;
143 | SizeY = ChangeSizeY;
144 | DropSpeed = ChangeDropSpeed;
145 | }
146 | //找到对应的Shader文件,和纹理素材
147 | #if UNITY_EDITOR
148 | if (Application.isPlaying != true)
149 | {
150 | CurShader = Shader.Find("浅墨Shader编程/Volume9/ScreenWaterDropEffect");
151 | ScreenWaterDropTex = Resources.Load("ScreenWaterDrop") as Texture2D;
152 |
153 | }
154 | #endif
155 |
156 | }
157 |
158 | //-----------------------------------------【OnDisable()函数】---------------------------------------
159 | // 说明:当对象变为不可用或非激活状态时此函数便被调用
160 | //--------------------------------------------------------------------------------------------------------
161 | void OnDisable()
162 | {
163 | if (CurMaterial)
164 | {
165 | //立即销毁材质实例
166 | DestroyImmediate(CurMaterial);
167 | }
168 |
169 | }
170 | }
171 |
172 |
--------------------------------------------------------------------------------
/Volume 09 屏幕水幕特效Shader&Standard Shader/ScreenWaterDropEffect/ScreenWaterDropEffect.shader:
--------------------------------------------------------------------------------
1 | //-----------------------------------------------【Shader脚本说明】---------------------------------------------------
2 | // 屏幕水幕特效的实现代码-Shader脚本部分
3 | // 2015年10月 Created by 浅墨
4 | // 更多内容或交流,请访问浅墨的博客:http://blog.csdn.net/poem_qianmo
5 | //---------------------------------------------------------------------------------------------------------------------
6 |
7 | Shader "浅墨Shader编程/Volume9/ScreenWaterDropEffect"
8 | {
9 | //------------------------------------【属性值】------------------------------------
10 | Properties
11 | {
12 | //主纹理
13 | _MainTex ("Base (RGB)", 2D) = "white" {}
14 | //屏幕水滴的素材图
15 | _ScreenWaterDropTex ("Base (RGB)", 2D) = "white" {}
16 | //当前时间
17 | _CurTime ("Time", Range(0.0, 1.0)) = 1.0
18 | //X坐标上的水滴尺寸
19 | _SizeX ("SizeX", Range(0.0, 1.0)) = 1.0
20 | //Y坐标上的水滴尺寸
21 | _SizeY ("SizeY", Range(0.0, 1.0)) = 1.0
22 | //水滴的流动速度
23 | _DropSpeed ("Speed", Range(0.0, 10.0)) = 1.0
24 | //溶解度
25 | _Distortion ("_Distortion", Range(0.0, 1.0)) = 0.87
26 | }
27 |
28 | //------------------------------------【唯一的子着色器】------------------------------------
29 | SubShader
30 | {
31 | Pass
32 | {
33 | //设置深度测试模式:渲染所有像素.等同于关闭透明度测试(AlphaTest Off)
34 | ZTest Always
35 |
36 | //===========开启CG着色器语言编写模块===========
37 | CGPROGRAM
38 |
39 | //编译指令:告知编译器顶点和片段着色函数的名称
40 | #pragma vertex vert
41 | #pragma fragment frag
42 | #pragma fragmentoption ARB_precision_hint_fastest
43 | //编译指令: 指定着色器编译目标为Shader Model 3.0
44 | #pragma target 3.0
45 |
46 | //包含辅助CG头文件
47 | #include "UnityCG.cginc"
48 |
49 | //外部变量的声明
50 | uniform sampler2D _MainTex;
51 | uniform sampler2D _ScreenWaterDropTex;
52 | uniform float _CurTime;
53 | uniform float _DropSpeed;
54 | uniform float _SizeX;
55 | uniform float _SizeY;
56 | uniform float _Distortion;
57 | uniform float2 _MainTex_TexelSize;
58 |
59 | //顶点输入结构
60 | struct vertexInput
61 | {
62 | float4 vertex : POSITION;//顶点位置
63 | float4 color : COLOR;//颜色值
64 | float2 texcoord : TEXCOORD0;//一级纹理坐标
65 | };
66 |
67 | //顶点输出结构
68 | struct vertexOutput
69 | {
70 | half2 texcoord : TEXCOORD0;//一级纹理坐标
71 | float4 vertex : SV_POSITION;//像素位置
72 | fixed4 color : COLOR;//颜色值
73 | };
74 |
75 | //--------------------------------【顶点着色函数】-----------------------------
76 | // 输入:顶点输入结构体
77 | // 输出:顶点输出结构体
78 | //---------------------------------------------------------------------------------
79 | vertexOutput vert(vertexInput Input)
80 | {
81 | //【1】声明一个输出结构对象
82 | vertexOutput Output;
83 |
84 | //【2】填充此输出结构
85 | //输出的顶点位置为模型视图投影矩阵乘以顶点位置,也就是将三维空间中的坐标投影到了二维窗口
86 | Output.vertex = mul(UNITY_MATRIX_MVP, Input.vertex);
87 | //输出的纹理坐标也就是输入的纹理坐标
88 | Output.texcoord = Input.texcoord;
89 | //输出的颜色值也就是输入的颜色值
90 | Output.color = Input.color;
91 |
92 | //【3】返回此输出结构对象
93 | return Output;
94 | }
95 |
96 | //--------------------------------【片段着色函数】-----------------------------
97 | // 输入:顶点输出结构体
98 | // 输出:float4型的颜色值
99 | //---------------------------------------------------------------------------------
100 | fixed4 frag(vertexOutput Input) : COLOR
101 | {
102 | //【1】获取顶点的坐标值
103 | float2 uv = Input.texcoord.xy;
104 |
105 | //【2】解决平台差异的问题。校正方向,若和规定方向相反,则将速度反向并加1
106 | #if UNITY_UV_STARTS_AT_TOP
107 | if (_MainTex_TexelSize.y < 0)
108 | _DropSpeed = 1 - _DropSpeed;
109 | #endif
110 |
111 | //【3】设置三层水流效果,按照一定的规律在水滴纹理上分别进行取样
112 | float3 rainTex1 = tex2D(_ScreenWaterDropTex, float2(uv.x * 1.15* _SizeX, (uv.y* _SizeY *1.1) + _CurTime* _DropSpeed *0.15)).rgb / _Distortion;
113 | float3 rainTex2 = tex2D(_ScreenWaterDropTex, float2(uv.x * 1.25* _SizeX - 0.1, (uv.y *_SizeY * 1.2) + _CurTime *_DropSpeed * 0.2)).rgb / _Distortion;
114 | float3 rainTex3 = tex2D(_ScreenWaterDropTex, float2(uv.x* _SizeX *0.9, (uv.y *_SizeY * 1.25) + _CurTime * _DropSpeed* 0.032)).rgb / _Distortion;
115 |
116 | //【4】整合三层水流效果的颜色信息,存于finalRainTex中
117 | float2 finalRainTex = uv.xy - (rainTex1.xy - rainTex2.xy - rainTex3.xy) / 3;
118 |
119 | //【5】按照finalRainTex的坐标信息,在主纹理上进行采样
120 | float3 finalColor = tex2D(_MainTex, float2(finalRainTex.x, finalRainTex.y)).rgb;
121 |
122 | //【6】返回加上alpha分量的最终颜色值
123 | return fixed4(finalColor, 1.0);
124 |
125 |
126 | }
127 |
128 | //===========结束CG着色器语言编写模块===========
129 | ENDCG
130 | }
131 | }
132 | }
133 |
134 |
--------------------------------------------------------------------------------
/Volume 09 屏幕水幕特效Shader&Standard Shader/Unity5.2.1 Built-in Standard Shader/Standard.shader:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QianMo/Awesome-Unity-Shader/2e37041035cc4708aff39a5b4387cc8f47c728a8/Volume 09 屏幕水幕特效Shader&Standard Shader/Unity5.2.1 Built-in Standard Shader/Standard.shader
--------------------------------------------------------------------------------
/Volume 10 屏幕油画特效Shader/README.md:
--------------------------------------------------------------------------------
1 |
2 | #内容图示
3 | ##Volume 10 屏幕油画特效的实现
4 | 
5 |
6 | 
--------------------------------------------------------------------------------
/Volume 10 屏幕油画特效Shader/ScreenOilPaintEffect/ScreenOilPaintEffect.cs:
--------------------------------------------------------------------------------
1 | using UnityEngine;
2 | using System.Collections;
3 |
4 | //设置在编辑模式下也执行该脚本
5 | [ExecuteInEditMode]
6 | //添加选项到菜单中
7 | [AddComponentMenu("浅墨Shader编程/Volume10/ScreenOilPaintEffect")]
8 | public class ScreenOilPaintEffect : MonoBehaviour
9 | {
10 | //-------------------变量声明部分-------------------
11 | #region Variables
12 |
13 | //着色器和材质实例
14 | public Shader CurShader;
15 | private Material CurMaterial;
16 |
17 | //两个参数值
18 | [Range(0, 5),Tooltip("分辨率比例值")]
19 | public float ResolutionValue = 0.9f;
20 | [Range(1, 30),Tooltip("半径的值,决定了迭代的次数")]
21 | public int RadiusValue = 5;
22 |
23 | //两个用于调节参数的中间变量
24 | public static float ChangeValue;
25 | public static int ChangeValue2;
26 | #endregion
27 |
28 | //-------------------------材质的get&set----------------------------
29 | #region MaterialGetAndSet
30 | Material material
31 | {
32 | get
33 | {
34 | if(CurMaterial == null)
35 | {
36 | CurMaterial = new Material(CurShader);
37 | CurMaterial.hideFlags = HideFlags.HideAndDontSave;
38 | }
39 | return CurMaterial;
40 | }
41 | }
42 | #endregion
43 |
44 | //-----------------------------------------【Start()函数】---------------------------------------------
45 | // 说明:此函数仅在Update函数第一次被调用前被调用
46 | //--------------------------------------------------------------------------------------------------------
47 | void Start ()
48 | {
49 | //依次赋值
50 | ChangeValue = ResolutionValue;
51 | ChangeValue2 = RadiusValue;
52 |
53 | //找到当前的Shader文件
54 | CurShader = Shader.Find("浅墨Shader编程/Volume10/ScreenOilPaintEffect");
55 |
56 | //判断当前设备是否支持屏幕特效
57 | if(!SystemInfo.supportsImageEffects)
58 | {
59 | enabled = false;
60 | return;
61 | }
62 | }
63 |
64 | //-------------------------------------【OnRenderImage()函数】------------------------------------
65 | // 说明:此函数在当完成所有渲染图片后被调用,用来渲染图片后期效果
66 | //--------------------------------------------------------------------------------------------------------
67 | void OnRenderImage (RenderTexture sourceTexture, RenderTexture destTexture)
68 | {
69 | //着色器实例不为空,就进行参数设置
70 | if(CurShader != null)
71 | {
72 | //给Shader中的外部变量赋值
73 | material.SetFloat("_ResolutionValue", ResolutionValue);
74 | material.SetInt("_Radius", RadiusValue);
75 | material.SetVector("_ScreenResolution", new Vector4(sourceTexture.width, sourceTexture.height, 0.0f, 0.0f));
76 |
77 | //拷贝源纹理到目标渲染纹理,加上我们的材质效果
78 | Graphics.Blit(sourceTexture, destTexture, material);
79 | }
80 |
81 | //着色器实例为空,直接拷贝屏幕上的效果。此情况下是没有实现屏幕特效的
82 | else
83 | {
84 | //直接拷贝源纹理到目标渲染纹理
85 | Graphics.Blit(sourceTexture, destTexture);
86 | }
87 |
88 |
89 | }
90 |
91 |
92 | //-----------------------------------------【OnValidate()函数】--------------------------------------
93 | // 说明:此函数在编辑器中该脚本的某个值发生了改变后被调用
94 | //--------------------------------------------------------------------------------------------------------
95 | void OnValidate()
96 | {
97 | //将编辑器中的值赋值回来,确保在编辑器中值的改变立刻让结果生效
98 | ChangeValue = ResolutionValue;
99 | ChangeValue2 = RadiusValue;
100 | }
101 | // Update is called once per frame
102 | void Update ()
103 | {
104 | //若程序在运行,进行赋值
105 | if (Application.isPlaying)
106 | {
107 | //赋值
108 | ResolutionValue = ChangeValue;
109 | RadiusValue=ChangeValue2;
110 | }
111 | //若程序没有在运行,去寻找对应的Shader文件
112 | #if UNITY_EDITOR
113 | if (Application.isPlaying!=true)
114 | {
115 | CurShader = Shader.Find("浅墨Shader编程/Volume10/ScreenOilPaintEffect");
116 | }
117 | #endif
118 |
119 | }
120 |
121 | //-----------------------------------------【OnDisable()函数】---------------------------------------
122 | // 说明:当对象变为不可用或非激活状态时此函数便被调用
123 | //--------------------------------------------------------------------------------------------------------
124 | void OnDisable ()
125 | {
126 | if(CurMaterial)
127 | {
128 | //立即销毁材质实例
129 | DestroyImmediate(CurMaterial);
130 | }
131 |
132 | }
133 | }
134 |
--------------------------------------------------------------------------------
/Volume 10 屏幕油画特效Shader/ScreenOilPaintEffect/ScreenOilPaintEffect.shader:
--------------------------------------------------------------------------------
1 | //Reference:https://www.shadertoy.com/view/MsXSRN#
2 |
3 | Shader "浅墨Shader编程/Volume10/ScreenOilPaintEffect"
4 | {
5 | //------------------------------------【属性值】------------------------------------
6 | Properties
7 | {
8 | _MainTex("Base (RGB)", 2D) = "white" {}
9 | _Distortion("_Distortion", Range(0.0, 1.0)) = 0.3
10 | _ScreenResolution("_ScreenResolution", Vector) = (0., 0., 0., 0.)
11 | _ResolutionValue("_ResolutionValue", Range(0.0, 5.0)) = 1.0
12 | _Radius("_Radius", Range(0.0, 5.0)) = 2.0
13 | }
14 |
15 | //------------------------------------【唯一的子着色器】------------------------------------
16 | SubShader
17 | {
18 | //--------------------------------唯一的通道-------------------------------
19 | Pass
20 | {
21 | //设置深度测试模式:渲染所有像素.等同于关闭透明度测试(AlphaTest Off)
22 | ZTest Always
23 |
24 | //===========开启CG着色器语言编写模块===========
25 | CGPROGRAM
26 |
27 | //编译指令: 指定着色器编译目标为Shader Model 3.0
28 | #pragma target 3.0
29 |
30 | //编译指令:告知编译器顶点和片段着色函数的名称
31 | #pragma vertex vert
32 | #pragma fragment frag
33 |
34 | //包含辅助CG头文件
35 | #include "UnityCG.cginc"
36 |
37 | //外部变量的声明
38 | uniform sampler2D _MainTex;
39 | uniform float _Distortion;
40 | uniform float4 _ScreenResolution;
41 | uniform float _ResolutionValue;
42 | uniform int _Radius;
43 |
44 | //顶点输入结构
45 | struct vertexInput
46 | {
47 | float4 vertex : POSITION;//顶点位置
48 | float4 color : COLOR;//颜色值
49 | float2 texcoord : TEXCOORD0;//一级纹理坐标
50 | };
51 |
52 | //顶点输出结构
53 | struct vertexOutput
54 | {
55 | half2 texcoord : TEXCOORD0;//一级纹理坐标
56 | float4 vertex : SV_POSITION;//像素位置
57 | fixed4 color : COLOR;//颜色值
58 | };
59 |
60 |
61 | //--------------------------------【顶点着色函数】-----------------------------
62 | // 输入:顶点输入结构体
63 | // 输出:顶点输出结构体
64 | //---------------------------------------------------------------------------------
65 | vertexOutput vert(vertexInput Input)
66 | {
67 | //【1】声明一个输出结构对象
68 | vertexOutput Output;
69 |
70 | //【2】填充此输出结构
71 | //输出的顶点位置为模型视图投影矩阵乘以顶点位置,也就是将三维空间中的坐标投影到了二维窗口
72 | Output.vertex = mul(UNITY_MATRIX_MVP, Input.vertex);
73 | //输出的纹理坐标也就是输入的纹理坐标
74 | Output.texcoord = Input.texcoord;
75 | //输出的颜色值也就是输入的颜色值
76 | Output.color = Input.color;
77 |
78 | //【3】返回此输出结构对象
79 | return Output;
80 | }
81 |
82 | //--------------------------------【片段着色函数】-----------------------------
83 | // 输入:顶点输出结构体
84 | // 输出:float4型的颜色值
85 | //---------------------------------------------------------------------------------
86 | float4 frag(vertexOutput Input) : COLOR
87 | {
88 | //【1】根据设置的分辨率比值,计算图像尺寸
89 | float2 src_size = float2(_ResolutionValue / _ScreenResolution.x, _ResolutionValue / _ScreenResolution.y);
90 |
91 | //【2】获取坐标值
92 | float2 uv = Input.texcoord.xy;
93 |
94 | //【3】根据半径,计算出n的值
95 | float n = float((_Radius + 1) * (_Radius + 1));;
96 |
97 | //【4】定义一些参数
98 | float3 m0 = 0.0; float3 m1 = 0.0;
99 | float3 s0 = 0.0; float3 s1 = 0.0;
100 | float3 c;
101 |
102 | //【5】按半径Radius的值,迭代计算m0和s0的值
103 | for (int j = -_Radius; j <= 0; ++j)
104 | {
105 | for (int i = -_Radius; i <= 0; ++i)
106 | {
107 | c = tex2D(_MainTex, uv + float2(i, j) * src_size).rgb;
108 | m0 += c;
109 | s0 += c * c;
110 | }
111 | }
112 |
113 | //【6】按半径Radius的值,迭代计算m1和s1的值
114 | for (int j = 0; j <= _Radius; ++j)
115 | {
116 | for (int i = 0; i <= _Radius; ++i)
117 | {
118 | c = tex2D(_MainTex, uv + float2(i, j) * src_size).rgb;
119 | m1 += c;
120 | s1 += c * c;
121 | }
122 | }
123 |
124 | //【7】定义参数,准备计算最终的颜色值
125 | float4 finalFragColor = 0.;
126 | float min_sigma2 = 1e+2;
127 |
128 | //【8】根据m0和s0,第一次计算finalFragColor的值
129 | m0 /= n;
130 | s0 = abs(s0 / n - m0 * m0);
131 |
132 | float sigma2 = s0.r + s0.g + s0.b;
133 | if (sigma2 < min_sigma2)
134 | {
135 | min_sigma2 = sigma2;
136 | finalFragColor = float4(m0, 1.0);
137 | }
138 |
139 | //【9】根据m1和s1,第二次计算finalFragColor的值
140 | m1 /= n;
141 | s1 = abs(s1 / n - m1 * m1);
142 |
143 | sigma2 = s1.r + s1.g + s1.b;
144 | if (sigma2 < min_sigma2)
145 | {
146 | min_sigma2 = sigma2;
147 | finalFragColor = float4(m1, 1.0);
148 | }
149 |
150 | //【10】返回最终的颜色值
151 | return finalFragColor;
152 | }
153 |
154 | ENDCG
155 | }
156 |
157 | }
158 | }
--------------------------------------------------------------------------------
/Volume 11 屏幕像素化特效Shader/PixelEffect/PixelEffect.cs:
--------------------------------------------------------------------------------
1 |
2 | using UnityEngine;
3 | using System.Collections;
4 |
5 | //设置在编辑模式下也执行该脚本
6 | [ExecuteInEditMode]
7 | //添加选项到菜单中
8 | [AddComponentMenu("浅墨Shader编程/Volume11/PixelEffect")]
9 | public class PixelEffect : MonoBehaviour
10 | {
11 | //-----------------------------变量声明部分---------------------------
12 | #region Variables
13 |
14 | //着色器和材质实例
15 | public Shader CurShader;
16 | private Material CurMaterial;
17 |
18 | //三个可调节的自定义参数
19 | [Range(1f, 1024f), Tooltip("屏幕每行将被均分为多少个像素块")]
20 | public float PixelNumPerRow = 580.0f;
21 |
22 | [Tooltip("自动计算正方形像素所需的长宽比与否")]
23 | public bool AutoCalulateRatio = true;
24 |
25 | [Range(0f, 24f), Tooltip("此参数用于自定义长宽比")]
26 | public float Ratio = 1.0f;
27 |
28 | #endregion
29 |
30 |
31 | //-------------------------材质的get&set----------------------------
32 | #region MaterialGetAndSet
33 | Material material
34 | {
35 | get
36 | {
37 | if(CurMaterial == null)
38 | {
39 | CurMaterial = new Material(CurShader);
40 | CurMaterial.hideFlags = HideFlags.HideAndDontSave;
41 | }
42 | return CurMaterial;
43 | }
44 | }
45 | #endregion
46 |
47 | //-----------------------------------------【Start()函数】---------------------------------------------
48 | // 说明:此函数仅在Update函数第一次被调用前被调用
49 | //--------------------------------------------------------------------------------------------------------
50 | void Start ()
51 | {
52 | //找到当前的Shader文件
53 | CurShader = Shader.Find("浅墨Shader编程/Volume11/PixelEffect");
54 |
55 | //判断当前设备是否支持屏幕特效
56 | if(!SystemInfo.supportsImageEffects)
57 | {
58 | enabled = false;
59 | return;
60 | }
61 | }
62 |
63 | //-------------------------------------【OnRenderImage()函数】------------------------------------
64 | // 说明:此函数在当完成所有渲染图片后被调用,用来渲染图片后期效果
65 | //--------------------------------------------------------------------------------------------------------
66 | void OnRenderImage (RenderTexture sourceTexture, RenderTexture destTexture)
67 | {
68 | //着色器实例不为空,就进行参数设置
69 | if(CurShader != null)
70 | {
71 | float pixelNumPerRow = PixelNumPerRow;
72 | //给Shader中的外部变量赋值
73 | material.SetVector("_Params", new Vector2(pixelNumPerRow,
74 | AutoCalulateRatio ? ((float)sourceTexture.width / (float)sourceTexture.height) : Ratio ));
75 |
76 | Graphics.Blit(sourceTexture, destTexture, material);
77 | }
78 |
79 | //着色器实例为空,直接拷贝屏幕上的效果。此情况下是没有实现屏幕特效的
80 | else
81 | {
82 | //直接拷贝源纹理到目标渲染纹理
83 | Graphics.Blit(sourceTexture, destTexture);
84 | }
85 | }
86 |
87 | //-----------------------------------------【Update()函数】----------------------------------------
88 | // 说明:此函数在每一帧中都会被调用
89 | //------------------------------------------------------------------------------------------------------
90 | void Update()
91 | {
92 | //若程序在运行,进行赋值
93 | if (Application.isPlaying)
94 | {
95 | #if UNITY_EDITOR
96 | if (Application.isPlaying != true)
97 | {
98 | CurShader = Shader.Find("浅墨Shader编程/Volume11/PixelEffect");
99 | }
100 | #endif
101 | }
102 | }
103 | //-----------------------------------------【OnDisable()函数】---------------------------------------
104 | // 说明:当对象变为不可用或非激活状态时此函数便被调用
105 | //--------------------------------------------------------------------------------------------------------
106 | void OnDisable ()
107 | {
108 | if(CurMaterial)
109 | {
110 | //立即销毁材质实例
111 | DestroyImmediate(CurMaterial);
112 | }
113 | }
114 | }
115 |
116 |
--------------------------------------------------------------------------------
/Volume 11 屏幕像素化特效Shader/PixelEffect/PixelEffect.shader:
--------------------------------------------------------------------------------
1 | Shader "浅墨Shader编程/Volume11/PixelEffect"
2 | {
3 | //------------------------------------【属性值】------------------------------------
4 | Properties
5 | {
6 | //主纹理
7 | _MainTex("Texture", 2D) = "white" {}
8 | //封装的变量值
9 | _Params("PixelNumPerRow (X) Ratio (Y)", Vector) = (80, 1, 1, 1.5)
10 | }
11 |
12 | //------------------------------------【唯一的子着色器】------------------------------------
13 | SubShader
14 | {
15 | //关闭剔除操作
16 | Cull Off
17 | //关闭深度写入模式
18 | ZWrite Off
19 | //设置深度测试模式:渲染所有像素.等同于关闭透明度测试(AlphaTest Off)
20 | ZTest Always
21 |
22 | //--------------------------------唯一的通道-------------------------------
23 | Pass
24 | {
25 | //===========开启CG着色器语言编写模块===========
26 | CGPROGRAM
27 |
28 | //编译指令:告知编译器顶点和片段着色函数的名称
29 | #pragma vertex vert
30 | #pragma fragment frag
31 |
32 | //包含头文件
33 | #include "UnityCG.cginc"
34 |
35 | //顶点着色器输入结构
36 | struct vertexInput
37 | {
38 | float4 vertex : POSITION;//顶点位置
39 | float2 uv : TEXCOORD0;//一级纹理坐标
40 | };
41 |
42 | //顶点着色器输出结构
43 | struct vertexOutput
44 | {
45 | float4 vertex : SV_POSITION;//像素位置
46 | float2 uv : TEXCOORD0;//一级纹理坐标
47 | };
48 |
49 | //--------------------------------【顶点着色函数】-----------------------------
50 | // 输入:顶点输入结构体
51 | // 输出:顶点输出结构体
52 | //---------------------------------------------------------------------------------
53 | //顶点着色函数
54 | vertexOutput vert(vertexInput v)
55 | {
56 | //【1】实例化一个输入结构体
57 | vertexOutput o;
58 | //【2】填充此输出结构
59 | //输出的顶点位置(像素位置)为模型视图投影矩阵乘以顶点位置,也就是将三维空间中的坐标投影到了二维窗口
60 | o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
61 | //输入的UV纹理坐标为顶点输出的坐标
62 | o.uv = v.uv;
63 |
64 | //【3】返回此输出结构对象
65 | return o;
66 | }
67 |
68 | //变量的声明
69 | sampler2D _MainTex;
70 | half4 _Params;
71 |
72 | //进行像素化操作的自定义函数PixelateOperation
73 | half4 PixelateOperation(sampler2D tex, half2 uv, half scale, half ratio)
74 | {
75 | //【1】计算每个像素块的尺寸
76 | half PixelSize = 1.0 / scale;
77 | //【2】取整计算每个像素块的坐标值,ceil函数,对输入参数向上取整
78 | half coordX=PixelSize * ceil(uv.x / PixelSize);
79 | half coordY = (ratio * PixelSize)* ceil(uv.y / PixelSize / ratio);
80 | //【3】组合坐标值
81 | half2 coord = half2(coordX,coordY);
82 | //【4】返回坐标值
83 | return half4(tex2D(tex, coord).xyzw);
84 | }
85 |
86 | //--------------------------------【片段着色函数】-----------------------------
87 | // 输入:顶点输出结构体
88 | // 输出:float4型的像素颜色值
89 | //---------------------------------------------------------------------------------
90 | fixed4 frag(vertexOutput Input) : COLOR
91 | {
92 | //使用自定义的PixelateOperation函数,计算每个像素经过取整后的颜色值
93 | return PixelateOperation(_MainTex, Input.uv, _Params.x, _Params.y);
94 | }
95 |
96 | //===========结束CG着色器语言编写模块===========
97 | ENDCG
98 | }
99 | }
100 | }
101 |
--------------------------------------------------------------------------------
/Volume 11 屏幕像素化特效Shader/README.md:
--------------------------------------------------------------------------------
1 |
2 | #内容图示
3 | 
4 |
5 | 
--------------------------------------------------------------------------------
/Volume 12 可编程Shader初步 & 标准漫反射可编程Shader/1.SimpleShader.shader:
--------------------------------------------------------------------------------
1 | //单色顶点&片段着色器
2 |
3 | Shader "浅墨Shader编程/Volume12/1.SimpleShader"
4 | {
5 | //------------------------------------【唯一的子着色器】------------------------------------
6 | SubShader
7 | {
8 | //--------------------------------唯一的通道-------------------------------
9 | Pass
10 | {
11 | //===========开启CG着色器语言编写模块============
12 | CGPROGRAM
13 |
14 | //编译指令:告知编译器顶点和片段着色函数的名称
15 | #pragma vertex vert
16 | #pragma fragment frag
17 |
18 | //--------------------------------【顶点着色函数】-----------------------------
19 | // 输入:POSITION语义(坐标位置)
20 | // 输出:SV_POSITION语义(像素位置)
21 | //---------------------------------------------------------------------------------
22 | float4 vert(float4 vertexPos : POSITION) : SV_POSITION
23 | {
24 | //坐标系变换
25 | //输出的顶点位置(像素位置)为模型视图投影矩阵乘以顶点位置,也就是将三维空间中的坐标投影到了二维窗口
26 | return mul(UNITY_MATRIX_MVP,vertexPos);
27 | }
28 |
29 | //--------------------------------【片段着色函数】-----------------------------
30 | // 输入:无
31 | // 输出:COLOR语义(颜色值)
32 | //---------------------------------------------------------------------------------
33 | float4 frag(void): COLOR
34 | {
35 | //返回单色
36 | return float4(0.0, 0.6, 0.8, 1.0);
37 | }
38 |
39 | //===========结束CG着色器语言编写模块===========
40 | ENDCG
41 | }
42 | }
43 | }
44 |
--------------------------------------------------------------------------------
/Volume 12 可编程Shader初步 & 标准漫反射可编程Shader/2.ColorChange.shader:
--------------------------------------------------------------------------------
1 | //单色可调顶点&片段着色器
2 |
3 | Shader "浅墨Shader编程/Volume12/2.ColorChange"
4 | {
5 | //------------------------------------【属性值】------------------------------------
6 | Properties
7 | {
8 | //主纹理
9 | _Color("Color", Color) = (1,1,1,1)
10 | }
11 |
12 | //------------------------------------【唯一的子着色器】------------------------------------
13 | SubShader
14 | {
15 | //--------------------------------唯一的通道-------------------------------
16 | Pass
17 | {
18 | //===========开启CG着色器语言编写模块============
19 | CGPROGRAM
20 |
21 | //指定顶点与片段着色器名称
22 | #pragma vertex vert
23 | #pragma fragment frag
24 |
25 | //--------------------------------【顶点着色函数】-----------------------------
26 | // 输入:POSITION语义(坐标位置)
27 | // 输出:SV_POSITION语义(像素位置)
28 | //---------------------------------------------------------------------------------
29 | float4 vert(float4 vertexPos : POSITION) : SV_POSITION
30 | {
31 | //坐标系变换
32 | //输出的顶点位置(像素位置)为模型视图投影矩阵乘以顶点位置,也就是将三维空间中的坐标投影到了二维窗口
33 | return mul(UNITY_MATRIX_MVP, vertexPos);
34 | }
35 | uniform float4 _Color;
36 |
37 | //--------------------------------【片段着色函数】-----------------------------
38 | // 输入:无
39 | // 输出:COLOR语义(颜色值)
40 | //---------------------------------------------------------------------------------
41 | float4 frag(void) : COLOR
42 | {
43 | //返回单色
44 | return _Color;
45 | }
46 |
47 | //===========结束CG着色器语言编写模块===========
48 | ENDCG
49 | }
50 | }
51 | }
52 |
--------------------------------------------------------------------------------
/Volume 12 可编程Shader初步 & 标准漫反射可编程Shader/3.RGB Cube.shader:
--------------------------------------------------------------------------------
1 | //RGB立方体
2 |
3 | Shader "浅墨Shader编程/Volume12/3.RGB cube"
4 | {
5 | //------------------------------------【唯一的子着色器】------------------------------------
6 | SubShader
7 | {
8 | //--------------------------------唯一的通道-------------------------------
9 | Pass
10 | {
11 | //===========开启CG着色器语言编写模块============
12 | CGPROGRAM
13 |
14 | //编译指令:告知编译器顶点和片段着色函数的名称
15 | #pragma vertex vert
16 | #pragma fragment frag
17 |
18 | //顶点着色器输出结构
19 | struct vertexOutput
20 | {
21 | float4 positon : SV_POSITION;//空间位置
22 | float4 color : TEXCOORD0;//0级纹理坐标
23 | };
24 |
25 | //--------------------------------【顶点着色函数】-----------------------------
26 | // 输入:POSITION语义
27 | // 输出:顶点输出结构体
28 | //---------------------------------------------------------------------------------
29 | vertexOutput vert(float4 vertexPos : POSITION)
30 | {
31 | //实例化一个vertexOutput输出结构
32 | vertexOutput output;
33 |
34 | //坐标系变换:将三维空间中的坐标投影到二维窗口
35 | output.positon = mul(UNITY_MATRIX_MVP, vertexPos);
36 | //输出颜色为顶点位置加上一个颜色偏移量
37 | output.color = vertexPos + float4(0.2, 0.2, 0.2, 0.0);
38 |
39 | //返回最终的值
40 | return output;
41 | }
42 |
43 | //--------------------------------【片段着色函数】-----------------------------
44 | // 输入:vertexOutput结构体
45 | // 输出:COLOR语义(颜色值)
46 | //---------------------------------------------------------------------------------
47 | float4 frag(vertexOutput input) : COLOR
48 | {
49 | //直接返回输入的颜色值
50 | return input.color;
51 | }
52 |
53 | //===========结束CG着色器语言编写模块===========
54 | ENDCG
55 | }
56 | }
57 | }
58 |
--------------------------------------------------------------------------------
/Volume 12 可编程Shader初步 & 标准漫反射可编程Shader/4.Adjustable RGB Cube.shader:
--------------------------------------------------------------------------------
1 | //RGB立方体单项可调
2 |
3 | Shader "浅墨Shader编程/Volume12/4.RGB cube v2"
4 | {
5 | //------------------------------------【属性值】------------------------------------
6 | Properties
7 | {
8 | //单项颜色调节变量
9 | _ColorValue("Color", Range(0.0, 1.0)) = 0.6
10 | }
11 |
12 | //------------------------------------【唯一的子着色器】------------------------------------
13 | SubShader
14 | {
15 | //--------------------------------唯一的通道-------------------------------
16 | Pass
17 | {
18 | //===========开启CG着色器语言编写模块============
19 | CGPROGRAM
20 |
21 | //编译指令:告知编译器顶点和片段着色函数的名称
22 | #pragma vertex vert
23 | #pragma fragment frag
24 |
25 | //顶点着色器输出结构
26 | struct vertexOutput
27 | {
28 | float4 positon : SV_POSITION;
29 | float4 color : TEXCOORD0;
30 | };
31 |
32 | //变量声明
33 | uniform float _ColorValue;
34 |
35 | //--------------------------------【顶点着色函数】-----------------------------
36 | // 输入:POSITION语义
37 | // 输出:顶点输出结构体
38 | //---------------------------------------------------------------------------------
39 | vertexOutput vert(float4 vertexPos : POSITION)
40 | {
41 | //实例化一个vertexOutput输出结构
42 | vertexOutput output;
43 |
44 | //坐标系变换:将三维空间中的坐标投影到二维窗口
45 | output.positon = mul(UNITY_MATRIX_MVP, vertexPos);
46 | //输出颜色为顶点位置加上一个颜色偏移量
47 | output.color = vertexPos + float4(_ColorValue, _ColorValue, _ColorValue, 0.0);
48 |
49 | //返回最终的值
50 | return output;
51 | }
52 |
53 | //--------------------------------【片段着色函数】-----------------------------
54 | // 输入:vertexOutput结构体
55 | // 输出:COLOR语义(颜色值)
56 | //---------------------------------------------------------------------------------
57 | float4 frag(vertexOutput input) : COLOR
58 | {
59 | //直接返回输入的颜色值
60 | return input.color;
61 | }
62 |
63 | //===========结束CG着色器语言编写模块===========
64 | ENDCG
65 | }
66 | }
67 | }
68 |
--------------------------------------------------------------------------------
/Volume 12 可编程Shader初步 & 标准漫反射可编程Shader/5.RGB Adjustable RGB Cube.shader:
--------------------------------------------------------------------------------
1 | //RGB立方体三色可调
2 |
3 | Shader "浅墨Shader编程/Volume12/5.RGB cube v3"
4 | {
5 | //------------------------------------【属性值】------------------------------------
6 | Properties
7 | {
8 | //红色
9 | _ColorValueRed("ColorRed", Range(0.0, 1.0)) = 0.2
10 | //绿色
11 | _ColorValueGreen("ColorGreen", Range(0.0, 1.0)) = 0.5
12 | //蓝色
13 | _ColorValueBlue("ColorBlue", Range(0.0, 1.0)) = 0.6
14 | }
15 |
16 | //------------------------------------【唯一的子着色器】------------------------------------
17 | SubShader
18 | {
19 | //--------------------------------唯一的通道-------------------------------
20 | Pass
21 | {
22 | //===========开启CG着色器语言编写模块============
23 | CGPROGRAM
24 |
25 | //编译指令:告知编译器顶点和片段着色函数的名称
26 | #pragma vertex vert
27 | #pragma fragment frag
28 |
29 | //顶点着色器输出结构
30 | struct vertexOutput
31 | {
32 | float4 positon : SV_POSITION;
33 | float4 color : TEXCOORD0;
34 | };
35 |
36 | //变量声明
37 | uniform float _ColorValueRed;
38 | uniform float _ColorValueGreen;
39 | uniform float _ColorValueBlue;
40 |
41 | //--------------------------------【顶点着色函数】-----------------------------
42 | // 输入:POSITION语义
43 | // 输出:顶点输出结构体
44 | //---------------------------------------------------------------------------------
45 | vertexOutput vert(float4 vertexPos : POSITION)
46 | {
47 | //实例化一个vertexOutput输出结构
48 | vertexOutput output;
49 |
50 | //坐标系变换:将三维空间中的坐标投影到二维窗口
51 | output.positon = mul(UNITY_MATRIX_MVP, vertexPos);
52 | //输出颜色为顶点位置加上一个颜色偏移量
53 | output.color = vertexPos + float4(_ColorValueRed, _ColorValueGreen, _ColorValueBlue, 0.0);
54 |
55 | //返回最终的值
56 | return output;
57 | }
58 |
59 | //--------------------------------【片段着色函数】-----------------------------
60 | // 输入:vertexOutput结构体
61 | // 输出:COLOR语义(颜色值)
62 | //---------------------------------------------------------------------------------
63 | float4 frag(vertexOutput input) : COLOR
64 | {
65 | //直接返回输入的颜色值
66 | return input.color;
67 | }
68 |
69 | //===========结束CG着色器语言编写模块===========
70 | ENDCG
71 | }
72 | }
73 | }
74 |
--------------------------------------------------------------------------------
/Volume 12 可编程Shader初步 & 标准漫反射可编程Shader/6.Diffuse(Lambert) Shader.shader:
--------------------------------------------------------------------------------
1 |
2 | Shader "浅墨Shader编程/Volume12/Diffuse(Lambert) Shader"
3 | {
4 | //------------------------------------【属性值】------------------------------------
5 | Properties
6 | {
7 | //颜色值
8 | _Color("Main Color", Color) = (1, 1, 1, 1)
9 |
10 | }
11 |
12 | //------------------------------------【唯一的子着色器】------------------------------------
13 | SubShader
14 | {
15 | //渲染类型设置:不透明
16 | Tags{ "RenderType" = "Opaque" }
17 | //设置光照模式:ForwardBase
18 | Tags{ "LightingMode" = "ForwardBase" }
19 | //细节层次设为:200
20 | LOD 200
21 |
22 | //--------------------------------唯一的通道-------------------------------
23 | Pass
24 | {
25 | //===========开启CG着色器语言编写模块===========
26 | CGPROGRAM
27 |
28 | //编译指令:告知编译器顶点和片段着色函数的名称
29 | #pragma vertex vert
30 | #pragma fragment frag
31 |
32 | //包含头文件
33 | #include "UnityCG.cginc"
34 |
35 | //顶点着色器输入结构
36 | struct appdata
37 | {
38 | float4 vertex : POSITION;//顶点位置
39 | float3 normal : NORMAL;//法线向量坐标
40 | };
41 |
42 | //顶点着色器输出结构
43 | struct v2f
44 | {
45 | float4 position : SV_POSITION;//像素位置
46 | float3 normal : NORMAL;//法线向量坐标
47 | };
48 |
49 | //变量声明
50 | float4 _LightColor0;
51 | float4 _Color;
52 |
53 | //--------------------------------【顶点着色函数】-----------------------------
54 | // 输入:顶点输入结构体
55 | // 输出:顶点输出结构体
56 | //---------------------------------------------------------------------------------
57 | v2f vert(appdata input)
58 | {
59 | //【1】声明一个输出结构对象
60 | v2f output;
61 |
62 | //【2】填充此输出结构
63 | //输出的顶点位置为模型视图投影矩阵乘以顶点位置,也就是将三维空间中的坐标投影到了二维窗口
64 | output.position = mul(UNITY_MATRIX_MVP, input.vertex);
65 | //获取顶点在世界空间中的法线向量坐标
66 | output.normal = mul(float4(input.normal, 0.0), _World2Object).xyz;
67 |
68 | //【3】返回此输出结构对象
69 | return output;
70 | }
71 |
72 |
73 | //--------------------------------【片段着色函数】-----------------------------
74 | // 输入:顶点输出结构体
75 | // 输出:float4型的像素颜色值
76 | //---------------------------------------------------------------------------------
77 | fixed4 frag(v2f input) : COLOR
78 | {
79 | //【1】先准备好需要的参数
80 | //获取法线的方向
81 | float3 normalDirection = normalize(input.normal);
82 | //获取入射光线的值与方向
83 | float3 lightDirection = normalize(_WorldSpaceLightPos0.xyz);
84 |
85 | //【2】计算出漫反射颜色值 Diffuse=LightColor * MainColor * max(0,dot(N,L))
86 | float3 diffuse = _LightColor0.rgb * _Color.rgb * max(0.0, dot(normalDirection, lightDirection));
87 |
88 | //【3】合并漫反射颜色值与环境光颜色值
89 | float4 DiffuseAmbient = float4(diffuse, 1.0) + UNITY_LIGHTMODEL_AMBIENT;
90 |
91 | //【4】将漫反射-环境光颜色值乘上纹理颜色,并返回
92 | return DiffuseAmbient;
93 | }
94 |
95 | //===========结束CG着色器语言编写模块===========
96 | ENDCG
97 |
98 | }
99 | }
100 | }
101 |
--------------------------------------------------------------------------------
/Volume 12 可编程Shader初步 & 标准漫反射可编程Shader/7.Diffuse(Lambert) Shader with Texture.shader:
--------------------------------------------------------------------------------
1 |
2 | Shader "浅墨Shader编程/Volume12/7.Diffuse(Lambert) Shader with Texture"
3 | {
4 | //------------------------------------【属性值】------------------------------------
5 | Properties
6 | {
7 | //主纹理
8 | _MainTex("Texture", 2D) = "white"{}
9 | //主颜色值
10 | _Color("Main Color", Color) = (1, 1, 1, 1)
11 |
12 | }
13 |
14 | //------------------------------------【唯一的子着色器】------------------------------------
15 | SubShader
16 | {
17 | //渲染类型设置:不透明
18 | Tags{ "RenderType" = "Opaque" }
19 | //设置光照模式:ForwardBase
20 | Tags{ "LightingMode" = "ForwardBase" }
21 | //细节层次设为:200
22 | LOD 200
23 |
24 | //--------------------------------唯一的通道-------------------------------
25 | Pass
26 | {
27 | //===========开启CG着色器语言编写模块===========
28 | CGPROGRAM
29 |
30 | //编译指令:告知编译器顶点和片段着色函数的名称
31 | #pragma vertex vert
32 | #pragma fragment frag
33 |
34 | //包含头文件
35 | #include "UnityCG.cginc"
36 |
37 | //顶点着色器输入结构
38 | struct appdata
39 | {
40 | float4 vertex : POSITION;//顶点位置
41 | float3 normal : NORMAL;//法线向量坐标
42 | float2 texcoord : TEXCOORD0;//纹理坐标
43 | };
44 |
45 | //顶点着色器输出结构
46 | struct v2f
47 | {
48 | float4 positon : SV_POSITION;//像素位置
49 | float3 normal : NORMAL;//法线向量坐标
50 | float2 texcoord : TEXCOORD0;//纹理坐标
51 | };
52 |
53 | //变量声明
54 | float4 _LightColor0;
55 | float4 _Color;
56 | sampler2D _MainTex;
57 |
58 |
59 | //--------------------------------【顶点着色函数】-----------------------------
60 | // 输入:顶点输入结构体
61 | // 输出:顶点输出结构体
62 | //---------------------------------------------------------------------------------
63 | v2f vert(appdata input)
64 | {
65 | //【1】声明一个输出结构对象
66 | v2f output;
67 |
68 | //【2】填充此输出结构
69 | //输出的顶点位置为模型视图投影矩阵乘以顶点位置,也就是将三维空间中的坐标投影到了二维窗口
70 | output.positon = mul(UNITY_MATRIX_MVP, input.vertex);
71 | //获取顶点在世界空间中的法线向量坐标
72 | output.normal = mul(float4(input.normal, 0.0), _World2Object).xyz;
73 | //输出的纹理坐标也就是输入的纹理坐标
74 | output.texcoord = input.texcoord;
75 |
76 | //【3】返回此输出结构对象
77 | return output;
78 | }
79 |
80 | //--------------------------------【片段着色函数】-----------------------------
81 | // 输入:顶点输出结构体
82 | // 输出:float4型的像素颜色值
83 | //---------------------------------------------------------------------------------
84 | fixed4 frag(v2f input) : COLOR
85 | {
86 | //【1】先准备好需要的参数
87 | //获取纹理颜色
88 | float4 texColor = tex2D(_MainTex, input.texcoord);
89 | //获取法线的方向
90 | float3 normalDirection = normalize(input.normal);
91 | //获取入射光线的值与方向
92 | float3 lightDirection = normalize(_WorldSpaceLightPos0.xyz);
93 |
94 | //【2】计算出漫反射颜色值 Diffuse=LightColor * MainColor * max(0,dot(N,L))
95 | float3 diffuse = _LightColor0.rgb * _Color.rgb * max(0.0, dot(normalDirection, lightDirection));
96 |
97 | //【3】合并漫反射颜色值与环境光颜色值
98 | float4 DiffuseAmbient = float4(diffuse, 1.0) + UNITY_LIGHTMODEL_AMBIENT;
99 |
100 | //【4】将漫反射-环境光颜色值乘上纹理颜色,并返回
101 | return DiffuseAmbient* texColor;
102 | }
103 |
104 | //===========结束CG着色器语言编写模块===========
105 | ENDCG
106 | }
107 | }
108 | }
109 |
--------------------------------------------------------------------------------
/Volume 12 可编程Shader初步 & 标准漫反射可编程Shader/README.md:
--------------------------------------------------------------------------------
1 |
2 | #内容图示
3 |
4 | ##Volume 12 可编程Shader初步 & 漫反射可编程Shader
5 |
6 | ### 1.单色Shader
7 | 
8 |
9 |
10 | ###2.单色可调Shader的书写
11 | 
12 |
13 |
14 | ###4.颜色单项可调的RGB Cube
15 | 
16 |
17 | ###5.三色分量可调的RGB Cube
18 | 
19 |
20 |
21 | ### 6.单色可调的漫反射光照Shader书写
22 | 
23 |
24 |
25 | ### 7.可调颜色和自定义纹理的漫反射光照Shader
26 | 
27 |
28 | 下图是此漫反射Shader使用到皮卡丘模型上的效果图。
29 |
30 | 
31 |
32 | 
33 |
34 | 
--------------------------------------------------------------------------------
/Volume 13 单色透明Shader & 标准镜面高光Shader/1.SimpleAlphaShader.shader:
--------------------------------------------------------------------------------
1 | //透明单色Shader
2 |
3 |
4 | Shader "浅墨Shader编程/Volume13/1.SimpleAlphaShader"
5 | {
6 | //------------------------------------【唯一的子着色器】------------------------------------
7 | SubShader
8 | {
9 | //设置Queue为透明,在所有非透明几何体绘制之后再进行绘制
10 | Tags{ "Queue" = "Transparent" }
11 |
12 | Pass
13 | {
14 | //不写入深度缓冲,为了不遮挡住其他物体
15 | ZWrite Off
16 |
17 | //选取Alpha混合方式
18 | Blend SrcAlpha SrcAlpha
19 | //Blend SrcAlpha OneMinusSrcAlpha
20 |
21 | //===========开启CG着色器语言编写模块============
22 | CGPROGRAM
23 |
24 | //编译指令:告知编译器顶点和片段着色函数的名称
25 | #pragma vertex vert
26 | #pragma fragment frag
27 |
28 | //--------------------------------【顶点着色函数】-----------------------------
29 | // 输入:POSITION语义(坐标位置)
30 | // 输出:SV_POSITION语义(像素位置)
31 | //---------------------------------------------------------------------------------
32 | float4 vert(float4 vertexPos : POSITION) : SV_POSITION
33 | {
34 | //坐标系变换
35 | //输出的顶点位置(像素位置)为模型视图投影矩阵乘以顶点位置,也就是将三维空间中的坐标投影到了二维窗口
36 | return mul(UNITY_MATRIX_MVP, vertexPos);
37 | }
38 |
39 | //--------------------------------【片段着色函数】-----------------------------
40 | // 输入:无
41 | // 输出:COLOR语义(颜色值)
42 | //---------------------------------------------------------------------------------
43 | float4 frag(void) : COLOR
44 | {
45 | //返回单色
46 | return float4(0.3, 1.0, 0.1, 0.6);
47 | }
48 |
49 | //===========结束CG着色器语言编写模块===========
50 | ENDCG
51 | }
52 | }
53 | }
--------------------------------------------------------------------------------
/Volume 13 单色透明Shader & 标准镜面高光Shader/2.ColorChangeAlpha.shader:
--------------------------------------------------------------------------------
1 | //颜色可以调版单色透明Shader
2 |
3 |
4 | Shader "浅墨Shader编程/Volume13/2.ColorChangeAlpha"
5 | {
6 | //------------------------------------【属性值】------------------------------------
7 | Properties
8 | {
9 | //颜色值
10 | _ColorWithAlpha("ColorWithAlpha", Color) = (0.9, 0.1, 0.1, 0.5)
11 | }
12 |
13 | //------------------------------------【唯一的子着色器】------------------------------------
14 | SubShader
15 | {
16 | //设置Queue为透明,在所有非透明几何体绘制之后再进行绘制
17 | Tags{ "Queue" = "Transparent" }
18 |
19 | //--------------------------------唯一的通道-------------------------------
20 | Pass
21 | {
22 | //不写入深度缓冲,为了不遮挡住其他物体
23 | ZWrite Off
24 |
25 | //选取Alpha混合方式
26 | Blend SrcAlpha SrcAlpha
27 | //Blend SrcAlpha OneMinusSrcAlpha
28 |
29 | //===========开启CG着色器语言编写模块============
30 | CGPROGRAM
31 |
32 | //编译指令:告知编译器顶点和片段着色函数的名称
33 | #pragma vertex vert
34 | #pragma fragment frag
35 |
36 | //变量声明
37 | uniform float4 _ColorWithAlpha;
38 |
39 | //--------------------------------【顶点着色函数】-----------------------------
40 | // 输入:POSITION语义(坐标位置)
41 | // 输出:SV_POSITION语义(像素位置)
42 | //---------------------------------------------------------------------------------
43 | float4 vert(float4 vertexPos : POSITION) : SV_POSITION
44 | {
45 | //坐标系变换
46 | //输出的顶点位置(像素位置)为模型视图投影矩阵乘以顶点位置,也就是将三维空间中的坐标投影到了二维窗口
47 | return mul(UNITY_MATRIX_MVP, vertexPos);
48 | }
49 |
50 | //--------------------------------【片段着色函数】-----------------------------
51 | // 输入:无
52 | // 输出:COLOR语义(颜色值)
53 | //---------------------------------------------------------------------------------
54 | float4 frag(void) : COLOR
55 | {
56 | //返回自定义的RGBA颜色
57 | return _ColorWithAlpha;
58 | }
59 |
60 | //===========结束CG着色器语言编写模块===========
61 | ENDCG
62 | }
63 | }
64 | }
--------------------------------------------------------------------------------
/Volume 13 单色透明Shader & 标准镜面高光Shader/3.TwoSideColorChangeAlpha.shader:
--------------------------------------------------------------------------------
1 | //双面双色颜色可以调版透明Shader
2 |
3 | Shader "浅墨Shader编程/Volume13/3.TwoSideColorChangeAlpha"
4 | {
5 | //------------------------------------【属性值】------------------------------------
6 | Properties
7 | {
8 | //正面颜色值
9 | _ColorWithAlpha_Front("ColorWithAlpha_Front", Color) = (0.9, 0.1, 0.1, 0.5)
10 | //背面颜色值
11 | _ColorWithAlpha_Back("ColorWithAlpha_Back", Color) = (0.1, 0.3, 0.9, 0.5)
12 | }
13 |
14 | //------------------------------------【唯一的子着色器】------------------------------------
15 | SubShader
16 | {
17 | //设置Queue为透明,在所有非透明几何体绘制之后再进行绘制
18 | Tags{ "Queue" = "Transparent" }
19 |
20 | //------------------------【通道1:渲染正面】-------------------------
21 | Pass
22 | {
23 | //剔除背面,渲染正面
24 | Cull Back
25 | //不写入深度缓冲,为了不遮挡住其他物体
26 | ZWrite Off
27 |
28 | //选取Alpha混合方式
29 | Blend SrcAlpha OneMinusSrcAlpha
30 | //Blend SrcAlpha SrcAlpha
31 |
32 | //===========开启CG着色器语言编写模块============
33 | CGPROGRAM
34 |
35 | //编译指令:告知编译器顶点和片段着色函数的名称
36 | #pragma vertex vert
37 | #pragma fragment frag
38 |
39 | //变量声明
40 | uniform float4 _ColorWithAlpha_Front;
41 |
42 | //--------------------------------【顶点着色函数】-----------------------------
43 | // 输入:POSITION语义(坐标位置)
44 | // 输出:SV_POSITION语义(像素位置)
45 | //---------------------------------------------------------------------------------
46 | float4 vert(float4 vertexPos : POSITION) : SV_POSITION
47 | {
48 | //坐标系变换
49 | //输出的顶点位置(像素位置)为模型视图投影矩阵乘以顶点位置,也就是将三维空间中的坐标投影到了二维窗口
50 | return mul(UNITY_MATRIX_MVP, vertexPos);
51 | }
52 |
53 | //--------------------------------【片段着色函数】-----------------------------
54 | // 输入:无
55 | // 输出:COLOR语义(颜色值)
56 | //---------------------------------------------------------------------------------
57 | float4 frag(void) : COLOR
58 | {
59 | //返回自定义的RGBA颜色
60 | return _ColorWithAlpha_Front;
61 | }
62 |
63 | //===========结束CG着色器语言编写模块===========
64 | ENDCG
65 | }
66 |
67 | //------------------------【通道2:渲染背面】-------------------------
68 | Pass
69 | {
70 | //剔除正面,渲染背面
71 | Cull Front
72 |
73 | //不写入深度缓冲,为了不遮挡住其他物体
74 | ZWrite Off
75 |
76 | //选取Alpha混合方式
77 | Blend SrcAlpha OneMinusSrcAlpha
78 | //Blend SrcAlpha SrcAlpha
79 |
80 | //===========开启CG着色器语言编写模块============
81 | CGPROGRAM
82 |
83 | //编译指令:告知编译器顶点和片段着色函数的名称
84 | #pragma vertex vert
85 | #pragma fragment frag
86 |
87 | //变量声明
88 | uniform float4 _ColorWithAlpha_Back;
89 |
90 | //--------------------------------【顶点着色函数】-----------------------------
91 | // 输入:POSITION语义(坐标位置)
92 | // 输出:SV_POSITION语义(像素位置)
93 | //---------------------------------------------------------------------------------
94 | float4 vert(float4 vertexPos : POSITION) : SV_POSITION
95 | {
96 | //坐标系变换
97 | //输出的顶点位置(像素位置)为模型视图投影矩阵乘以顶点位置,也就是将三维空间中的坐标投影到了二维窗口
98 | return mul(UNITY_MATRIX_MVP, vertexPos);
99 | }
100 |
101 | //--------------------------------【片段着色函数】-----------------------------
102 | // 输入:无
103 | // 输出:COLOR语义(颜色值)
104 | //---------------------------------------------------------------------------------
105 | float4 frag(void) : COLOR
106 | {
107 | //返回自定义的RGBA颜色
108 | return _ColorWithAlpha_Back;
109 | }
110 |
111 | //===========结束CG着色器语言编写模块===========
112 | ENDCG
113 | }
114 | }
115 | }
--------------------------------------------------------------------------------
/Volume 13 单色透明Shader & 标准镜面高光Shader/4.Specular.shader:
--------------------------------------------------------------------------------
1 | //镜面反射Shader(specular shader )
2 |
3 | Shader "浅墨Shader编程/Volume13/4.Specular"
4 | {
5 | //------------------------------------【属性值】------------------------------------
6 | Properties
7 | {
8 | //主颜色
9 | _Color("Main Color", Color) = (1, 1, 1, 1)
10 | //镜面反射颜色
11 | _SpecColor("Specular Color", Color) = (1, 1, 1, 1)
12 | //镜面反射光泽度
13 | _SpecShininess("Specular Shininess", Range(1.0, 100.0)) = 10.0
14 | }
15 |
16 | //------------------------------------【唯一的子着色器】------------------------------------
17 | SubShader
18 | {
19 | //渲染类型设置:不透明
20 | Tags{ "RenderType" = "Opaque" }
21 |
22 |
23 | //--------------------------------唯一的通道-------------------------------
24 | Pass
25 | {
26 | //光照模型ForwardBase
27 | Tags{ "LightMode" = "ForwardBase" }
28 | //===========开启CG着色器语言编写模块===========
29 | CGPROGRAM
30 |
31 | //编译指令:告知编译器顶点和片段着色函数的名称
32 | #pragma vertex vert
33 | #pragma fragment frag
34 |
35 | //顶点着色器输入结构
36 | struct appdata
37 | {
38 | float4 vertex : POSITION;//顶点位置
39 | float3 normal : NORMAL;//法线向量坐标
40 | };
41 |
42 | //顶点着色器输出结构
43 | struct v2f
44 | {
45 | float4 pos : SV_POSITION;//像素位置
46 | float3 normal : NORMAL;//法线向量坐标
47 | float4 posWorld : TEXCOORD0;//在世界空间中的坐标位置
48 | };
49 |
50 |
51 | //变量的声明
52 | float4 _LightColor0;
53 | float4 _Color;
54 | float4 _SpecColor;
55 | float _SpecShininess;
56 |
57 | //--------------------------------【顶点着色函数】-----------------------------
58 | // 输入:顶点输入结构体
59 | // 输出:顶点输出结构体
60 | //---------------------------------------------------------------------------------
61 | //顶点着色函数
62 | v2f vert(appdata IN)
63 | {
64 | //【1】声明一个输出结构对象
65 | v2f OUT;
66 |
67 | //【2】填充此输出结构
68 | //输出的顶点位置为模型视图投影矩阵乘以顶点位置,也就是将三维空间中的坐标投影到了二维窗口
69 | OUT.pos = mul(UNITY_MATRIX_MVP, IN.vertex);
70 | //获得顶点在世界空间中的位置坐标
71 | OUT.posWorld = mul(_Object2World, IN.vertex);
72 | //获取顶点在世界空间中的法线向量坐标
73 | OUT.normal = mul(float4(IN.normal, 0.0), _World2Object).xyz;
74 |
75 | //【3】返回此输出结构对象
76 | return OUT;
77 | }
78 |
79 | //--------------------------------【片段着色函数】-----------------------------
80 | // 输入:顶点输出结构体
81 | // 输出:float4型的像素颜色值
82 | //---------------------------------------------------------------------------------
83 | fixed4 frag(v2f IN) : COLOR
84 | {
85 | //【1】先准备好需要的参数
86 | //获取法线的方向
87 | float3 normalDirection = normalize(IN.normal);
88 | //获取入射光线的方向
89 | float3 lightDirection = normalize(_WorldSpaceLightPos0.xyz);
90 | //获取视角方向
91 | float3 viewDirection = normalize(_WorldSpaceCameraPos - IN.posWorld.xyz);
92 |
93 | //【2】计算出漫反射颜色值 Diffuse=LightColor * MainColor * max(0,dot(N,L))
94 | float3 diffuse = _LightColor0.rgb * _Color.rgb * max(0.0, dot(normalDirection, lightDirection));
95 |
96 | //【3】计算镜面反射颜色值
97 | float3 specular;
98 | //若是法线方向和入射光方向大于180度,镜面反射值为0
99 | if (dot(normalDirection, lightDirection) < 0.0)
100 | {
101 | specular = float3(0.0, 0.0, 0.0);
102 | }
103 | //否则,根据公式进行计算 Specular =LightColor * SpecColor *pow(max(0,dot(R,V)),Shiness),R=reflect(-L,N)
104 | else
105 | {
106 | float3 reflectDirection = reflect(-lightDirection, normalDirection);
107 | specular = _LightColor0.rgb * _SpecColor.rgb * pow(max(0.0, dot(reflectDirection, viewDirection)), _SpecShininess);
108 | }
109 |
110 | //【4】合并漫反射、镜面反射、环境光的颜色值
111 | float4 diffuseSpecularAmbient = float4(diffuse, 1.0) + float4(specular, 1.0) + UNITY_LIGHTMODEL_AMBIENT;
112 |
113 | //【5】将漫反射-镜面反射-环境光的颜色值返回
114 | return diffuseSpecularAmbient;
115 | }
116 |
117 | //===========结束CG着色器语言编写模块===========
118 | ENDCG
119 | }
120 | }
121 | }
122 |
--------------------------------------------------------------------------------
/Volume 13 单色透明Shader & 标准镜面高光Shader/5.Specular with Texture.shader:
--------------------------------------------------------------------------------
1 | //支持纹理载入的specular shader
2 |
3 | Shader "浅墨Shader编程/Volume13/5.Specular with Shader"
4 | {
5 | //------------------------------------【属性值】------------------------------------
6 | Properties
7 | {
8 | //主纹理
9 | _MainTex("Texture", 2D) = "white" {}
10 | //主颜色
11 | _Color("Main Color", Color) = (1, 1, 1, 1)
12 | //镜面反射颜色
13 | _SpecColor("Specular Color", Color) = (1, 1, 1, 1)
14 | //镜面反射光泽度
15 | _SpecShininess("Specular Shininess", Range(1.0, 100.0)) = 10.0
16 | }
17 |
18 | //------------------------------------【唯一的子着色器】------------------------------------
19 | SubShader
20 | {
21 | //渲染类型设置:不透明
22 | Tags{ "RenderType" = "Opaque" }
23 |
24 | //--------------------------------唯一的通道-------------------------------
25 | Pass
26 | {
27 | //光照模型ForwardBase
28 | Tags{ "LightMode" = "ForwardBase" }
29 | //===========开启CG着色器语言编写模块===========
30 | CGPROGRAM
31 |
32 | //编译指令:告知编译器顶点和片段着色函数的名称
33 | #pragma vertex vert
34 | #pragma fragment frag
35 |
36 | //顶点着色器输入结构
37 | struct appdata
38 | {
39 | float4 vertex : POSITION;//顶点位置
40 | float3 normal : NORMAL;//法线向量坐标
41 | float2 texcoord : TEXCOORD0;//一级纹理坐标
42 | };
43 |
44 | //顶点着色器输出结构
45 | struct v2f
46 | {
47 | float4 pos : SV_POSITION;//像素位置
48 | float3 normal : NORMAL;//法线向量坐标
49 | float2 texcoord : TEXCOORD0;//一级纹理坐标
50 | float4 posWorld : TEXCOORD1;//在世界空间中的坐标位置
51 | };
52 |
53 | //变量的声明
54 | float4 _LightColor0;
55 | float4 _Color;
56 | sampler2D _MainTex;
57 | float4 _SpecColor;
58 | float _SpecShininess;
59 |
60 | //--------------------------------【顶点着色函数】-----------------------------
61 | // 输入:顶点输入结构体
62 | // 输出:顶点输出结构体
63 | //---------------------------------------------------------------------------------
64 | //顶点着色函数
65 | v2f vert(appdata IN)
66 | {
67 | //【1】声明一个输出结构对象
68 | v2f OUT;
69 |
70 | //【2】填充此输出结构
71 | //输出的顶点位置为模型视图投影矩阵乘以顶点位置,也就是将三维空间中的坐标投影到了二维窗口
72 | OUT.pos = mul(UNITY_MATRIX_MVP, IN.vertex);
73 | //获得顶点在世界空间中的位置坐标
74 | OUT.posWorld = mul(_Object2World, IN.vertex);
75 | //获取顶点在世界空间中的法线向量坐标
76 | OUT.normal = mul(float4(IN.normal, 0.0), _World2Object).xyz;
77 | //输出的纹理坐标也就是输入的纹理坐标
78 | OUT.texcoord = IN.texcoord;
79 |
80 | //【3】返回此输出结构对象
81 | return OUT;
82 | }
83 |
84 | //--------------------------------【片段着色函数】-----------------------------
85 | // 输入:顶点输出结构体
86 | // 输出:float4型的像素颜色值
87 | //---------------------------------------------------------------------------------
88 | fixed4 frag(v2f IN) : COLOR
89 | {
90 | //【1】先准备好需要的参数
91 | //获取纹理颜色
92 | float4 texColor = tex2D(_MainTex, IN.texcoord);
93 | //获取法线的方向
94 | float3 normalDirection = normalize(IN.normal);
95 | //获取入射光线的方向
96 | float3 lightDirection = normalize(_WorldSpaceLightPos0.xyz);
97 | //获取视角方向
98 | float3 viewDirection = normalize(_WorldSpaceCameraPos - IN.posWorld.xyz);
99 |
100 | //【2】计算出漫反射颜色值 Diffuse=LightColor * MainColor * max(0,dot(N,L))
101 | float3 diffuse = _LightColor0.rgb * _Color.rgb * max(0.0, dot(normalDirection, lightDirection));
102 |
103 | //【3】计算镜面反射颜色值
104 | float3 specular;
105 | //若是法线方向和入射光方向大于180度,镜面反射值为0
106 | if (dot(normalDirection, lightDirection) < 0.0)
107 | {
108 | specular = float3(0.0, 0.0, 0.0);
109 | }
110 | //否则,根据公式进行计算 Specular =LightColor * SpecColor *pow(max(0,dot(R,V)),Shiness),R=reflect(-L,N)
111 | else
112 | {
113 | float3 reflectDirection = reflect(-lightDirection, normalDirection);
114 | specular = _LightColor0.rgb * _SpecColor.rgb * pow(max(0.0, dot(reflectDirection, viewDirection)), _SpecShininess);
115 | }
116 |
117 | //【4】合并漫反射、镜面反射、环境光的颜色值
118 | float4 diffuseSpecularAmbient = float4(diffuse, 1.0) + float4(specular, 1.0) + UNITY_LIGHTMODEL_AMBIENT;
119 |
120 | //【5】将漫反射-镜面反射-环境光的颜色值乘以纹理颜色值之后返回
121 | return diffuseSpecularAmbient * texColor;
122 | }
123 |
124 | //===========结束CG着色器语言编写模块===========
125 | ENDCG
126 | }
127 | }
128 | }
129 |
--------------------------------------------------------------------------------
/Volume 13 单色透明Shader & 标准镜面高光Shader/README.md:
--------------------------------------------------------------------------------
1 |
2 | #内容图示
3 |
4 |
5 | ##Volume 13 单色透明Shader & 标准镜面高光Shader
6 |
7 | ###1.单色透明Shader
8 | 
9 |
10 |
11 | ###2.颜色可以调版单色透明Shader
12 | 
13 |
14 |
15 | ###3.双面双色颜色可以调版透明Shader
16 | 
17 | 从物体外部看:
18 |
19 | 
20 |
21 | 从物体内部看:
22 |
23 | 
24 |
25 | ###4.镜面反射(Specular)Shader
26 | 
27 |
28 |
29 | ###5.带纹理载入的specular shader
30 | 
31 |
32 | 将此Shader施于妙蛙草的模型之上,得到的便是如端游《剑灵》一般油腻腻的画风感觉:
33 |
34 | 
35 |
36 | 
--------------------------------------------------------------------------------
/Volume 14 边缘发光Shader(Rim Shader)的两种实现形态/BasicRimShader.shader:
--------------------------------------------------------------------------------
1 |
2 |
3 | Shader "Learning Unity Shader/Lecture 14/Basic Rim Shader"
4 | {
5 | //-----------------------------------【属性 || Properties】------------------------------------------
6 | Properties
7 | {
8 | //主颜色 || Main Color
9 | _MainColor("【主颜色】Main Color", Color) = (0.5,0.5,0.5,1)
10 | //漫反射纹理 || Diffuse Texture
11 | _TextureDiffuse("【漫反射纹理】Texture Diffuse", 2D) = "white" {}
12 | //边缘发光颜色 || Rim Color
13 | _RimColor("【边缘发光颜色】Rim Color", Color) = (0.5,0.5,0.5,1)
14 | //边缘发光强度 ||Rim Power
15 | _RimPower("【边缘发光强度】Rim Power", Range(0.0, 36)) = 0.1
16 | //边缘发光强度系数 || Rim Intensity Factor
17 | _RimIntensity("【边缘发光强度系数】Rim Intensity", Range(0.0, 100)) = 3
18 | }
19 |
20 | //----------------------------------【子着色器 || SubShader】---------------------------------------
21 | SubShader
22 | {
23 | //渲染类型为Opaque,不透明 || RenderType Opaque
24 | Tags
25 | {
26 | "RenderType" = "Opaque"
27 | }
28 |
29 | //---------------------------------------【唯一的通道 || Pass】------------------------------------
30 | Pass
31 | {
32 | //设定通道名称 || Set Pass Name
33 | Name "ForwardBase"
34 |
35 | //设置光照模式 || LightMode ForwardBase
36 | Tags
37 | {
38 | "LightMode" = "ForwardBase"
39 | }
40 |
41 | //-------------------------开启CG着色器编程语言段 || Begin CG Programming Part----------------------
42 | CGPROGRAM
43 |
44 | //【1】指定顶点和片段着色函数名称 || Set the name of vertex and fragment shader function
45 | #pragma vertex vert
46 | #pragma fragment frag
47 |
48 | //【2】头文件包含 || include
49 | #include "UnityCG.cginc"
50 | #include "AutoLight.cginc"
51 |
52 | //【3】指定Shader Model 3.0 || Set Shader Model 3.0
53 | #pragma target 3.0
54 |
55 | //【4】变量声明 || Variable Declaration
56 | //系统光照颜色
57 | uniform float4 _LightColor0;
58 | //主颜色
59 | uniform float4 _MainColor;
60 | //漫反射纹理
61 | uniform sampler2D _TextureDiffuse;
62 | //漫反射纹理_ST后缀版
63 | uniform float4 _TextureDiffuse_ST;
64 | //边缘光颜色
65 | uniform float4 _RimColor;
66 | //边缘光强度
67 | uniform float _RimPower;
68 | //边缘光强度系数
69 | uniform float _RimIntensity;
70 |
71 | //【5】顶点输入结构体 || Vertex Input Struct
72 | struct VertexInput
73 | {
74 | //顶点位置 || Vertex position
75 | float4 vertex : POSITION;
76 | //法线向量坐标 || Normal vector coordinates
77 | float3 normal : NORMAL;
78 | //一级纹理坐标 || Primary texture coordinates
79 | float4 texcoord : TEXCOORD0;
80 | };
81 |
82 | //【6】顶点输出结构体 || Vertex Output Struct
83 | struct VertexOutput
84 | {
85 | //像素位置 || Pixel position
86 | float4 pos : SV_POSITION;
87 | //一级纹理坐标 || Primary texture coordinates
88 | float4 texcoord : TEXCOORD0;
89 | //法线向量坐标 || Normal vector coordinates
90 | float3 normal : NORMAL;
91 | //世界空间中的坐标位置 || Coordinate position in world space
92 | float4 posWorld : TEXCOORD1;
93 | //创建光源坐标,用于内置的光照 || Function in AutoLight.cginc to create light coordinates
94 | LIGHTING_COORDS(3,4)
95 | };
96 |
97 | //【7】顶点着色函数 || Vertex Shader Function
98 | VertexOutput vert(VertexInput v)
99 | {
100 | //【1】声明一个顶点输出结构对象 || Declares a vertex output structure object
101 | VertexOutput o;
102 |
103 | //【2】填充此输出结构 || Fill the output structure
104 | //将输入纹理坐标赋值给输出纹理坐标
105 | o.texcoord = v.texcoord;
106 | //获取顶点在世界空间中的法线向量坐标
107 | o.normal = mul(float4(v.normal,0), _World2Object).xyz;
108 | //获得顶点在世界空间中的位置坐标
109 | o.posWorld = mul(_Object2World, v.vertex);
110 | //获取像素位置
111 | o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
112 |
113 | //【3】返回此输出结构对象 || Returns the output structure
114 | return o;
115 | }
116 |
117 | //【8】片段着色函数 || Fragment Shader Function
118 | fixed4 frag(VertexOutput i) : COLOR
119 | {
120 | //【8.1】方向参数准备 || Direction
121 | //视角方向
122 | float3 ViewDirection = normalize(_WorldSpaceCameraPos.xyz - i.posWorld.xyz);
123 | //法线方向
124 | float3 Normalection = normalize(i.normal);
125 | //光照方向
126 | float3 LightDirection = normalize(_WorldSpaceLightPos0.xyz);
127 |
128 | //【8.2】计算光照的衰减 || Lighting attenuation
129 | //衰减值
130 | float Attenuation = LIGHT_ATTENUATION(i);
131 | //衰减后颜色值
132 | float3 AttenColor = Attenuation * _LightColor0.xyz;
133 |
134 | //【8.3】计算漫反射 || Diffuse
135 | float NdotL = dot(Normalection, LightDirection);
136 | float3 Diffuse = max(0.0, NdotL) * AttenColor + UNITY_LIGHTMODEL_AMBIENT.xyz;
137 |
138 | //【8.4】准备自发光参数 || Emissive
139 | //计算边缘强度
140 | half Rim = 1.0 - max(0, dot(i.normal, ViewDirection));
141 | //计算出边缘自发光强度
142 | float3 Emissive = _RimColor.rgb * pow(Rim,_RimPower) *_RimIntensity;
143 |
144 | //【8.5】计在最终颜色中加入自发光颜色 || Calculate the final color
145 | //最终颜色 = (漫反射系数 x 纹理颜色 x rgb颜色)+自发光颜色 || Final Color=(Diffuse x Texture x rgbColor)+Emissive
146 | float3 finalColor = Diffuse * (tex2D(_TextureDiffuse,TRANSFORM_TEX(i.texcoord.rg, _TextureDiffuse)).rgb*_MainColor.rgb) + Emissive;
147 |
148 | //【8.6】返回最终颜色 || Return final color
149 | return fixed4(finalColor,1);
150 | }
151 |
152 | //-------------------结束CG着色器编程语言段 || End CG Programming Part------------------
153 | ENDCG
154 | }
155 | }
156 |
157 | //后备着色器为普通漫反射 || Fallback use Diffuse
158 | FallBack "Diffuse"
159 | }
160 |
--------------------------------------------------------------------------------
/Volume 14 边缘发光Shader(Rim Shader)的两种实现形态/README.md:
--------------------------------------------------------------------------------
1 |
2 | ##Volume 14.边缘发光Shader(Rim Shader)的两种实现形态
3 | ##Two Way to Write Rim Shader
4 |
5 | ###1
6 | 
7 |
8 | ###2
9 | 
10 |
11 | ###3
12 | 
13 |
14 | ###4
15 | 
16 |
17 | ###5
18 | 
19 |
--------------------------------------------------------------------------------
/Volume 14 边缘发光Shader(Rim Shader)的两种实现形态/SurfaceRimShader.shader:
--------------------------------------------------------------------------------
1 |
2 |
3 | Shader "Learning Unity Shader/Lecture 14/Surface Rim Shader"
4 | {
5 | //-----------------------------------【属性 || Properties】------------------------------------------
6 | Properties
7 | {
8 | //主颜色 || Main Color
9 | _MainColor("【主颜色】Main Color", Color) = (0.5,0.5,0.5,1)
10 | //漫反射纹理 || Diffuse Texture
11 | _MainTex("【纹理】Texture", 2D) = "white" {}
12 | //凹凸纹理 || Bump Texture
13 | _BumpMap("【凹凸纹理】Bumpmap", 2D) = "bump" {}
14 | //边缘发光颜色 || Rim Color
15 | _RimColor("【边缘发光颜色】Rim Color", Color) = (0.17,0.36,0.81,0.0)
16 | //边缘发光强度 ||Rim Power
17 | _RimPower("【边缘颜色强度】Rim Power", Range(0.6,36.0)) = 8.0
18 | //边缘发光强度系数 || Rim Intensity Factor
19 | _RimIntensity("【边缘颜色强度系数】Rim Intensity", Range(0.0,100.0)) = 1.0
20 | }
21 |
22 | //----------------------------------【子着色器 || SubShader】---------------------------------------
23 | SubShader
24 | {
25 | //渲染类型为Opaque,不透明 || RenderType Opaque
26 | Tags
27 | {
28 | "RenderType" = "Opaque"
29 | }
30 |
31 | //-------------------------开启CG着色器编程语言段 || Begin CG Programming Part----------------------
32 | CGPROGRAM
33 |
34 | //【1】声明使用兰伯特光照模式 ||Using the Lambert light mode
35 | #pragma surface surf Lambert
36 |
37 | //【2】定义输入结构 || Input Struct
38 | struct Input
39 | {
40 | //纹理贴图 || Texture
41 | float2 uv_MainTex;
42 | //法线贴图 || Bump Texture
43 | float2 uv_BumpMap;
44 | //观察方向 || Observation direction
45 | float3 viewDir;
46 | };
47 |
48 | //【3】变量声明 || Variable Declaration
49 | //边缘颜色
50 | float4 _MainColor;
51 | //主纹理
52 | sampler2D _MainTex;
53 | //凹凸纹理
54 | sampler2D _BumpMap;
55 | //边缘颜色
56 | float4 _RimColor;
57 | //边缘颜色强度
58 | float _RimPower;
59 | //边缘颜色强度
60 | float _RimIntensity;
61 |
62 | //【4】表面着色函数的编写 || Writing the surface shader function
63 | void surf(Input IN, inout SurfaceOutput o)
64 | {
65 | //表面反射颜色为纹理颜色
66 | o.Albedo = tex2D(_MainTex, IN.uv_MainTex).rgb*_MainColor.rgb;
67 | //表面法线为凹凸纹理的颜色
68 | o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
69 | //边缘颜色
70 | half rim = 1.0 - saturate(dot(normalize(IN.viewDir), o.Normal));
71 | //计算出边缘颜色强度系数
72 | o.Emission = _RimColor.rgb * pow(rim, _RimPower)*_RimIntensity;
73 | }
74 |
75 | //-------------------结束CG着色器编程语言段 || End CG Programming Part------------------
76 | ENDCG
77 | }
78 |
79 | //后备着色器为普通漫反射 || Fallback use Diffuse
80 | Fallback "Diffuse"
81 | }
--------------------------------------------------------------------------------
/Volume 15 屏幕高斯模糊(Gaussian Blur)特效的实现/README.md:
--------------------------------------------------------------------------------
1 | ## Volume 15.屏幕高斯模糊(Gaussian Blur)后期特效的实现
2 | ## Gaussian Blur Post Effect
3 |
4 |
5 |
6 | ### 1
7 |
8 | 
9 |
10 |
11 |
12 | ### 2
13 | 
14 |
15 |
16 | ### 3
17 | 
18 |
--------------------------------------------------------------------------------
/Volume 15 屏幕高斯模糊(Gaussian Blur)特效的实现/RapidBlurEffect.cs:
--------------------------------------------------------------------------------
1 |
2 | using UnityEngine;
3 | using System.Collections;
4 |
5 | //设置在编辑模式下也执行该脚本
6 | [ExecuteInEditMode]
7 | //添加选项到菜单中
8 | [AddComponentMenu("Learning Unity Shader/Lecture 15/RapidBlurEffect")]
9 | public class RapidBlurEffect : MonoBehaviour
10 | {
11 | //-------------------变量声明部分-------------------
12 | #region Variables
13 |
14 | //指定Shader名称
15 | private string ShaderName = "Learning Unity Shader/Lecture 15/RapidBlurEffect";
16 |
17 | //着色器和材质实例
18 | public Shader CurShader;
19 | private Material CurMaterial;
20 |
21 | //几个用于调节参数的中间变量
22 | public static int ChangeValue;
23 | public static float ChangeValue2;
24 | public static int ChangeValue3;
25 |
26 | //降采样次数
27 | [Range(0, 6), Tooltip("[降采样次数]向下采样的次数。此值越大,则采样间隔越大,需要处理的像素点越少,运行速度越快。")]
28 | public int DownSampleNum = 2;
29 | //模糊扩散度
30 | [Range(0.0f, 20.0f), Tooltip("[模糊扩散度]进行高斯模糊时,相邻像素点的间隔。此值越大相邻像素间隔越远,图像越模糊。但过大的值会导致失真。")]
31 | public float BlurSpreadSize = 3.0f;
32 | //迭代次数
33 | [Range(0, 8), Tooltip("[迭代次数]此值越大,则模糊操作的迭代次数越多,模糊效果越好,但消耗越大。")]
34 | public int BlurIterations = 3;
35 |
36 | #endregion
37 |
38 | //-------------------------材质的get&set----------------------------
39 | #region MaterialGetAndSet
40 | Material material
41 | {
42 | get
43 | {
44 | if (CurMaterial == null)
45 | {
46 | CurMaterial = new Material(CurShader);
47 | CurMaterial.hideFlags = HideFlags.HideAndDontSave;
48 | }
49 | return CurMaterial;
50 | }
51 | }
52 | #endregion
53 |
54 | #region Functions
55 | //-----------------------------------------【Start()函数】---------------------------------------------
56 | // 说明:此函数仅在Update函数第一次被调用前被调用
57 | //--------------------------------------------------------------------------------------------------------
58 | void Start()
59 | {
60 | //依次赋值
61 | ChangeValue = DownSampleNum;
62 | ChangeValue2 = BlurSpreadSize;
63 | ChangeValue3 = BlurIterations;
64 |
65 | //找到当前的Shader文件
66 | CurShader = Shader.Find(ShaderName);
67 |
68 | //判断当前设备是否支持屏幕特效
69 | if (!SystemInfo.supportsImageEffects)
70 | {
71 | enabled = false;
72 | return;
73 | }
74 | }
75 |
76 | //-------------------------------------【OnRenderImage()函数】------------------------------------
77 | // 说明:此函数在当完成所有渲染图片后被调用,用来渲染图片后期效果
78 | //--------------------------------------------------------------------------------------------------------
79 | void OnRenderImage(RenderTexture sourceTexture, RenderTexture destTexture)
80 | {
81 | //着色器实例不为空,就进行参数设置
82 | if (CurShader != null)
83 | {
84 | //【0】参数准备
85 | //根据向下采样的次数确定宽度系数。用于控制降采样后相邻像素的间隔
86 | float widthMod = 1.0f / (1.0f * (1 << DownSampleNum));
87 | //Shader的降采样参数赋值
88 | material.SetFloat("_DownSampleValue", BlurSpreadSize * widthMod);
89 | //设置渲染模式:双线性
90 | sourceTexture.filterMode = FilterMode.Bilinear;
91 | //通过右移,准备长、宽参数值
92 | int renderWidth = sourceTexture.width >> DownSampleNum;
93 | int renderHeight = sourceTexture.height >> DownSampleNum;
94 |
95 | // 【1】处理Shader的通道0,用于降采样 ||Pass 0,for down sample
96 | //准备一个缓存renderBuffer,用于准备存放最终数据
97 | RenderTexture renderBuffer = RenderTexture.GetTemporary(renderWidth, renderHeight, 0, sourceTexture.format);
98 | //设置渲染模式:双线性
99 | renderBuffer.filterMode = FilterMode.Bilinear;
100 | //拷贝sourceTexture中的渲染数据到renderBuffer,并仅绘制指定的pass0的纹理数据
101 | Graphics.Blit(sourceTexture, renderBuffer, material, 0);
102 |
103 | //【2】根据BlurIterations(迭代次数),来进行指定次数的迭代操作
104 | for (int i = 0; i < BlurIterations; i++)
105 | {
106 | //【2.1】Shader参数赋值
107 | //迭代偏移量参数
108 | float iterationOffs = (i * 1.0f);
109 | //Shader的降采样参数赋值
110 | material.SetFloat("_DownSampleValue", BlurSpreadSize * widthMod + iterationOffs);
111 |
112 | // 【2.2】处理Shader的通道1,垂直方向模糊处理 || Pass1,for vertical blur
113 | // 定义一个临时渲染的缓存tempBuffer
114 | RenderTexture tempBuffer = RenderTexture.GetTemporary(renderWidth, renderHeight, 0, sourceTexture.format);
115 | // 拷贝renderBuffer中的渲染数据到tempBuffer,并仅绘制指定的pass1的纹理数据
116 | Graphics.Blit(renderBuffer, tempBuffer, material, 1);
117 | // 清空renderBuffer
118 | RenderTexture.ReleaseTemporary(renderBuffer);
119 | // 将tempBuffer赋给renderBuffer,此时renderBuffer里面pass0和pass1的数据已经准备好
120 | renderBuffer = tempBuffer;
121 |
122 | // 【2.3】处理Shader的通道2,竖直方向模糊处理 || Pass2,for horizontal blur
123 | // 获取临时渲染纹理
124 | tempBuffer = RenderTexture.GetTemporary(renderWidth, renderHeight, 0, sourceTexture.format);
125 | // 拷贝renderBuffer中的渲染数据到tempBuffer,并仅绘制指定的pass2的纹理数据
126 | Graphics.Blit(renderBuffer, tempBuffer, CurMaterial, 2);
127 |
128 | //【2.4】得到pass0、pass1和pass2的数据都已经准备好的renderBuffer
129 | // 再次清空renderBuffer
130 | RenderTexture.ReleaseTemporary(renderBuffer);
131 | // 再次将tempBuffer赋给renderBuffer,此时renderBuffer里面pass0、pass1和pass2的数据都已经准备好
132 | renderBuffer = tempBuffer;
133 | }
134 |
135 | //拷贝最终的renderBuffer到目标纹理,并绘制所有通道的纹理到屏幕
136 | Graphics.Blit(renderBuffer, destTexture);
137 | //清空renderBuffer
138 | RenderTexture.ReleaseTemporary(renderBuffer);
139 |
140 | }
141 |
142 | //着色器实例为空,直接拷贝屏幕上的效果。此情况下是没有实现屏幕特效的
143 | else
144 | {
145 | //直接拷贝源纹理到目标渲染纹理
146 | Graphics.Blit(sourceTexture, destTexture);
147 | }
148 | }
149 |
150 |
151 | //-----------------------------------------【OnValidate()函数】--------------------------------------
152 | // 说明:此函数在编辑器中该脚本的某个值发生了改变后被调用
153 | //--------------------------------------------------------------------------------------------------------
154 | void OnValidate()
155 | {
156 | //将编辑器中的值赋值回来,确保在编辑器中值的改变立刻让结果生效
157 | ChangeValue = DownSampleNum;
158 | ChangeValue2 = BlurSpreadSize;
159 | ChangeValue3 = BlurIterations;
160 | }
161 |
162 | //-----------------------------------------【Update()函数】--------------------------------------
163 | // 说明:此函数每帧都会被调用
164 | //--------------------------------------------------------------------------------------------------------
165 | void Update()
166 | {
167 | //若程序在运行,进行赋值
168 | if (Application.isPlaying)
169 | {
170 | //赋值
171 | DownSampleNum = ChangeValue;
172 | BlurSpreadSize = ChangeValue2;
173 | BlurIterations = ChangeValue3;
174 | }
175 | //若程序没有在运行,去寻找对应的Shader文件
176 | #if UNITY_EDITOR
177 | if (Application.isPlaying != true)
178 | {
179 | CurShader = Shader.Find(ShaderName);
180 | }
181 | #endif
182 |
183 | }
184 |
185 | //-----------------------------------------【OnDisable()函数】---------------------------------------
186 | // 说明:当对象变为不可用或非激活状态时此函数便被调用
187 | //--------------------------------------------------------------------------------------------------------
188 | void OnDisable()
189 | {
190 | if (CurMaterial)
191 | {
192 | //立即销毁材质实例
193 | DestroyImmediate(CurMaterial);
194 | }
195 |
196 | }
197 |
198 | #endregion
199 |
200 | }
--------------------------------------------------------------------------------
/Volume 15 屏幕高斯模糊(Gaussian Blur)特效的实现/RapidBlurEffect.shader:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QianMo/Awesome-Unity-Shader/2e37041035cc4708aff39a5b4387cc8f47c728a8/Volume 15 屏幕高斯模糊(Gaussian Blur)特效的实现/RapidBlurEffect.shader
--------------------------------------------------------------------------------
/Volume 16 基于MatCap实现高真实感车漆Shader/CarPaint-MatCap.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QianMo/Awesome-Unity-Shader/2e37041035cc4708aff39a5b4387cc8f47c728a8/Volume 16 基于MatCap实现高真实感车漆Shader/CarPaint-MatCap.png
--------------------------------------------------------------------------------
/Volume 16 基于MatCap实现高真实感车漆Shader/CarPaintShader.shader:
--------------------------------------------------------------------------------
1 |
2 | Shader "ShaderPrac/Car Paint Shader"
3 | {
4 | Properties
5 | {
6 | //主颜色
7 | _MainColor("Main Color", Color) = (1.0, 1.0, 1.0, 1.0)
8 | //细节颜色
9 | _DetailColor("Detail Color", Color) = (1.0, 1.0, 1.0, 1.0)
10 | //细节纹理
11 | _DetailTex("Detail Textrue", 2D) = "white" {}
12 | //细节纹理深度偏移
13 | _DetailTexDepthOffset("Detail Textrue Depth Offset", Float) = 1.0
14 | //漫反射颜色
15 | _DiffuseColor("Diffuse Color", Color) = (0.0, 0.0, 0.0, 0.0)
16 | //漫反射纹理
17 | _DiffuseTex("Diffuse Textrue", 2D) = "white" {}
18 | //Material Capture纹理
19 | _MatCap("MatCap", 2D) = "white" {}
20 | //反射颜色
21 | _ReflectionColor("Reflection Color", Color) = (0.2, 0.2, 0.2, 1.0)
22 | //反射立方体贴图
23 | _ReflectionMap("Reflection Cube Map", Cube) = "" {}
24 | //反射强度
25 | _ReflectionStrength("Reflection Strength", Range(0.0, 1.0)) = 0.5
26 | }
27 |
28 | SubShader
29 | {
30 | Tags
31 | {
32 | "Queue" = "Geometry"
33 | "RenderType" = "Opaque"
34 | }
35 |
36 | Pass
37 | {
38 | Blend Off
39 | Cull Back
40 | ZWrite On
41 |
42 | CGPROGRAM
43 | #include "UnityCG.cginc"
44 | #pragma fragment frag
45 | #pragma vertex vert
46 |
47 | float4 _MainColor;
48 | float4 _DetailColor;
49 | sampler2D _DetailTex;
50 | float4 _DetailTex_ST;
51 | float _DetailTexDepthOffset;
52 | float4 _DiffuseColor;
53 | sampler2D _DiffuseTex;
54 | float4 _DiffuseTex_ST;
55 | sampler2D _MatCap;
56 | float4 _ReflectionColor;
57 | samplerCUBE _ReflectionMap;
58 | float _ReflectionStrength;
59 |
60 | //顶点输入结构
61 | struct VertexInput
62 | {
63 | float3 normal : NORMAL;
64 | float4 position : POSITION;
65 | float2 UVCoordsChannel1: TEXCOORD0;
66 | };
67 |
68 | //顶点输出(片元输入)结构
69 | struct VertexToFragment
70 | {
71 | float3 detailUVCoordsAndDepth : TEXCOORD0;
72 | float4 diffuseUVAndMatCapCoords : TEXCOORD1;
73 | float4 position : SV_POSITION;
74 | float3 worldSpaceReflectionVector : TEXCOORD2;
75 | };
76 |
77 | //------------------------------------------------------------
78 | // 顶点着色器
79 | //------------------------------------------------------------
80 | VertexToFragment vert(VertexInput input)
81 | {
82 | VertexToFragment output;
83 |
84 | //漫反射UV坐标准备:存储于TEXCOORD1的前两个坐标xy。
85 | output.diffuseUVAndMatCapCoords.xy = TRANSFORM_TEX(input.UVCoordsChannel1, _DiffuseTex);
86 |
87 | //MatCap坐标准备:将法线从模型空间转换到观察空间,存储于TEXCOORD1的后两个纹理坐标zw
88 | output.diffuseUVAndMatCapCoords.z = dot(normalize(UNITY_MATRIX_IT_MV[0].xyz), normalize(input.normal));
89 | output.diffuseUVAndMatCapCoords.w = dot(normalize(UNITY_MATRIX_IT_MV[1].xyz), normalize(input.normal));
90 | //归一化的法线值区间[-1,1]转换到适用于纹理的区间[0,1]
91 | output.diffuseUVAndMatCapCoords.zw = output.diffuseUVAndMatCapCoords.zw * 0.5 + 0.5;
92 |
93 | //坐标变换
94 | output.position = mul(UNITY_MATRIX_MVP, input.position);
95 |
96 | //细节纹理准备准备UV,存储于TEXCOORD0的前两个坐标xy
97 | output.detailUVCoordsAndDepth.xy = TRANSFORM_TEX(input.UVCoordsChannel1, _DetailTex);
98 |
99 | //深度信息准备,存储于TEXCOORD0的第三个坐标z
100 | output.detailUVCoordsAndDepth.z = output.position.z;
101 |
102 | //世界空间位置
103 | float3 worldSpacePosition = mul(unity_ObjectToWorld, input.position).xyz;
104 |
105 | //世界空间法线
106 | float3 worldSpaceNormal = normalize(mul((float3x3)unity_ObjectToWorld, input.normal));
107 |
108 | //世界空间反射向量
109 | output.worldSpaceReflectionVector = reflect(worldSpacePosition - _WorldSpaceCameraPos.xyz, worldSpaceNormal);
110 |
111 | return output;
112 | }
113 |
114 | //------------------------------------------------------------
115 | // 片元着色器
116 | //------------------------------------------------------------
117 | float4 frag(VertexToFragment input) : COLOR
118 | {
119 | //镜面反射颜色
120 | float3 reflectionColor = texCUBE(_ReflectionMap, input.worldSpaceReflectionVector).rgb * _ReflectionColor.rgb;
121 |
122 | //漫反射颜色
123 | float4 diffuseColor = tex2D(_DiffuseTex, input.diffuseUVAndMatCapCoords.xy) * _DiffuseColor;
124 |
125 | //主颜色
126 | float3 mainColor = lerp(lerp(_MainColor.rgb, diffuseColor.rgb, diffuseColor.a), reflectionColor, _ReflectionStrength);
127 |
128 | //细节纹理
129 | float3 detailMask = tex2D(_DetailTex, input.detailUVCoordsAndDepth.xy).rgb;
130 |
131 | //细节颜色
132 | float3 detailColor = lerp(_DetailColor.rgb, mainColor, detailMask);
133 |
134 | //细节颜色和主颜色进行插值,成为新的主颜色
135 | mainColor = lerp(detailColor, mainColor, saturate(input.detailUVCoordsAndDepth.z * _DetailTexDepthOffset));
136 |
137 | //从提供的MatCap纹理中,提取出对应光照信息
138 | float3 matCapColor = tex2D(_MatCap, input.diffuseUVAndMatCapCoords.zw).rgb;
139 |
140 | //最终颜色
141 | float4 finalColor=float4(mainColor * matCapColor * 2.0, _MainColor.a);
142 |
143 | return finalColor;
144 | }
145 |
146 | ENDCG
147 | }
148 | }
149 |
150 | Fallback "VertexLit"
151 | }
152 |
--------------------------------------------------------------------------------
/Volume 16 基于MatCap实现高真实感车漆Shader/MatCap Textrues/12719-normal.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QianMo/Awesome-Unity-Shader/2e37041035cc4708aff39a5b4387cc8f47c728a8/Volume 16 基于MatCap实现高真实感车漆Shader/MatCap Textrues/12719-normal.jpg
--------------------------------------------------------------------------------
/Volume 16 基于MatCap实现高真实感车漆Shader/MatCap Textrues/12719-v1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QianMo/Awesome-Unity-Shader/2e37041035cc4708aff39a5b4387cc8f47c728a8/Volume 16 基于MatCap实现高真实感车漆Shader/MatCap Textrues/12719-v1.jpg
--------------------------------------------------------------------------------
/Volume 16 基于MatCap实现高真实感车漆Shader/MatCap Textrues/23b9a7bd7706e4789f83aa0aa68970f1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QianMo/Awesome-Unity-Shader/2e37041035cc4708aff39a5b4387cc8f47c728a8/Volume 16 基于MatCap实现高真实感车漆Shader/MatCap Textrues/23b9a7bd7706e4789f83aa0aa68970f1.jpg
--------------------------------------------------------------------------------
/Volume 16 基于MatCap实现高真实感车漆Shader/MatCap Textrues/BAwGNg5CUAAE2F7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QianMo/Awesome-Unity-Shader/2e37041035cc4708aff39a5b4387cc8f47c728a8/Volume 16 基于MatCap实现高真实感车漆Shader/MatCap Textrues/BAwGNg5CUAAE2F7.png
--------------------------------------------------------------------------------
/Volume 16 基于MatCap实现高真实感车漆Shader/MatCap Textrues/b0a043453b8fd95de47df72b4372e9df.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QianMo/Awesome-Unity-Shader/2e37041035cc4708aff39a5b4387cc8f47c728a8/Volume 16 基于MatCap实现高真实感车漆Shader/MatCap Textrues/b0a043453b8fd95de47df72b4372e9df.jpg
--------------------------------------------------------------------------------
/Volume 16 基于MatCap实现高真实感车漆Shader/MatCap Textrues/ddf2919e5a5ed43ade15f46108eea632.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QianMo/Awesome-Unity-Shader/2e37041035cc4708aff39a5b4387cc8f47c728a8/Volume 16 基于MatCap实现高真实感车漆Shader/MatCap Textrues/ddf2919e5a5ed43ade15f46108eea632.jpg
--------------------------------------------------------------------------------
/Volume 16 基于MatCap实现高真实感车漆Shader/MatCap Textrues/e0ab9eab64c3500e0ff4ff1631d88c9e.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QianMo/Awesome-Unity-Shader/2e37041035cc4708aff39a5b4387cc8f47c728a8/Volume 16 基于MatCap实现高真实感车漆Shader/MatCap Textrues/e0ab9eab64c3500e0ff4ff1631d88c9e.jpg
--------------------------------------------------------------------------------
/Volume 16 基于MatCap实现高真实感车漆Shader/MatCap Textrues/e2204847f0b6ffa335bd94c74ef1a4d1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QianMo/Awesome-Unity-Shader/2e37041035cc4708aff39a5b4387cc8f47c728a8/Volume 16 基于MatCap实现高真实感车漆Shader/MatCap Textrues/e2204847f0b6ffa335bd94c74ef1a4d1.jpg
--------------------------------------------------------------------------------
/Volume 16 基于MatCap实现高真实感车漆Shader/MatCap Textrues/ee22ee998a0e12e674ff118006c807c5.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QianMo/Awesome-Unity-Shader/2e37041035cc4708aff39a5b4387cc8f47c728a8/Volume 16 基于MatCap实现高真实感车漆Shader/MatCap Textrues/ee22ee998a0e12e674ff118006c807c5.jpg
--------------------------------------------------------------------------------
/Volume 16 基于MatCap实现高真实感车漆Shader/MatCap Textrues/generator8.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QianMo/Awesome-Unity-Shader/2e37041035cc4708aff39a5b4387cc8f47c728a8/Volume 16 基于MatCap实现高真实感车漆Shader/MatCap Textrues/generator8.jpg
--------------------------------------------------------------------------------
/Volume 16 基于MatCap实现高真实感车漆Shader/MatCap Textrues/im1gres.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QianMo/Awesome-Unity-Shader/2e37041035cc4708aff39a5b4387cc8f47c728a8/Volume 16 基于MatCap实现高真实感车漆Shader/MatCap Textrues/im1gres.jpg
--------------------------------------------------------------------------------
/Volume 16 基于MatCap实现高真实感车漆Shader/MatCap Textrues/ima1ges.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QianMo/Awesome-Unity-Shader/2e37041035cc4708aff39a5b4387cc8f47c728a8/Volume 16 基于MatCap实现高真实感车漆Shader/MatCap Textrues/ima1ges.jpg
--------------------------------------------------------------------------------
/Volume 16 基于MatCap实现高真实感车漆Shader/MatCap Textrues/imagetes.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QianMo/Awesome-Unity-Shader/2e37041035cc4708aff39a5b4387cc8f47c728a8/Volume 16 基于MatCap实现高真实感车漆Shader/MatCap Textrues/imagetes.jpg
--------------------------------------------------------------------------------
/Volume 16 基于MatCap实现高真实感车漆Shader/MatCap Textrues/j0PUwxm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QianMo/Awesome-Unity-Shader/2e37041035cc4708aff39a5b4387cc8f47c728a8/Volume 16 基于MatCap实现高真实感车漆Shader/MatCap Textrues/j0PUwxm.png
--------------------------------------------------------------------------------
/Volume 16 基于MatCap实现高真实感车漆Shader/MatCap Textrues/static1.squarespace.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QianMo/Awesome-Unity-Shader/2e37041035cc4708aff39a5b4387cc8f47c728a8/Volume 16 基于MatCap实现高真实感车漆Shader/MatCap Textrues/static1.squarespace.jpg
--------------------------------------------------------------------------------
/Volume 16 基于MatCap实现高真实感车漆Shader/MatCap Textrues/u1rl.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QianMo/Awesome-Unity-Shader/2e37041035cc4708aff39a5b4387cc8f47c728a8/Volume 16 基于MatCap实现高真实感车漆Shader/MatCap Textrues/u1rl.jpg
--------------------------------------------------------------------------------
/Volume 16 基于MatCap实现高真实感车漆Shader/MatCap Textrues/url.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QianMo/Awesome-Unity-Shader/2e37041035cc4708aff39a5b4387cc8f47c728a8/Volume 16 基于MatCap实现高真实感车漆Shader/MatCap Textrues/url.jpg
--------------------------------------------------------------------------------