├── .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 | ![](https://raw.githubusercontent.com/QianMo/X-PostProcessing-Gallery/master/Media/XPL-Title-v2.jpg) 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 | ![](http://img.blog.csdn.net/20141103021350640?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 29 | 30 |




31 | 32 | 33 | ## Volume 02 Unity基本Shader框架写法 34 | 35 |
36 | 37 | ### 1.单色Shader 38 | 39 | ![](http://img.blog.csdn.net/20141109223715831?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 40 |


41 | 42 | ### 2.材质颜色&开启光照Shader 43 | 44 | ![](http://img.blog.csdn.net/20141109224045203?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 45 |


46 | 47 | ### 3.可调漫反射光Shader 48 | 49 | ![](http://img.blog.csdn.net/20141109224100284?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 50 |


51 | 52 | ### 4.光照材质完备beta版Shader 53 | 54 | ![](http://img.blog.csdn.net/20141109224312214?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 55 |


56 | 57 | ### 5.简单的纹理载入Shader 58 | 59 | ![](http://img.blog.csdn.net/20141109224434832?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 60 |


61 | 62 | ### 6.光照材质完备正式版Shader 63 | 64 | ![](http://img.blog.csdn.net/20141109224815432?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 65 |




66 | 67 | ## Volume 03 子着色器、通道与标签的写法 & 纹理混合 68 | 69 |
70 | 71 | ### 1. Alpha纹理混合 72 | 73 | ![](http://img.blog.csdn.net/20141116204632861?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 74 |


75 | 76 | ### 2.纹理的Alpha通道与自发光相混合 77 | 78 | ![](http://img.blog.csdn.net/20141116204751080?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 79 |


80 | 81 | ### 3. 纹理Alpha与自发光混合可调色版 82 | 83 | ![](http://img.blog.csdn.net/20141116204937062?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 84 |


85 | 86 | ### 4. 顶点光照+纹理Alpha自发光混合 87 | 88 | ![](http://img.blog.csdn.net/20141116205146640?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 89 | 90 |


91 | 92 | ### 5. 顶点光照+自发光混合+纹理混合 93 | 94 | ![](http://img.blog.csdn.net/20141116205243876?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 95 | 96 |




97 | 98 | ## Volume 04 剔除、深度测试、Alpha测试以及基本雾效 99 | 100 |
101 | 102 | ### 1.用剔除操作渲染对象背面 103 | 104 | ![](http://img.blog.csdn.net/20141214160445602?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 105 |
106 | 107 | ![](http://img.blog.csdn.net/20141214160605390?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 108 |
109 | 110 | ![](http://img.blog.csdn.net/20141214160616609?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 111 |


112 | 113 | ### 2. 用剔除操作渲染对象背面(第二版) 114 | 115 | ![](http://img.blog.csdn.net/20141214160749125?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 116 |
117 | 118 | ![](http://img.blog.csdn.net/20141214160808203?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 119 |
120 | 121 | ![](http://img.blog.csdn.net/20141214160827953?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 122 |


123 | 124 | ### 3.用剔除实现玻璃效果 125 | 126 | ![](http://img.blog.csdn.net/20141214161022500?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 127 | 128 |
129 | 130 | ![](http://img.blog.csdn.net/20141214161013889?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 131 | 132 |


133 | 134 | ### 4.基本Alpha测试 135 | 136 | ![](http://img.blog.csdn.net/20141214162420924?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 137 | 138 |


139 | 140 | ### 5.顶点光照+可调透明度 141 | 142 | ![](http://img.blog.csdn.net/20141214162622828?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 143 | 144 |


145 | 146 | ### 6.简单的植被Shader 147 | 148 | ![](http://img.blog.csdn.net/20141214163333125?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 149 | 150 |




151 | 152 | 153 | ## Volume 05 Unity中Shader的三种形态对比&混合操作 154 | 155 |
156 | 157 | ### 一:固定功能Shader示例 158 | 159 | ![](http://img.blog.csdn.net/20141221160256147?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 160 | 161 |
162 | 163 | ![](http://img.blog.csdn.net/20141221160310016?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 164 | 165 |


166 | 167 | ### 二:表面着色器Surface Shader示例 168 | 169 | ![](http://img.blog.csdn.net/20141221160637153?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 170 | 171 |
172 | 173 | ![](http://img.blog.csdn.net/20141221160849753?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 174 | 175 |


176 | 177 | ### 三:可编程Shader示例 178 | 179 | ![](http://img.blog.csdn.net/20141221161739031?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 180 | 181 |
182 | 183 | ![](http://img.blog.csdn.net/20141221162200269?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 184 | 185 |


186 | 187 | ### 1. 纹理载入Shader 188 | 189 | ![](http://img.blog.csdn.net/20141221164102640?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 190 | 191 |
192 | 193 | ![](http://img.blog.csdn.net/20141221164127104?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 194 | 195 |


196 | 197 | ### 2.基本blend使用 198 | 199 | ![](http://img.blog.csdn.net/20141221164617514?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 200 | 201 |
202 | 203 | ![](http://img.blog.csdn.net/20141221204604172?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 204 | 205 |


206 | 207 | ### 3.基本blend使用+颜色可调 208 | 209 | ![](http://img.blog.csdn.net/20141221164924262?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 210 | 211 |
212 | 213 | ![](http://img.blog.csdn.net/20141221165506636?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 214 | 215 |


216 | 217 | ### 4.基本blend使用+顶点光照 218 | 219 | ![](http://img.blog.csdn.net/20141221165658847?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 220 | 221 |
222 | 223 | ![](http://img.blog.csdn.net/20141221165945065?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 224 | 225 |


226 | 227 | ### 5.实现玻璃效果第二版 228 | 229 | ![](http://img.blog.csdn.net/20141221170257944?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 230 | 231 |
232 | 233 | ![](http://img.blog.csdn.net/20141221170358925?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 234 | 235 |


236 | 237 | ### 6.实现玻璃效果第三版 238 | 239 | ![](http://img.blog.csdn.net/20141221170508079?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 240 | 241 |
242 | 243 | ![](http://img.blog.csdn.net/20141221170537798?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 244 | 245 |




246 | 247 | 248 | 249 | ## Volume 06 表面着色器(Surface Shader)的写法(一) 250 | 251 |
252 | 253 | ### 1.最基本的Surface Shader 254 | 255 | ![](http://img.blog.csdn.net/20141228171735232?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 256 | 257 |
258 | 259 | ![](http://img.blog.csdn.net/20141228171746963?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 260 | 261 |


262 | 263 | ### 2.颜色可调 264 | 265 | ![](http://img.blog.csdn.net/20141228171851984?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 266 | 267 |
268 | 269 | ![](http://img.blog.csdn.net/20141228171932062?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 270 | 271 |


272 | 273 | ### 3.基本纹理载入 274 | 275 | ![](http://img.blog.csdn.net/20141228172034648?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 276 | 277 |
278 | 279 | ![](http://img.blog.csdn.net/20141228172048111?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 280 | 281 |


282 | 283 | ### 4.凹凸纹理载入 284 | 285 | ![](http://img.blog.csdn.net/20141228172155082?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 286 | 287 |
288 | 289 | ![](http://img.blog.csdn.net/20141228172211337?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 290 | 291 |


292 | 293 | ### 5.纹理载入+颜色可调 294 | 295 | ![](http://img.blog.csdn.net/20141228172425279?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 296 | 297 |
298 | 299 | ![](http://img.blog.csdn.net/20141228172645812?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 300 | 301 |


302 | 303 | ### 6. 凹凸纹理+边缘光照 304 | 305 | ![](http://img.blog.csdn.net/20141228173034359?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 306 | 307 |
308 | 309 | ![](http://img.blog.csdn.net/20141228173352980?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 310 | 311 |


312 | 313 | ### 7.凹凸纹理+颜色可调 314 | 315 | ![](http://img.blog.csdn.net/20141228173627092?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 316 | 317 |
318 | 319 | ![](http://img.blog.csdn.net/20141228174021171?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 320 | 321 |


322 | 323 | ### 8.细节纹理 324 | 325 | ![](http://img.blog.csdn.net/20141228174328948?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 326 | 327 |
328 | 329 | ![](http://img.blog.csdn.net/20141228174350632?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 330 | 331 |


332 | 333 | ### 9.凹凸纹理+颜色可调+边缘光照+细节纹理 334 | 335 | ![](http://img.blog.csdn.net/20141228174533124?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 336 | 337 |
338 | 339 | ![](http://img.blog.csdn.net/20141228174811870?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 340 | 341 |




342 | 343 | 344 | ## Volume 07 表面着色器的写法(二):自定义光照模式 345 |
346 | ### 0.内置的漫反射光照 347 | 348 | ![](http://img.blog.csdn.net/20150111162256968?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 349 | 350 |


351 | 352 | ### 1.简单的高光光照模型 353 | 354 | ![](http://img.blog.csdn.net/20150111162510361?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 355 | 356 |


357 | 358 | ### 2.自制简单的Lambert光照 359 | 360 | ![](http://img.blog.csdn.net/20150111162615476?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 361 | 362 |


363 | ### 3.自定义的半Lambert光照 364 | 365 | ![](http://img.blog.csdn.net/20150111162728812?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 366 | 367 |


368 | ### 4.自定义卡通渐变光照 369 | 370 | 第一组: 371 | 372 | ![](http://img.blog.csdn.net/20150111163034155) 373 | 374 | ![](http://img.blog.csdn.net/20150111163051456) 375 | 376 |  第二组: 377 | 378 | ![](http://img.blog.csdn.net/20150111163206149) 379 | 380 | ![](http://img.blog.csdn.net/20150111163224432) 381 | 382 | 第三组: 383 | 384 | ![](http://img.blog.csdn.net/20150111163303978) 385 | 386 | ![](http://img.blog.csdn.net/20150111163326442) 387 | 388 | 389 |


390 | ### 5.自定义卡通渐变光照v2 391 | 392 | ![](http://img.blog.csdn.net/20150111163814216) 393 | 394 |
395 | 396 | ![](http://img.blog.csdn.net/20150111163820515) 397 | 398 |
399 | 400 | ![](http://img.blog.csdn.net/20150111164000453) 401 | 402 |


403 | 404 |




405 | 406 | 407 | ## Volume 08 径向模糊屏幕特效 408 | 409 | ![](http://img.blog.csdn.net/20151025201934777?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 410 | 411 |
412 | 413 | ![](http://img.blog.csdn.net/20151025195010681?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center) 414 | 415 |




416 | 417 | ## Volume 09 屏幕水幕特效的实现 418 | 419 | ![](http://img.blog.csdn.net/20151101111232183?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center) 420 | 421 |
422 | 423 | ![](http://img.blog.csdn.net/20151101190406420?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 424 | 425 |




426 | 427 | ## Volume 10 屏幕油画特效的实现 428 | 429 | ![](http://img.blog.csdn.net/20151108172028275?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 430 | 431 |
432 | 433 | ![](http://img.blog.csdn.net/20151108172156992?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 434 | 435 |




436 | 437 | ## Volume 11 屏幕像素化特效的实现 438 | 439 | ![](http://img.blog.csdn.net/20151129134545797?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 440 | 441 |
442 | 443 | ![](http://img.blog.csdn.net/20151129135100965?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 444 | 445 |




446 | 447 | ## Volume 12 可编程Shader初步 & 漫反射可编程Shader 448 |
449 | ### 1.单色Shader 450 | 451 | ![](http://img.blog.csdn.net/20160306101527269?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 452 | 453 |


454 | 455 | ### 2.单色可调Shader的书写 456 | 457 | ![](http://img.blog.csdn.net/20160306101611630?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 458 | 459 |


460 | 461 | ### 4.颜色单项可调的RGB Cube 462 | 463 | ![](http://img.blog.csdn.net/20160306102015714?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 464 | 465 |


466 | 467 | ###5.三色分量可调的RGB Cube 468 | 469 | ![](http://img.blog.csdn.net/20160306102053925?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 470 |


471 | 472 | ### 6.单色可调的漫反射光照Shader书写 473 | 474 | ![](http://img.blog.csdn.net/20160306104333557) 475 |


476 | 477 | ### 7.可调颜色和自定义纹理的漫反射光照Shader 478 | 479 | ![](http://img.blog.csdn.net/20160306104503747) 480 | 481 |
482 | 483 | 下图是此漫反射Shader使用到皮卡丘模型上的效果图。 484 | 485 |   ![](http://img.blog.csdn.net/20160306104520950) 486 | 487 | ![](http://img.blog.csdn.net/20160306104542279?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 488 | 489 | ![](http://img.blog.csdn.net/20160306104551545?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 490 |




491 | 492 | 493 | 494 | ## Volume 13 单色透明Shader & 标准镜面高光Shader 495 | 496 |
497 | 498 | ### 1.单色透明Shader 499 | 500 | ![](http://img.blog.csdn.net/20160306101527269?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 501 |


502 | 503 | ### 2.颜色可以调版单色透明Shader 504 | 505 | ![](http://img.blog.csdn.net/20160313163102340?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 506 | 507 |


508 | ### 3.双面双色颜色可以调版透明Shader 509 | 510 | ![](http://img.blog.csdn.net/20160313163601639?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 511 | 从物体外部看: 512 | 513 | ![](http://img.blog.csdn.net/20160313163617811?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 514 | 515 | 从物体内部看: 516 | 517 | ![](http://img.blog.csdn.net/20160313163627983?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 518 |


519 | ### 4.镜面反射(Specular)Shader 520 | 521 | ![](http://img.blog.csdn.net/20160313163741061?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 522 |


523 | 524 | ### 5.带纹理载入的specular shader 525 | 526 | ![](http://img.blog.csdn.net/20160313163845452?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 527 | 528 | 将此Shader施于妙蛙草的模型之上,得到的便是如端游《剑灵》一般油腻腻的画风感觉: 529 | 530 | ![](http://img.blog.csdn.net/20160313163908049?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 531 | 532 | ![](http://img.blog.csdn.net/20160313163917421?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 533 |




534 | 535 | 536 | 537 | ## Volume 14.边缘发光Shader(Rim Shader)的两种实现形态 || Two Way to Write Rim Shader 538 | 539 |
540 | 541 | ### 1 542 | 543 | ![](http://img.blog.csdn.net/20160626194823864?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 544 |


545 | 546 | ### 2 547 | ![](http://img.blog.csdn.net/20160626202233428?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 548 | 549 |


550 | ### 3 551 | 552 | ![](http://img.blog.csdn.net/20160626202242413?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 553 | 554 |


555 | ### 4 556 | 557 | ![](http://img.blog.csdn.net/20160626202257787?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 558 | 559 | ### 5 560 | 561 | ![](http://img.blog.csdn.net/20160626202250179?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 562 | 563 | 564 | 565 | ## Volume 15. 屏幕高斯模糊(Gaussian Blur)后期特效的实现 || Gaussian Blur Post Effect 566 | 567 |
568 | 569 | ### 1 570 | 571 | ![](http://img.blog.csdn.net/20160710153647877) 572 | 573 |


574 | 575 | ### 2 576 | 577 | ![](http://img.blog.csdn.net/20160710154008897) 578 | 579 |


580 | ### 3 581 | 582 | ![](http://img.blog.csdn.net/20160710154031224) 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 | ![](https://img-blog.csdn.net/20170219132208590?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 593 | 594 |


595 | 596 | ### 2 597 | 598 | ![](https://img-blog.csdn.net/20170219145345434?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 599 | 600 |


601 | 602 | ### 3 603 | 604 | ![](https://img-blog.csdn.net/20170219145145510?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 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 | ![](http://img.blog.csdn.net/20141103021350640?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 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 | ![](http://img.blog.csdn.net/20141109223715831?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 8 |


9 | ###2.材质颜色&开启光照Shader 10 | ![](http://img.blog.csdn.net/20141109224045203?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 11 |


12 | ###3.可调漫反射光Shader 13 | ![](http://img.blog.csdn.net/20141109224100284?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 14 |


15 | ###4.光照材质完备beta版Shader 16 | ![](http://img.blog.csdn.net/20141109224312214?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 17 |


18 | ###5.简单的纹理载入Shader 19 | ![](http://img.blog.csdn.net/20141109224434832?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 20 |


21 | ###6.光照材质完备正式版Shader 22 | ![](http://img.blog.csdn.net/20141109224815432?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) -------------------------------------------------------------------------------- /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 | ![](http://img.blog.csdn.net/20141116204632861?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 8 |


9 | ###2.纹理的Alpha通道与自发光相混合 10 | ![](http://img.blog.csdn.net/20141116204751080?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 11 |


12 | ###3. 纹理Alpha与自发光混合可调色版 13 | ![](http://img.blog.csdn.net/20141116204937062?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 14 |


15 | ###4. 顶点光照+纹理Alpha自发光混合 16 | ![](http://img.blog.csdn.net/20141116205146640?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 17 |


18 | ###5. 顶点光照+自发光混合+纹理混合 19 | ![](http://img.blog.csdn.net/20141116205243876?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) -------------------------------------------------------------------------------- /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 | ![](http://img.blog.csdn.net/20141214160445602?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 8 |
9 | ![](http://img.blog.csdn.net/20141214160605390?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 10 |
11 | ![](http://img.blog.csdn.net/20141214160616609?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 12 |


13 | ### 2. 用剔除操作渲染对象背面(第二版) 14 | ![](http://img.blog.csdn.net/20141214160749125?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 15 |
16 | ![](http://img.blog.csdn.net/20141214160808203?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 17 |
18 | ![](http://img.blog.csdn.net/20141214160827953?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 19 |


20 | ### 3.用剔除实现玻璃效果 21 | ![](http://img.blog.csdn.net/20141214161022500?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 22 |
23 | ![](http://img.blog.csdn.net/20141214161013889?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 24 |


25 | ### 4.基本Alpha测试 26 | ![](http://img.blog.csdn.net/20141214162420924?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 27 |


28 | ### 5.顶点光照+可调透明度 29 | ![](http://img.blog.csdn.net/20141214162622828?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 30 |


31 | ### 6.简单的植被Shader 32 | ![](http://img.blog.csdn.net/20141214163333125?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) -------------------------------------------------------------------------------- /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 | ![](http://img.blog.csdn.net/20141221160256147?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 8 |
9 | ![](http://img.blog.csdn.net/20141221160310016?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 10 |


11 | 12 | ### 二:表面着色器Surface Shader示例 13 | ![](http://img.blog.csdn.net/20141221160637153?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 14 |
15 | ![](http://img.blog.csdn.net/20141221160849753?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 16 | 17 |


18 | ### 三:可编程Shader示例 19 | ![](http://img.blog.csdn.net/20141221161739031?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 20 |
21 | ![](http://img.blog.csdn.net/20141221162200269?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 22 |


23 | ### 1. 纹理载入Shader 24 | ![](http://img.blog.csdn.net/20141221164102640?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 25 |
26 | ![](http://img.blog.csdn.net/20141221164127104?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 27 |


28 | ### 2.基本blend使用 29 | ![](http://img.blog.csdn.net/20141221164617514?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 30 |
31 | ![](http://img.blog.csdn.net/20141221204604172?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 32 |


33 | ### 3.基本blend使用+颜色可调 34 | ![](http://img.blog.csdn.net/20141221164924262?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 35 |
36 | ![](http://img.blog.csdn.net/20141221165506636?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 37 |


38 | ### 4.基本blend使用+顶点光照 39 | ![](http://img.blog.csdn.net/20141221165658847?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 40 |
41 | ![](http://img.blog.csdn.net/20141221165945065?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 42 |


43 | ### 5.实现玻璃效果第二版 44 | ![](http://img.blog.csdn.net/20141221170257944?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 45 |
46 | ![](http://img.blog.csdn.net/20141221170358925?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 47 |


48 | 49 | ### 6.实现玻璃效果第三版 50 | ![](http://img.blog.csdn.net/20141221170508079?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 51 |
52 | ![](http://img.blog.csdn.net/20141221170537798?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) -------------------------------------------------------------------------------- /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 | ![](http://img.blog.csdn.net/20141228171735232?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 8 |
9 | ![](http://img.blog.csdn.net/20141228171746963?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 10 |


11 | 12 | ### 2.颜色可调 13 | ![](http://img.blog.csdn.net/20141228171851984?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 14 |
15 | ![](http://img.blog.csdn.net/20141228171932062?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 16 | 17 |


18 | ### 3.基本纹理载入 19 | ![](http://img.blog.csdn.net/20141228172034648?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 20 |
21 | ![](http://img.blog.csdn.net/20141228172048111?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 22 |


23 | ### 4.凹凸纹理载入 24 | ![](http://img.blog.csdn.net/20141228172155082?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 25 |
26 | ![](http://img.blog.csdn.net/20141228172211337?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 27 |


28 | ### 5.纹理载入+颜色可调 29 | ![](http://img.blog.csdn.net/20141228172425279?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 30 |
31 | ![](http://img.blog.csdn.net/20141228172645812?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 32 |


33 | ### 6. 凹凸纹理+边缘光照 34 | ![](http://img.blog.csdn.net/20141228173034359?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 35 |
36 | ![](http://img.blog.csdn.net/20141228173352980?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 37 |


38 | ### 7.凹凸纹理+颜色可调 39 | ![](http://img.blog.csdn.net/20141228173627092?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 40 |
41 | ![](http://img.blog.csdn.net/20141228174021171?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 42 |


43 | ### 8.细节纹理 44 | ![](http://img.blog.csdn.net/20141228174328948?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 45 |
46 | ![](http://img.blog.csdn.net/20141228174350632?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 47 |


48 | 49 | ### 9.凹凸纹理+颜色可调+边缘光照+细节纹理 50 | ![](http://img.blog.csdn.net/20141228174533124?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 51 |
52 | ![](http://img.blog.csdn.net/20141228174811870?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) -------------------------------------------------------------------------------- /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 | ![](http://img.blog.csdn.net/20150111162256968?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 8 |


9 | 10 | ### 1.简单的高光光照模型 11 | ![](http://img.blog.csdn.net/20150111162510361?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 12 | 13 |


14 | ### 2.自制简单的Lambert光照 15 | ![](http://img.blog.csdn.net/20150111162615476?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 16 |


17 | ### 3.自定义的半Lambert光照 18 | ![](http://img.blog.csdn.net/20150111162728812?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 19 |


20 | ### 4.自定义卡通渐变光照 21 | 第一组: 22 | 23 | ![](http://img.blog.csdn.net/20150111163034155) 24 | 25 | ![](http://img.blog.csdn.net/20150111163051456) 26 | 27 |  第二组: 28 | 29 | ![](http://img.blog.csdn.net/20150111163206149) 30 | 31 | ![](http://img.blog.csdn.net/20150111163224432) 32 | 33 | 第三组: 34 | 35 | ![](http://img.blog.csdn.net/20150111163303978) 36 | 37 | ![](http://img.blog.csdn.net/20150111163326442) 38 | 39 | 40 |


41 | ### 5.自定义卡通渐变光照v2 42 | ![](http://img.blog.csdn.net/20150111163814216) 43 |
44 | ![](http://img.blog.csdn.net/20150111163820515) 45 |
46 | ![](http://img.blog.csdn.net/20150111164000453) 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 | ![](http://img.blog.csdn.net/20151025201934777?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 6 |
7 | ![](http://img.blog.csdn.net/20151025195010681?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center) -------------------------------------------------------------------------------- /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 | ![](http://img.blog.csdn.net/20151101111232183?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center) 5 |
6 | ![](http://img.blog.csdn.net/20151101190406420?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) -------------------------------------------------------------------------------- /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 | ![](http://img.blog.csdn.net/20151108172028275?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 5 |
6 | ![](http://img.blog.csdn.net/20151108172156992?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) -------------------------------------------------------------------------------- /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 | ![](http://img.blog.csdn.net/20151129134545797?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 4 |
5 | ![](http://img.blog.csdn.net/20151129135100965?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) -------------------------------------------------------------------------------- /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 | ![](http://img.blog.csdn.net/20160306101527269?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 8 |


9 | 10 | ###2.单色可调Shader的书写 11 | ![](http://img.blog.csdn.net/20160306101611630?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 12 | 13 |


14 | ###4.颜色单项可调的RGB Cube 15 | ![](http://img.blog.csdn.net/20160306102015714?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 16 |


17 | ###5.三色分量可调的RGB Cube 18 | ![](http://img.blog.csdn.net/20160306102053925?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 19 |


20 | 21 | ### 6.单色可调的漫反射光照Shader书写 22 | ![](http://img.blog.csdn.net/20160306104333557) 23 |


24 | 25 | ### 7.可调颜色和自定义纹理的漫反射光照Shader 26 | ![](http://img.blog.csdn.net/20160306104503747) 27 |
28 | 下图是此漫反射Shader使用到皮卡丘模型上的效果图。 29 | 30 |   ![](http://img.blog.csdn.net/20160306104520950) 31 | 32 | ![](http://img.blog.csdn.net/20160306104542279?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 33 | 34 | ![](http://img.blog.csdn.net/20160306104551545?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) -------------------------------------------------------------------------------- /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 | ![](http://img.blog.csdn.net/20160306101527269?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 9 |


10 | 11 | ###2.颜色可以调版单色透明Shader 12 | ![](http://img.blog.csdn.net/20160313163102340?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 13 | 14 |


15 | ###3.双面双色颜色可以调版透明Shader 16 | ![](http://img.blog.csdn.net/20160313163601639?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 17 | 从物体外部看: 18 | 19 | ![](http://img.blog.csdn.net/20160313163617811?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 20 | 21 | 从物体内部看: 22 | 23 | ![](http://img.blog.csdn.net/20160313163627983?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 24 |


25 | ###4.镜面反射(Specular)Shader 26 | ![](http://img.blog.csdn.net/20160313163741061?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 27 |


28 | 29 | ###5.带纹理载入的specular shader 30 | ![](http://img.blog.csdn.net/20160313163845452?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 31 | 32 | 将此Shader施于妙蛙草的模型之上,得到的便是如端游《剑灵》一般油腻腻的画风感觉: 33 | 34 | ![](http://img.blog.csdn.net/20160313163908049?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 35 | 36 | ![](http://img.blog.csdn.net/20160313163917421?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) -------------------------------------------------------------------------------- /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 | ![](http://img.blog.csdn.net/20160626194823864?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 7 |


8 | ###2 9 | ![](http://img.blog.csdn.net/20160626202233428?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 10 |


11 | ###3 12 | ![](http://img.blog.csdn.net/20160626202242413?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 13 |


14 | ###4 15 | ![](http://img.blog.csdn.net/20160626202257787?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 16 |


17 | ###5 18 | ![](http://img.blog.csdn.net/20160626202250179?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 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 | ![](http://img.blog.csdn.net/20160710153647877) 9 | 10 |

11 | 12 | ### 2 13 | ![](http://img.blog.csdn.net/20160710154008897) 14 | 15 |

16 | ### 3 17 | ![](http://img.blog.csdn.net/20160710154031224) 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 --------------------------------------------------------------------------------