1. 程式人生 > >Unity中Shader的3種形態

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_MVP<v.vertex); return 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通道
}