Vertex And Fragment Shader(顶点和片段着色器)
Shader "Unlit/ Vertex_And_Fragment_Shader "
{
Properties
{
_MainColor("主颜色", color) = (1, 1, 1, 1)
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100
Pass
{
//固定的一些格式
Tags{"LightModel" = "ForwardBase"}
CGPROGRAM
//声明为顶点着色器 vertex 关键字 vert是顶点着色器渲染时执行的函数
#pragma vertex vert
//声明为片段着色器 fragment 为关键字 frag是片段着色器渲染时执行的函数
#pragma fragment frag
//调用的unity中的指令(标签)
#include "UnityCG.cginc"
#include "Lighting.cginc"
//应用阶段数据 获取应用阶段的数据 模型的顶点颜色 法线 切线之类的数据
struct appdata
{
//float4 变量的属性 vertex是变量名 POSITION是一个语义 作用:把模型空间的顶点位置放入前面的变量中 这个语义可以自动填充
float4 vertex : POSITION;
float3 normal : NORMAL;//获取模型的顶点法线
};
//V To F 顶点着色器的数据传递给片段着色器
struct v2f
{
//SV_POSITION 也是一个语义 规定变量只能接收投影空间下的顶点位置
float4 vertex : SV_POSITION;
fixed3 col:Color0; //得到颜色传到片段着色器
};
float4 _MainColor; //声明主颜色
v2f vert (appdata v)
{
v2f o; //得到v2f数据
o.vertex = mul(UNITY_MATRIX_MVP, v.vertex); //获得position
//归一化后的光照方向向量
float3 LiaghtDir = normalize(ObjSpaceLightDir(v.vertex));
//对顶点的法线方向向量和光照方向向量进行点积
float Ndotl =saturate(dot(normalize(v.normal), LiaghtDir));
//环境光、unity自带光线、主颜色叠加
fixed3 diffus = Ndotl*_LightColor0.rgb + UNITY_LIGHTMODEL_AMBIENT.rgb+_MainColor.rgb;
o.col = diffus; //赋值
return o;
}
fixed4 frag (v2f i) : SV_Target //SV_Target 缓冲区
{
return fixed4 (i.col, 1); //渲染到窗口
}
ENDCG
}
}
}
注:POSITION、SV_POSITION等是Unity为了方便对模型数据的传输,进行了特别的含义规定。语义就是一个赋给Shader输入和输出的字符串,表达了一些参数的含义,也就是让Shader知道从哪里读取数据,并把数据输出到哪里。