Unity中Shader的3種形態
阿新 • • 發佈:2019-01-22
- 固定管線
固定管線是在舊的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塊中。
- 可程式設計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"
- 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通道
}