//顶点片段着色器
//流程:
//1.首先,vertexprogram收到系统传递给它的数据模型
//2.然后把这些数据处理成我们后续需要的数据(至少包含顶点的位置信息)进行输出,其他的数据还有
//纹理的UV坐标,以及其他需要传递给fragment,program的数据
//3.系统对vertexprogram输出的顶点数据进行插值,并将插值结果传递给fragment,program
//4.最后,fragment,program根据这些插值结果计算成屏幕上显示的像素颜色
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
//告诉程序定义了一个顶点着色器
#pragmavertexvert
//告诉程序定义了一个片段着色器
#pragmafragmentfrag
//使用顶点和片段的CG时,需要引入头文件,相当于引入C#的命名空间
#include"UnityCG.cginc"
fixed4_myColor;
//定义vertextofragment结构体
//v2f表示:顶点程序到片段程序的信息传递,这里传递的是位置和颜色的参数
//顶点着色器将计算color并输出给片段着色器
structv2f{
//还有一些其他成员变量
//1.float4vertex:POSITION顶点/位置
//2.float3normal:NORMAL顶点法线
//3.float4texcoord:TEXCOORD0第一UV坐标
//4.float4texcoord:TEXCOORD1第二UV坐标
//5.float4tangent:TANGENT切线向量(一般用在法线贴图中)
//6.float4color:COLOR每个顶点的颜色
float4pos:SV_POSITION;
float3color:COLOR;
};
//顶点函数,参数是一个结构体返回值也是一个结构体
//appdata_full是UnityCG.cginc的结构体类型
//结构体里面的类型有:
//appdata_base:包含顶点位置,法线和一个纹理坐标
//appdata_full:包含顶点位置,切线,法线和两个纹理坐标
//appdata_tan:包含顶点位置,切线,法线和一个纹理坐标
//appdata_img:包含位置和一个纹理坐标
v2f vert(appdata_full v) {
v2f o;
//UNITY_MATRIX_MVP:当前模型视图投影矩阵
//UNITY_MATRIX_MV:当前模型视图矩阵
//UNITY_MATRIX_V:当前视图矩阵
//UNITY_MATRIX_P:当前投影矩阵
//UNITY_MATRIX_VP:当前视图投影矩阵
//UNITY_MATRIX_T_MV:转置模型+视图模型
//UNITY_MATRIX_IT_MV:逆转置模型+视图模型
//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;
}
//片段函数参数是v2f的结构体,返回值是fixed4类型
fixed4frag(v2f i):COLOR{
returnfixed4(i.color* _myColor,1);
}
ENDCG
}
//第二通道
Pass{
Name"Border"
Tags{"LightModel"="ForwadBase"}
//前方剔除
CULLFront
LightingOn
CGPROGRAM
#pragmavertexvert
#pragmafragmentfrag
//编译指令:编译正向渲染基础的通道
//用于正向渲染中,应用环境光照,主方向光照和顶点所需要的变体
//这些变体用于处理不同的光源模型贴图,主要方向光照的阴影选项的开关与否
#pragmamulti_compile_fwdbase
#include"UnityCG.cginc"
float_outLine;
structa2v {
float4vertex:POSITION;
float3normal:NORMAL;
};
structv2f {
float4pos:POSITION;
};
//顶点函数
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;
}
//片段函数
fixed4frag(v2f i):COLOR{
returnfixed4(0,0,0,1);
}
ENDCG
}
}
FallBack"Diffuse"
}
网友评论