【Unity-Shader】Unity60个内置Shader代码浅析(一)

Sunset虽然还没有正式开始工作,但已经有一点小忙了,总是感觉有好多好多不得不做的事,即使身心都有点疲倦。这次带来的是Unity内置的60个Shader代码的浅析的第一部分。往后会像制作ARPG那样陆续更新。
今天,在蛮牛群里,和几位同为学习者的群友进行了一番讨论,问题是,在游戏公司实习进行学习好还是自学好。个人认为,如果想要从事游戏开发相关方面的职业,首先提升自身能力以达到某一标准水平肯定是必需的。我相信,现今的许多怀有游戏梦想的大学生都会在不同时间以不同方式埋头苦干想方设法为了这个目标而努力。且不论哪一种方式更快,我认为:自学是人类自身能力的一种体现。从结果论出发,自学并不是为了讨论能够学的有多快,而是为了学的有多扎实,脑袋里面拥有多少的知识量。在进公司实习前,尽可能做到知识的完备,具有一定的项目经验,达到这个条件后进公司只需要进行团队之间的磨合和注意一些平时个人进行开发学习过程中可能没注意到的更加专业化的规定或者细节,远比进了公司之后不仅需要对自身能力进行提升,还需要跟团队磨合来得轻松。当然,每个人有每个人的想法,求同存异嘛。毕竟人与人之间所面对的环境与条件是不太一样,在某些地区,可能游戏公司较多,人才的需求度比较大,只需要拥有基础的能力就能正式入职或者进入实习,但对于sunset而言,由于游戏公司量小,规模也并非很大,所以往往精中求精,所以面试要求也比其他地区苛刻许多。sunset个人的想法是,完善自身能力后在进入公司实习,不仅是对自己负责,也是对团队负责,更是对能够给予自己机会进入这个行业的公司负责。所以,不管怎么样,先提升自身能力总是不错的选择。好了,废话有点多,接下来开始正题:
10个shader的名称:
(1)Alpha-Bumped Diffuse
(2)Alpha-Bumped Specular
(3)Alpha-Diffuse
(4)Alpha-Glossy
(5)Alpha-Parallax
(6)Alpha-ParallaxSpec
(7)AlphaTest-Bumped
(8)AlphaTest-BumpSpec
(9)AlphaTest-Diffuse
(10)AlphaTest-GLossy

(1)

Shader "Custom/Shader1" 
{
    //着色器的属性输入的声明,包含着主颜色,主纹理,法线贴图
    Properties
    {
        _Color("Main Color",Color) = (1,1,1,1)
        _MainTex("MainTexure Base(RGB) Trans(A)",2D) = "white"{}
        _BumpMap("Normal Map",2D) = "bump"{}
    }
    //一个子着色器,是一个表面着色器
    SubShader
    {
        Tags                                      //子着色器标签
        {
            "Queue" = "Transparent"               //队列标签,决定该着色器的渲染顺序
            "IgnoreProjector" = "True"            //忽视阴影为TRUE
            "RenderType" = "Transparent"          //渲染类型为“透明”
        }
        LOD 300                                   //LEVEL OF DETAIL 为300

        CGPROGRAM                             //CG程序段开始标志,下一句是表明是表面着色器,采用兰姆珀特光照模型,采用透明混合模式
        #pragma surface surf Lambert alpha

        sampler2D _MainTex;                   //根据主属性中的变量声明,在CG程序段中也要有相应的变量,这个为主纹理
        sampler2D _BumpMap;                   //法线贴图
        fixed4 _Color;                        //主颜色

        struct Input                          //输入结构
        {
            float2 uv_MainTex;                //主纹理
            float2 uv_BumpMap;                //法线贴图
        };

        void surf(Input IN, inout SurfaceOutput o)                          //Surface Function
        {
            fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color;             //根据输入的主纹理和主颜色计算输出颜色
            o.Albedo = c.rgb;                                               //输出结构的反射率为输出颜色的RGB
            o.Alpha = c.a;                                                  //输出结构的透明值为输出颜色的透明值
            o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));        //根据主属性中输入的法线贴图计算输出结构的法线
        }

        ENDCG                                                               //CG程序段结束的标志
    }

    FallBack "Transparent/Diffuse"                                              //备用,使用漫反射着色器(另一个着色器)
}

(2)

Shader "Custom/Shader2" 
{
    //着色器主属性变量的声明,包含:主颜色,高光颜色,光泽度,主纹理,法线贴图
    Properties
    {
        _Color("Main Color", Color) = (1,1,1,1)
        _SpecColor("Specular Color", Color) = (1,1,1,1)
        _Shininess("Shininess", Range(0, 1)) = 0.078125
        _MainTex("Base(RGB Trans(A))", 2D) = "white"{}
        _BumpMap("Normal Map", 2D) = "bump"{}
    }
    //子着色器,是表面着色器
    SubShader
    {
        //子着色器标签:透明渲染队列, 忽视阴影为真, 渲染类型为透明 
        Tags
        {
            "Queue" = "Transparent"
            "IgnoreProjector" = "True"
            "RenderType" = "Transparent"
        }
        //LEVEL OF DETAIL 为400
        LOD 400
        //CG程序段开始得标志,表面着色器采用Blinn-Phong光照模型, 采用Alpha混合方式
        CGPROGRAM
        #pragma surface surf BlinnPhong alpha

        sampler2D _MainTex;
        sampler2D _BumpMap;
        fixed4 _Color;
        half _Shininess;
        struct Input
        {
            float2 uv_MainTex;
            float2 uv_BumpMap;
        };
        //表面着色器方法,混合纹理,计算RGB值,计算Alpha值,其中输出结构的光泽(Gloss)为Alpha值
        //计算镜面反射值,计算法线
        void surf(Input IN, inout SurfaceOutput o)
        {
            fixed4 tex = tex2D(_MainTex, IN.uv_MainTex);
            o.Albedo = tex.rgb * _Color.rgb;
            o.Gloss = tex.a;
            o.Alpha = tex.a * _Color.a;
            o.Specular = _Shininess;
            o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
        }
        //CG程序段结束标志
        ENDCG
    }
}

(3)

Shader "Custom/Shader3" 
{
    //"Transparent/Diffuse"
    //主属性变量声明,主颜色,主纹理
    Properties
    {
        _Color("Main Color", Color) = (1,1,1,1)
        _MainTex("Base(RGB) Trans(A)", 2D) = "white"{}
    }
    //这个子着色器是表面着色器,采用透明渲染队列,忽视阴影为真,渲染类型为透明
    SubShader
    {
        Tags
        {
            "Queue" = "Transparent"
            "IgnoreProjector" = "True"
            "RenderType" = "Transparent"    
        }
        //LEVEL OF DETAIL 值为200
        LOD 200

        //CG程序段开始得标志,表面着色器函数为surf, 采用Lambert光照模型,采用透明混合方式
        CGPROGRAM
        #pragma surface surf Lambert alpha

        sampler2D _MainTex;
        fixed4 _Color;

        //输入结构,包含主纹理属性
        struct Input
        {
            float2 uv_MainTex;
        };
        //表面着色器函数,计算颜色,计算输出结构RGB值,计算输出结构透明值
        void surf(Input IN, inout SurfaceOutput o)
        {
            fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color;
            o.Albedo = c.rgb;
            o.Alpha = c.a;
        }
        //CG程序段的结束标志
        ENDCG
    }
    //备用为"顶点光照着色器"
    FallBack "Transparent/VertexLix"
}

(4)

Shader "Custom/Shader4" 
{
    //主属性变量声明,包含:主颜色,高光颜色,光泽度,主纹理
    Properties
    {
        _Color("Main Color", Color) = (1,1,1,1)
        _SpecColor("Specular Color", Color) = (0.5,0.5,0.5,0)
        _Shininess("Shininess", Range(0.01, 1)) = 0.078125
        _MainTex("Main Texture", 2D) = "white"{}
    }
    //子着色器是一个表面着色器
    SubShader
    {
        //子着色器标签为透明渲染队列,忽视阴影为真, 渲染类型为透明
        Tags
        {
            "Queue" = "Transparent"
            "IgnoreProjector" = "True"
            "RenderType" = "Transparent"
        }
        LOD 300
        //CG程序段开始标志,表面着色器采用Blinn-Phong光照模型,采用透明混合模式
        CGPROGRAM
        #pragma surface surf BlinnPhong alpha

        sampler2D _MainTex;
        fixed4 _Color;
        half _Shininess;
        //输入结构,包含:主纹理
        struct Input
        {
            float2 uv_MainTex;
        };
        //表面着色器函数,混合纹理,计算反射率,计算光泽,计算透明值, 计算镜面光泽度
        void surf(Input IN, inout SurfaceOutput o)
        {
            fixed4 tex = tex2D(_MainTex, IN.uv_MainTex);
            o.Albedo = tex.rgb * _Color.rgb;
            o.Gloss = tex.a;
            o.Alpha = tex.a;
            o.Specular = _Shininess;
        }
        ENDCG
    }
    //备用为"顶点光照着色器"
    FallBack "Transparent/VertexLit"
}

(5)

Shader "Custom/Shader5" 
{
    //着色器的输入属性变量声明,包含:主颜色、虚拟位移量、主纹理、法线贴图、虚拟位移贴图
    Properties
    {
        _Color("Main Color", Color) = (1,1,1,1)
        _Parallax("Height", Range(0.005, 0.08)) = 0.02
        _MainTex("Main Texture(RGB + A)", 2D) = "white"{}
        _BumpMap("Normal Map", 2D) = "Bump"{}
        _ParallaxMap("Height Map (A)", 2D) = "black"{}
    }
    //这个子着色器是表面着色器
    SubShader
    {   //着色器标签包含:透明渲染队列,忽视阴影为真、渲染类型为透明
        Tags 
        {
            "Queue" = "Transparent" 
            "IgnoreProjector" = "True" 
            "RenderType" = "Transparent"
        }
        //LEVEL OF DETAIL为500
        LOD 500
        //CG程序段的开始标志,表面着色器采用Lambert光照模型、采用透明混合模式
        CGPROGRAM
        #pragma surface surf Lambert alpha

        sampler2D _MainTex;
        sampler2D _BumpMap;
        sampler2D _ParallaxMap;
        fixed4 _Color;
        float _Parallax;

        //输入结构,包含:主纹理、法线贴图、视图方向
        struct Input
        {
            float2 uv_MainTex;
            float2 uv_BumpMap;
            float3 viewDir; 
        };
        //表面着色器函数,声明一个half类型值h,其值为采用2D非投影纹理查询的w量,
        //然后根据虚拟位移量和视角方向计算偏移,然后主纹理和法线贴图分别加上偏移,形成视觉偏差效果
        void surf(Input IN, inout SurfaceOutput o)
        {
            half h = tex2D(_ParallaxMap, IN.uv_BumpMap).w;
            float2 offset = ParallaxOffset(h, _Parallax, IN.viewDir);
            IN.uv_MainTex += offset;
            IN.uv_BumpMap += offset;

            fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color;
            o.Albedo = c.rgb;
            o.Alpha = c.a;
            o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
        }
        //CG程序段结束的标志
        ENDCG
    }
    //备用:“使用法线贴图的漫反射着色器”
    Fallback "Transparent/Bumped Diffuse"
}

(6)

Shader "Custom/Shader6"
{
    //主属性输入为:主颜色,高光颜色,光泽度,主纹理,法线贴图,虚拟位移贴图,虚拟位移量
    Properties
    {
        _Color("Main Color", Color) = (1,1,1,1)
        _SpecColor("Specular Color", Color) = (0.5,0.5,0.5,0)
        _Shininess("Shininess", Range(0.01, 1)) = 0.078125
        _MainTex("Main Texture", 2D) = "white"{}
        _BumpMap("Bump Map", 2D)= "bump"{}
        _ParallaxMap("HeightMap(A)",2D) = "black"{}
        _Parallax("Parallax", Range(0.005, 0.08)) = 0.02
    }
    //子着色器是表面着色器
    SubShader
    {
        //子着色器的的标签为:透明渲染队列,忽视阴影为真, 渲染类型为透明
        Tags
        {
            "Queue" = "Transparemt"
            "IgnoreProjector" = "True"
            "RenderType" = "Transparent"
        }
        LOD 600
        //CG程序段开始标志,表面着色器采用BlinnPhong光照模型,采用透明混合模式
        CGPROGRAM
        #pragma surface surf BlinnPhong alpha

        sampler2D _MainTex;
        sampler2D _BumpMap;
        sampler2D _ParallaxMap;
        fixed4 _Color;
        half _Shininess;
        float _Parallax;
        //输入结构,包含:主纹理,法线贴图,视角方向
        struct Input
        {
            float2 uv_MainTex;
            float2 uv_BumpMap;
            float3 viewDir;
        };
        //表面着色器函数,总之,根据视图方向,虚拟位移视图,法线贴图计算偏移,然后分别加以偏移
        void surf(Input IN, inout SurfaceOutput o)
        {
            half h = tex2D(_ParallaxMap, IN.uv_BumpMap).w;
            float2 offset = ParallaxOffset(h, _Parallax, IN.viewDir);
            IN.uv_MainTex += offset;
            IN.uv_BumpMap += offset;

            fixed4 tex = tex2D(_MainTex, IN.uv_MainTex);
            o.Albedo = tex.rgb * _Color.rgb;
            o.Alpha = tex.a * _Color.a;
            o.Gloss = tex.a;
            o.Specular = _Shininess;
            o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
        }
        //CG程序段结束标志
        ENDCG
    }
    //备用:采用法线贴图的高光着色器。
    FallBack "Transparent/Bumped Specular"
}

(7)

Shader "Custom/Shader7" 
{
    //主属性输入,包含:主颜色,主纹理, 法线贴图,透明测试比较裁剪值
    Properties
    {
        _Color("Main Color",Color) = (1,1,1,1)
        _MainTex("Base (RGB) Trans(A)", 2D) = "white"{}
        _BumpMap("Bump Map", 2D) = "bump"{}
        _Cutoff("Alpha CutOff", Range(0, 1)) = 0.5
    }   
    //子着色器,是表面着色器
    SubShader
    {
        //着色器标签:透明渲染队列,忽视阴影为真,渲染类型为透明
        Tags
        {
            "Queue" = "Transparent"
            "IgnnoreProjector" = "True"
            "RenderType" = "TransparentCutout"
        }
        //LEVEL OF DETAIL 值为300
        LOD 300
        //CG程序段的开始标志,采用Lambert光照模型,采用透明测试模式,用于编写具有镂空效果的着色器
        //当alpha值大于一定值时,为不透明
        CGPROGRAM
        #pragma surface surf Lambert alphatest:_Cutoff

        sampler2D _MainTex;
        sampler2D _BumpMap;
        fixed4 _Color;
        //输入结构,包含:主纹理,法线贴图
        struct Input
        {
            float2 uv_MainTex;
            float2 uv_BumpMap;
        };
        //表面着色器函数,查询纹理的颜色赋值给c,分别计算输出结构的RGB值,透明值,以及法线
        void surf(Input IN , inout SurfaceOutput o)
        {
            fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color;
            o.Albedo = c.rgb;
            o.Alpha = c.a;
            o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
        }
        //CG程序段结束标志
        ENDCG
    }
    //备用:”透明测试模式/漫反射着色器“
    FallBack "Transparent/Cutout/Diffuse"
}

(8)

Shader "Custom/Shader8" 
{
    //主属性输入,包含:主颜色,镜面高光颜色,光泽度。主纹理,法线贴图,透明测试模式阈值
    Properties
    {
        _Color("Main Color", Color) = (1,1,1,1)
        _SpecColor("Specular Color", Color) = (0.5,0.5,0.5,0)
        _Shininess("Shininess", Range(0.01, 1)) = 0.02
        _MainTex("Base(RGB) Trans(A)", 2D) = "white"{}
        _BumpMap("Normal Map", 2D) = "bump"{}
        _Cutoff("Alpha cutoff", Range(0, 1)) = 0.5
    }
    //表面着色器
    SubShader
    {
        //子着色器标签,透明渲染队列,忽视阴影,渲染类型为透明
        Tags
        {
            "Queue" = "Transparent"
            "IgnoreProjector" = "True"
            "Rendertype" = "TransparentCutout"
        }
        //LEVEL OF DETAIL 为400
        LOD 400
        //CG程序段开始标志,表面着色器,采用BlinnPhong光照模型,采用透明测试模式,阈值为_Cutoff
        CGPROGRAM
        #pragma surface surf BlinnPhong alphatest:_Cutoff

        sampler2D _MainTex;
        sampler2D _BumpMap;
        fixed4 _Color;
        half _Shininess;

        //输入结构,包含:主纹理, 法线贴图
        struct Input
        {
            float2 uv_MainTex;
            float2 uv_BumpMap;
        };
        //表面着色器函数,纹理查询赋值tex,计算输出结构的反射率,计算透明值,计算光泽,计算镜面反射率,计算法线
        void surf(Input IN, inout SurfaceOutput o)
        {
            fixed4 tex = tex2D(_MainTex, IN.uv_MainTex);
            o.Albedo = tex.rgb * _Color.rgb;
            o.Alpha = tex.a * _Color.a;
            o.Gloss = tex.a;
            o.Specular = _Shininess;
            o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
        }
        //CG程序段结束标志
        ENDCG
    }
    //备用:采用透明测试模式的顶点光照着色器
    Fallback "Transparent/Cutoff/VertexLit"
}

(9)

Shader "Custom/Shader9" 
{
    //主属性输入,包含:主颜色,主纹理,透明混合模式阈值
    Properties
    {
        _Color("Main Color", Color) = (1,1,1,1)
        _MainTex("Base(RGB) Teans(A)",2D) = "white"{}
        _Cutoff("Alpha cutoff", Range(0, 1)) = 0.5
    }
    //子着色器是表面着色器,透明渲染队列,忽视阴影,透明镂空渲染类型
    Subshader
    {
        Tags
        {
            "Queue"="AlphaTest" 
            "IgnoreProjector"="True" 
            "RenderType"="TransparentCutout"
        }
        LOD 200
        //CG程序段的开始标志,表面着色器,采用Lambert光照模式,透明测试模式,阈值为_Cutout
        CGPROGRAM
        #pragma surface surf Lambert alphatest:_Cutoff

        sampler2D _MainTex;
        fixed4 _Color;
        //输入结构,包含:主纹理
        struct Input
        {
            float2 uv_MainTex;
        };
        //表面着色器函数
        void surf(Input IN, inout SurfaceOutput o)
        {
            fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color;
            o.Albedo = c.rgb;
            o.Alpha = c.a;
        }
        //CG程序段结束标志
        ENDCG
    }
    //备用:”透明镂空顶点光照着色器“
    FallBack "Transparent/Cutout/VertexLit"
}

(10)

Shader "Custom/Shader10" 
{
    //主属性输入,包含:主颜色,镜面高光颜色,光泽度,主纹理,透明测试模式阈值
    Properties 
    {
    _Color ("Main Color", Color) = (1,1,1,1)
    _SpecColor ("Specular Color", Color) = (0.5, 0.5, 0.5, 0)
    _Shininess ("Shininess", Range (0.01, 1)) = 0.078125
    _MainTex ("Base (RGB) TransGloss (A)", 2D) = "white" {}
    _Cutoff ("Alpha cutoff", Range(0,1)) = 0.5
    }
    //子着色器,这是一个表面着色器
    SubShader 
    {
        Tags 
        {
            "Queue"="AlphaTest"
             "IgnoreProjector"="True" 
             "RenderType"="TransparentCutout"
        }
        LOD 300
        //CG程序段的开始标志,表面着色器采用BlinnPhong光照模型,采用透明测试模式,阈值为_Cutout
        CGPROGRAM
        #pragma surface surf BlinnPhong alphatest:_Cutoff

        sampler2D _MainTex;
        fixed4 _Color;
        half _Shininess;
        //输入结构,包含:主纹理
        struct Input 
        {
            float2 uv_MainTex;
        };
        //表面着色器函数
        void surf (Input IN, inout SurfaceOutput o) 
        {
            fixed4 tex = tex2D(_MainTex, IN.uv_MainTex);
            o.Albedo = tex.rgb * _Color.rgb;
            o.Gloss = tex.a;
            o.Alpha = tex.a * _Color.a;
            o.Specular = _Shininess;
        }
        //CG程序段结束标志
        ENDCG
    }
    //备用:”镂空顶点光照透明着色器“
    Fallback "Transparent/Cutout/VertexLit"
}

上面这10个着色器都是sunset手敲的,也算是一种练习吧,还有这10个着色器基本上都是表面着色器,不同着色器区别的同学先去看看官方的Shader Totual,或者其他一些资料。嗯,今天就先这样。

展开阅读全文

没有更多推荐了,返回首页