First:
//一個Shader由Properties,SubShader,FallBack組成
Shader"CustomLearn/First"{
//屬性:用來指定代碼有那些輸入
Properties{
//屬性的語法:Name("DisplayName",type)=defaultValue(options)
//Name是屬性的名字慨代,簡單的來說相當于一個變量名耘柱,在之后整個Shader代碼中將使用
//這個名字獲取該屬性里面的內容
//DisplayName:將顯示在Unity引擎材質編輯器中做為shader的使用者可讀取的內容,即材質中顯示的內容
//type:屬性的類型,主要由以下幾種類型:
//1.Color--顏色捺萌,RGBA(紅,綠抒线,藍粟耻,透明度)由四個量來定義,每個量的值在0-1之間
//2.2D--是一個2的冪次方大小的貼圖锨咙,這張貼圖將在采樣后被轉化為對應基于模型的UV的每個像素的顏色语卤,最終被顯示出來,帶有options(可選項)
//3.Rect--是一個非2的冪次方的貼圖,
//4.Cube--即Cubemaptexture(立方體紋理)粹舵,簡單的來說就是6張有聯(lián)系的2D貼圖組合钮孵,主要用來做反射效果
//2-4對于貼圖來說,其值可以用一個代表tint顏色字符串來表示眼滤,其值可以為空巴席,options只對貼圖有關,里面至少寫一個空的{}
//如果需要打開特定選項诅需,可以把其寫在{}里面漾唉,如果同時打開多個選項,可以用空格分開
//選項有以下幾種:ObjectLinear,SphereMap,CubeReflect,CubeNormal中一個或者是White,Black,Gray,Bump(凹凸)中的一個堰塌;
//5.Range--一個介于最大值和最小值之間的浮點數(shù)赵刑,其值可以在材質編輯器中滑動調節(jié),比如Shader中某些特定的參數(shù)蔫仙,透明度其值為0-1料睛,就可以用該類型表示;
//6.Float--一個浮點數(shù)
//7.Vector--一個四維數(shù)摇邦,寫成(x,y,z,w);
//defaultValue:默認值恤煞,一個符合格式的值來設置為默認值;
_Color?("MainColor",Color)?=?(1,0.5,0.5,1)
}
//SubShader是子著色器施籍,可以有一個居扒,也可以有多個,在實際運行中丑慎,哪個子著色器被調用喜喂,是由運行平臺來決定的
//子著色器是代碼的主體,每一個子著色器包含一個或者多個pass
//每一個pass都會渲染一次對象竿裂,在計算著色時玉吁,平臺會選擇最優(yōu)先使用的那個著色器,然后以此運行里面的pass腻异,會得到一個輸出結果进副,最后才會渲染出來
SubShader{
//pass通道控制被渲染的對象的幾何體,除了表面著色器以外悔常,其他兩種(固定管線著色器和頂點片段著色器)著色器的subshader下面一定要有pass通道影斑,其語法格式如下
//pass{[NameandTags][RandererSetup][TextureSetup]}
//基本通道包含一個可選的渲染設置命令列表和可選的被使用的文理列表
//NameandTags:可以定義pass的名字和做任意數(shù)量的標簽,為pass命名后机打,可以在別的著色器中使用該名字來調用矫户,標簽可以用來向渲染器說明pass的意圖
//RendererSetUp(渲染設置):只用在固定功能管線著色器中,可以設置圖形硬件的各種狀態(tài)残邀,可用的設置命令如下:
//1.Material{}:材質皆辽,定義一個使用定點光照管線的材質
//2.Lighting:光照柑蛇,其值取為On或Off;
//3.Cull:剪裁驱闷,設置剪裁模式唯蝶,有Back,Front,Off
//4.ZTest:深度測試,模式有LessGreaterLEqualGEqualEqualNotEqualAlways
//5.Fog{}:霧效遗嗽,設置霧效的參數(shù)
//6.AlphaTest:油墨Alpha測試,模式有LessGreaterEqualNotEqualAlways
//7.Blend:Alpha混合
//8.Color:設置頂點光照關閉時使用的顏色
//9.ColorMask:顏色遮罩鼓蜒,當值為零時痹换,相當于關閉所有顏色通道的渲染,取值為RGB\A\0或者RGBA任意組合
//10.Offset:深度偏移
//11.SeparateSpecular:高光顏色都弹,取值為On或者Off
//12.ColorMaterial:顏色集娇豫,當計算頂點光照時,使用每個頂點的顏色
//TextureSetup(紋理)的命令有以下三種
//1.combine:將兩種顏色混合可以是previous(上一次texture的顏色),constant(常量顏色),primary(頂點顏色),texture(紋理顏色)
//2.constantColor:常量顏色
//3.matrix:設置矩陣對紋理坐標進行變換
pass{
Material{
Diffuse[_Color]
}
Lightingon
}
}
//以上所有的子著色器都不能運行的話畅厢,執(zhí)行該回調
FallBack"Diffuse"
}
second:
Shader"CustomLearn/Second"{
properties{
_Color("MainColor",Color)?=?(1,1,1,1)
_SpecColor("SpecColor",Color)?=?(1,1,1,1)
_Emission("Emission",Color)?=?(0,0,0,0)
_Shininess("Shininess",Range(0.01,1))?=0.7
_MainTex("MainTexture",2D)?="White"{}
}
SubShader{
//tag值暗示了要輸出的是什么冯痢,如果輸出的都是非透明物體,寫在Qpaque中框杜,如果想渲染透明或者半透明的物體浦楣,寫在Transparent里面,其他有用的標簽
//“IqnireProject”=true(不受投影影響)
//"ForceNoShadowCasting"="True"(不產(chǎn)生陰影)
//"Queue=XXX"(渲染的順序隊列)
//如果使用Unity做一些透明或者不透明的效果時咪辱,很可能會遇到不透明的物體無法在透明物體后邊顯示出來振劳,這種情況有可能是由shader渲染順序造成的,Queue的值會有以下幾種:
//1.BackGround--最早被調用的渲染油狂,用來渲染天空盒或者背景
//2.Geometry--這個是默認值历恐,用來渲染不透明的物體
//3.Transparent--從后往前的順序渲染透明物體
//4.Overlay--用來渲染疊加效果,是渲染的最后階段
//5.以上的值都對應了一個整數(shù)
//BackGround--1000
//Geometry--2000
//Transparent--3000
//Overlay--4000
//"Queue"="Transparent"+100表示在Transparent之后100的值的Queue上調用专筷,這樣的話就可以通過調整Queue的值弱贼,來確保某些物體一定在另一個物體之前或之后渲染
Tags{"Queue"="Transparent"}
//透明度的混合
BlendsrcAlphaOneMinusSrcAlpha
//SubShader包裝了一個渲染方案,而方案的執(zhí)行是由pass來完成的磷蛹,故可以包含多個pass吮旅,而每個pass包含了渲染一個幾何體的具體代碼
Pass{
Material{
//漫反射顏色
Diffuse[_Color]
//環(huán)境光顏色
Ambient[_Color]
//加亮時光澤度0-1之間,如果為0效果為漫反射的顏色弦聂,1的時候會得到一個細微的亮斑
Shininess[_Shininess]
//物體反射高光的顏色
Specular[_SpecColor]
//自發(fā)光的顏色
Emission[_Emission]
}
//開啟燈光
LightingOn
//開啟頂點光照的平行高光的顏色
SeparateSpecularOn
//設置紋理
SetTexture[_MainTex]{
//紋理的顏色
ConstantColor[_Color]
//混合效果
Combinetexture*?primary?DOUBLE,texture*Constant
}
}
}
FallBack"Diffuse"
}