Shader"Custom/Third"{
Properties{
_Color("MainColor",Color)?=?(1,1,1,1)
_MainTex("Albedo(RGB)",2D)?="White"{}
//光滑度
_Glossiness("Smoothness",Range(0,1))?=0.5
//金屬光澤度
_Metallic("Metallic",Range(0,1))?=0.0
}
SubShader{
//表面著色器可以被若干個標簽所修飾逼庞,通過判斷標簽來決定硬件什么時候該調用著色器趁窃、
//“RendererType”="Opaque"表示渲染不透明的物體
//RendererType賦值有:
//1.Opaque:絕大部分的不透明物體渲染時使用
//2.Transparent:絕大部分的透明物體渲染時使用
//3.BackGround:天空盒
//4.Overlay:用來渲染疊加效果馅巷,鏡頭光暈等
Tags{"RendererType"="Opaque"}
//LOD是LevelofDetail的縮寫尘执,我們能用什么樣的shader由它來決定,如果我們在Unity的QualitySetting中設定最大LOD值小于subshader所指定的值時溪椎,則subshader不可使用
//Unity的Shader制定了一組LOD值普舆,我們在寫shader的時候作為參考,方便以后對設備圖形性能調整校读,和畫質有更精確的控制
//Vertexlitkindofshaders(頂點光照類型的shader)=100
//Diffuse(漫反射)=200
//ReflectiveBumpedUnlit(凸起反射不發(fā)光)=250
//ReflectiveBumpedVertexlit(頂點反射不發(fā)光)=250
//Bumped,Specular(凸起沼侣,高光)=300
//凹凸高光=400
//Parallax(視差)=500
//ParallaxSpecular(視差高光)=600
LOD200
//表面著色器的實現(xiàn)代碼必須放在CGPROGRAM...ENDCG代碼塊中,而不是放在pass里邊
//CG(NVIDIA公司開發(fā)的cforgraphic計算機圖形編程C語言封裝)
//CG程序可以根據運行時的需要或者事先編譯成GPU匯編代碼
CGPROGRAM
//這是一條編譯指令歉秫,它聲明了我們要寫一個表面著色器蛾洛,并且制定了光照模型,語法如下
//#pragrmsurfacesurfaceFunctionlightModel[optionparams]
//surface:聲明一個表面著色器
//surfaceFunction:著色器方法的名字
//lightModel:使用光照的模型
//optionparams:可選參數(shù)雁芙,包括透明度轧膘,頂點與顏色钞螟,投影等等
#pragmasurfacesurfStandardfullforwardshadows
//使用shader3.0版本可以得到更好的光照效果
#pragmatarget3.0
//sampler2D是GPU中2D貼圖的類型,還有sampler3D扶供,samplerCUBE等
//所實例化的shader是由兩個獨立的塊組成筛圆,屬性聲明和回調都是unity,可以直接使用和編譯的shader
//在CG代碼塊中椿浓,想要訪問在properties中所定義的變量的話,必須聲明和屬性變量名相同的名字進行使用
//sampler2DMainTex其實就是關聯(lián)了屬性_MainTex闽晦,之后CG程序就可以使用它了
sampler2D_MainTex;
//結構體扳碍,float2和vector2一樣,里面存放了兩個float類型的屬性仙蛉,可以使用變量名.x的方式獲得某個值
//在CG程序中制定一個貼圖變量前加uv字樣笋敞,就代表提取它的uv值(其實就是兩個代表貼圖上的二維坐標點)所需要參與計算的數(shù)據
structInput?{
//輸入結構體重一般包含著色器所需要的紋理坐標,命名規(guī)范:uv+紋理名稱
//當使用第二紋理荠瘪,命名為:uv2+紋理名稱
//輸入結構體中還有其他成員變量
//float3viewDir:視角方向
//float4COLOR:每個頂點的顏色差值
//float4screenPos:屏幕坐標(使用.xy/.wh來獲取屏幕2D坐標)
//float3worldRefl:世界坐標系中反射向量
//float3worldNormal:世界坐標系中法線向量
float2uv_MainTex;
};
half_Glossiness;
half_Metallic;
fixed4_Color;
//CG規(guī)定了表面著色器代碼方法的參數(shù)類型和名字
//語法結構
//voidsurf(InputIN,inoutSurfaceOutputStandardo)
//其作用是結構輸入的uv或者附加數(shù)據夯巷,然后進行處理,最后將結構填充到輸出結構體中哀墓,所以只能按照規(guī)定來寫
//參數(shù)1:Input:是我們需要定義的輸入結構體趁餐,可以吧所需要參與計算的數(shù)據放到這個結構體中,傳入方法使用
//參數(shù)2:inout:SurfaceOutput定義輸出結構體的類型篮绰,需要把方法里面得到的結果賦值給該結構體里面的成員變量即可完成著色
//SurfaceOutput的輸出結果結構定義如下:
//half3Albedo:像素的顏色
//half3Normal:法線
//half3Emission:自發(fā)光后雷,不受光照影響
//halfSpecular:高光指數(shù)
//halfGloss:光澤度
//halfAlpha:透明度
//SurfaceOutPutStandard輸出結果定義如下:
//fixed3Albedo:基礎顏色
//fixed3Normal:切線空間法線
//halfSmoothness:是否光滑,0=粗糙,1=光滑
//halfMetallic:是否有金屬光澤吠各,0=非金屬臀突,1=金屬
//halfOcclusion:遮擋(默認為1)
//fixedAlpha:透明度
voidsurf?(Input?IN,inoutSurfaceOutputStandard?o)?{
//Albedocomesfromatexturetintedbycolor
//tex2D方法是CG程序中用來在一張貼圖中對一個點進行采樣的方法
//返回一個fixed4類型
//這里是對_MainTex在輸入點上進行采樣
fixed4c?=tex2D(_MainTex,?IN.uv_MainTex)?*?_Color;
//把采樣的顏色賦值給輸出的顏色
o.Albedo?=?c.rgb;
//Metallicandsmoothnesscomefromslidervariable
//金屬
o.Metallic?=?_Metallic;
//光滑
o.Smoothness?=?_Glossiness;
//透明度
o.Alpha?=?c.a;
}
ENDCG
}
FallBack"Diffuse"
}