【Unity3D Shader编程】之八 Unity5新版Shader模板源码解析 径向模糊屏幕特效的实现

分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

               




 本系列文章由@浅墨_毛星云 出品,转载请注明出处。  

 文章链接: http://blog.csdn.net/poem_qianmo/article/details/49405909

 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 

 本文工程使用的Unity3D版本: 5.2.1 

   

    概要:本文对Unity5中全新的三种Shader模板的源码进行了解析,然后还讲解了运动模糊屏幕特效的实现方法。




前言



时隔9个月,终于有了一些稍微空闲的时间,可以进行一些更新了。

鉴于以后可以用来写博客的时间肯定不会非常充裕,个人觉得再讲Shader的基础写法比较拖节奏,所以最好是把力气用在刀刃上,在有时间更新的时候,主要讲一些更加前沿、实用的技巧,以及进阶一些的Shader的写法。

 

另外,从本次开始,每次更新的标题也就不取那么主题化了(比如之前的暗黑城堡、静谧之秋之类的)。人老了,渐渐文艺不起来了,还是实在一点好。:D

 

好的,就交代这么多。接下来就按新的风格试着写几次。。

 

 看一组程序截图之后,便开始我们的正文。如下图,一份运动模糊屏幕特效的效果对比。

原始场景效果图:

 

开启运动模糊特效后的场景效果图:

 

 

图先就上这两张。文章末尾有更多的运行截图,并提供了源工程的下载。先放出可运行的exe下载,如下:

 

【可运行的exe游戏场景请点击这里下载试玩】

 

好的,正文开始。






一、Unity5中新的Shader体系简析

 




Unity5和之前的书写模式有了一定的改变。Unity5时代的Shader Reference官方文档也进一步地变得丰满。

 主要需要了解到的是,在原来的Unity中,若想要新建一个Shader源文件,不考虑compute shader的话,仅有一种Shader模板供选择。而自从Unity5.1起(好像是Unity5.1)

想在Unity5.1之后的版本中新建Shader,【右键在Project窗口中单击】->【Create】,会出现如下的四个选项:

而由于暂时不考虑compute shader。所以,新版Unity中有三种基本的Shader模板分别为:

  • Standard Surface Shader标准表面着色器
  • Unlit Shader 无灯光着色器
  • Image Effect Shader 图像特效着色器




 

 

二、Unity5中新的Shader模板源码解析

 

 



下面,对Unity5中三种基本Shader模板进行逐行注释与思路解析。

可以点击这里跳转到Github,查看详细注释好的三种Shader模板的源码。




 

2.1 标准表面着色器(Standard Surface Shader)模板源码解析

 

在Unity中,我们若要实现新的表面着色器时,可以根据这个模板,进行一步添加子着色器和新的参数与特性。

这个Shader模板的脉络很清晰,先是定义一些属性,然后在SubShader中设置渲染模式,层次细节LOD的值,然后开启一个CG编程语言模块,写一些编译指令#pragma,声明一下变量让属性值在CG块中可见,定义输入结构,然后填充一下表面着色函数即可。注意:专门强调一句,SurfaceShader不能使用Pass,一使用就报错,我们直接在SubShader中实现和填充代码就可以了。

Standard Surface Shader模板详细注释的Shader代码如下:

 

Shader "浅墨Shader编程/Volume8/Surface Shader模板"{       //------------------------------------【属性值】------------------------------------       Properties       {              //主颜色              _Color("Color", Color) = (1,1,1,1)              //主纹理              _MainTex("Albedo (RGB)", 2D) = "white" {}              //光泽度              _Glossiness("Smoothness", Range(0,1)) = 0.5              //金属度              _Metallic("Metallic", Range(0,1)) = 0.0       }        //------------------------------------【唯一的子着色器】------------------------------------       SubShader       {              //【注意:Surface Shader不能使用Pass,直接在SubShader中实现即可】               //渲染类型设置:不透明              Tags{
    "RenderType" = "Opaque" }               //细节层次设为:200              LOD200               //===========开启CG着色器语言编写模块===========              CGPROGRAM               //编译指令:告知编译器表明着色函数的名称为surf              //Standard表示光照模型为Unity标准版光照模型              //fullforwardshadows表示在正向渲染路径中支持所有阴影类型              #pragma surface surf Standard fullforwardshadows               //编译指令: 指定着色器编译目标为Shader Model 3.0              #pragma target 3.0               //变量的声明              sampler2D _MainTex;               //表面输入结构体              struct Input              {
                          float2 uv_MainTex;//纹理坐标              };               //变量的声明              half _Glossiness;              half _Metallic;              fixed4 _Color;               //--------------------------------【表面着色函数】-----------------------------              //输入:表面输入结构体              //输出:Unity内置的SurfaceOutputStandard结构体              //SurfaceOutputStandard原型如下:              /*                     struct SurfaceOutputStandard                     {                            fixed3 Albedo;                  // 漫反射颜色                            fixed3 Normal;                  // 切线空间法线                            half3 Emission;                 //自发光                            half Metallic;                           // 金属度;取0为非金属, 取1为金属                            half Smoothness;             // 光泽度;取0为非常粗糙, 取1为非常光滑                            half Occlusion;                 // 遮挡(默认值为1)                            fixed Alpha;                      // 透明度                     };              */              //---------------------------------------------------------------------------------              void surf(Input IN, inout SurfaceOutputStandard o)              {                     //【1】漫反射颜色为主纹理对应的纹理坐标,并乘以主颜色                     fixed4c = tex2D(_MainTex, IN.uv_MainTex) * _Color;                     //【2】将准备好的颜色的rgb分量作为漫反射颜色                     o.Albedo= c.rgb;                     //【3】金属度取自属性值                     o.Metallic= _Metallic;                     //【4】光泽度也取自属性值                     o.Smoothness= _Glossiness;                     //【5】将准备好的颜色的alpha分量作为Alpha分量值                     o.Alpha= c.a;              }               //===========结束CG着色器语言编写模块===========              ENDCG       }       //备胎为漫反射       FallBack"Diffuse"}


 

接着来看Unity5的第二种Shader模板,无灯光着色器(Unlit Shader)模板。





2.2 无灯光着色器(Unlit Shader)模板源码解析

 

Unlit Shader,简单来说,就是直接采用漫反射纹理,不考虑场景中的任何灯光效果。使用无灯光着色器的话,也就不能使用任何镜面或者法线效果了。Unlit系的Shader基本原理和其他Shader无异,但是计算量更小,更快速,更高效。

而在Unity内置的各种着色器中,有如下的四种是Unlit系的:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值