Unity中Shader的3种形态

  1. 固定管线
    固定管线是在旧的GPU能力比较有限时,对Shader的约束比较高的一种形态,在ShaderLab中,固定管线的形态,语法和NAVIDIA的CgFX以及微软的FX文件比较类似,下面是固定管线的一个例子。
Shader "Tut/Shader/FixedFuncs/BaseForm_1" {
       Properties {
       _Color ("Main Color"color)=(1,1,1,0.5)
       _SpecColor ("Spec Color",color)=(1,1,1,1)
       _Emission ("Emmisive color",color)=(0,0,0,0)
       _Shininess ("Shininess",Range (0.01,1))=0.7
       _MainTex ("Base (RGB)",2D)="white" {}
    }
    SubShader {
       Pass {
            Material {
                 Diffuse [_Color]
                 Ambient [_Color]
                 Shininent [_Shininess]
                 Specular [_SpecColor]
                 Emission [_Emission]


            }
            Lighting On
            SeparateSpecular On
            SetTexture [_MainTex] {
              constantColor [_Color]
              combine texture * primary DOUBLE,texture * constant
}

              }
}

固定管线的相关代码必须都处于一个Pass块中。

  1. 可编程Shader
    如果你想自己处理照明,可以写vertex+fragment Shader ,这是Unity中对可编程Shader的一种支持。下面是一个例子:
Shader "Tut/NewBie/FourthShader" {
       Propreties {
                         _MyTexture  ("Texture (RGB)",2D)="white" { }
                         _MyColor ("Color of object",Color)=(1,1,1,1)
        }
        SubShader {
        Tags{"Queue"="Geometry""RenderType"="Opaque""IgnoreProjector"="True"}
        Pass {
        CGPROGRAM
        #pragma vertex vert//声明vertex Shader的函数
        #pragma fragment frag//声明fragment Shader的函数
        #Include "UnityCG.cginc"// 包括外部文件
        sampler2D _MyTexture;
        float4 _MyColor;
        struct v2f{//定义一个结构
                float4 pos:SV_POSTITION;
        };
        v2f vert (appdata_full v)//vertex Shader
        {  
              v2f o;
              o.pos=mul(UNITY_MATRIX_MVPreturn o;
}
float4 frag(v2f i):COLOR//fragment Shader
{
      reutrn float4(1);

}  
 ENDCG     
       }                
}
 FallBack  "Diffuse"
  1. Surface Shader

如果你想写一个程序能处理不同的照明,点光源,平行光,光照贴图等。有能够处理不同的阴影选项,还同时能在Unity的两个渲染路径(Forward)和(Deferred)下正常工作,是一件很复杂,很烦人的事情,Unity通过Surface Shader 把上面这一切复杂想包装了起来,下面是一个例子

Shader "Tut/NewBie/SurfShader" {
    Properties {
         _MainTex ("Base (RGB)",2D)="white" {}
 }
 SubShader {
       Tags {"RenderType"="Opaque"}
       LOD 200

       CGPROGRAM
       #pragma surface surf Lambert
       sampler2D _MainTex;
       struct Input {
            float2 uv_MainTex;

};
void surf (Input IN,inout SurfaceOutput o)  {
       half4 c=tex2D (_MainTex,IN.uv_MainTex);
       o.Albedo=c.rgb;
       o.Alpha=c.a;
}
ENDCG
       }  
       FallBack "Diffuse"      

}

在Surface函数surf中,SurfaceOutput是一个包含描述一个物体表面渲染特征的结构,例如:

struct SurfaceOutput{
    half3  Albedo;//颜色纹理
    half3  Normal;//法线
    half3 Emission;//自发光,不受照明的影响
    half  Specular;//高光指数
    half  Gloss;//光泽度
    half  Alpha;//Alpha通道
}

你可能感兴趣的:(ShaderLab)