//頂點(diǎn)片段著色器
//流程:
//1.首先,vertexprogram收到系統(tǒng)傳遞給它的數(shù)據(jù)模型
//2.然后把這些數(shù)據(jù)處理成我們后續(xù)需要的數(shù)據(jù)(至少包含頂點(diǎn)的位置信息)進(jìn)行輸出,其他的數(shù)據(jù)還有
//紋理的UV坐標(biāo),以及其他需要傳遞給fragment,program的數(shù)據(jù)
//3.系統(tǒng)對(duì)vertexprogram輸出的頂點(diǎn)數(shù)據(jù)進(jìn)行插值,并將插值結(jié)果傳遞給fragment,program
//4.最后,fragment,program根據(jù)這些插值結(jié)果計(jì)算成屏幕上顯示的像素顏色
Shader"CustomLearn/Fourth"{
Properties{
_myColor("Color",color)?=?(1,1,1,1)
_outLine("OutLine",Range(0,1))?=0.1
}
SubShader{
//渲染不透明物體,渲染類型:非透明物體不受投影的影響
Tags{"Queue"="Geometry""RendererType"="Qpaque""IgnoreProject"="True"}
//第一通道
Pass{
CGPROGRAM
//告訴程序定義了一個(gè)頂點(diǎn)著色器
#pragmavertexvert
//告訴程序定義了一個(gè)片段著色器
#pragmafragmentfrag
//使用頂點(diǎn)和片段的CG時(shí),需要引入頭文件,相當(dāng)于引入C#的命名空間
#include"UnityCG.cginc"
fixed4_myColor;
//定義vertextofragment結(jié)構(gòu)體
//v2f表示:頂點(diǎn)程序到片段程序的信息傳遞,這里傳遞的是位置和顏色的參數(shù)
//頂點(diǎn)著色器將計(jì)算color并輸出給片段著色器
structv2f{
//還有一些其他成員變量
//1.float4vertex:POSITION頂點(diǎn)/位置
//2.float3normal:NORMAL頂點(diǎn)法線
//3.float4texcoord:TEXCOORD0第一UV坐標(biāo)
//4.float4texcoord:TEXCOORD1第二UV坐標(biāo)
//5.float4tangent:TANGENT切線向量(一般用在法線貼圖中)
//6.float4color:COLOR每個(gè)頂點(diǎn)的顏色
float4pos:SV_POSITION;
float3color:COLOR;
};
//頂點(diǎn)函數(shù),參數(shù)是一個(gè)結(jié)構(gòu)體返回值也是一個(gè)結(jié)構(gòu)體
//appdata_full是UnityCG.cginc的結(jié)構(gòu)體類型
//結(jié)構(gòu)體里面的類型有:
//appdata_base:包含頂點(diǎn)位置,法線和一個(gè)紋理坐標(biāo)
//appdata_full:包含頂點(diǎn)位置,切線,法線和兩個(gè)紋理坐標(biāo)
//appdata_tan:包含頂點(diǎn)位置,切線,法線和一個(gè)紋理坐標(biāo)
//appdata_img:包含位置和一個(gè)紋理坐標(biāo)
v2f?vert(appdata_full?v)?{
v2f?o;
//UNITY_MATRIX_MVP:當(dāng)前模型視圖投影矩陣
//UNITY_MATRIX_MV:當(dāng)前模型視圖矩陣
//UNITY_MATRIX_V:當(dāng)前視圖矩陣
//UNITY_MATRIX_P:當(dāng)前投影矩陣
//UNITY_MATRIX_VP:當(dāng)前視圖投影矩陣
//UNITY_MATRIX_T_MV:轉(zhuǎn)置模型+視圖模型
//UNITY_MATRIX_IT_MV:逆轉(zhuǎn)置模型+視圖模型
//mul是矩陣相乘的方法
o.pos?=mul(UNITY_MATRIX_MVP,v.vertex);
//彩虹色
o.color=?v.vertex*0.8+0.5;
//純色
//o.color=v.normal*0.4+0.5;
returno;
}
//片段函數(shù)參數(shù)是v2f的結(jié)構(gòu)體,返回值是fixed4類型
fixed4frag(v2f?i):COLOR{
returnfixed4(i.color*?_myColor,1);
}
ENDCG
}
//第二通道
Pass{
Name"Border"
Tags{"LightModel"="ForwadBase"}
//前方剔除
CULLFront
LightingOn
CGPROGRAM
#pragmavertexvert
#pragmafragmentfrag
//編譯指令:編譯正向渲染基礎(chǔ)的通道
//用于正向渲染中,應(yīng)用環(huán)境光照,主方向光照和頂點(diǎn)所需要的變體
//這些變體用于處理不同的光源模型貼圖,主要方向光照的陰影選項(xiàng)的開關(guān)與否
#pragmamulti_compile_fwdbase
#include"UnityCG.cginc"
float_outLine;
structa2v?{
float4vertex:POSITION;
float3normal:NORMAL;
};
structv2f?{
float4pos:POSITION;
};
//頂點(diǎn)函數(shù)
v2f?vert(a2v?v)?{
v2f?o;
float4pos?=mul(UNITY_MATRIX_MV,v.vertex);
float3normal=mul(UNITY_MATRIX_IT_MV,v.normal);
pos?=?pos?+float4(normalize(normal),0)*_outLine;
o.pos?=mul(UNITY_MATRIX_P,pos);
returno;
}
//片段函數(shù)
fixed4frag(v2f?i):COLOR{
returnfixed4(0,0,0,1);
}
ENDCG
}
}
FallBack"Diffuse"
}