从应用程序传递到顶点函数的语义有 a2v:
POSITION 顶点坐标 (模型空间下)
NORMAL 法线 (模型空间下)
TANGENT 切线 模型空间下
TEXCOORD0~n 纹理坐标
COLOR 顶点颜色
从顶点函数传递给片元函数时候可以使用的语义:
SV_POSITION 剪裁空间中的顶点坐标(一般是系统直接使用)
COLOR0 可以传递一组值 4个 颜色
COLOR1 可以传递一组值 4个
TEXTCOORD0~7 传递纹理坐标
片元函数传递给系统:
SV_Target 颜色值,显示到屏幕上的颜色值
一些着色器的简单写法:
Shader"ff"{
SubShader{
Pass{
CGPROGRAM
//顶点函数 这里只是声明了顶点函数的函数名 确定位置
//基本作用是完成顶点坐标从模型空间到剪裁空间(从游戏环境转换到视野相机屏幕上)
#pragma vertex vert
//片元函数 处理像素 返回颜色值
//基本作用 返回模型对应屏幕上的每一个像素的颜色值
#pragma fragment frag
float4 vert(float4 v : POSITION) :SV_POSITION{//通过语义告诉系统参数的用处 , 比如POSITION是告诉系统我需要顶点坐标
//SV_POSITION 这个语意是返回给剪裁空间下的顶点坐标
return UnityObjectToClipPos(v);//把模型空间下的顶点信息转换到剪裁空间下
}
fixed4 frag():SV_Target{
return fixed4(1,1,1,1);
}
ENDCG
}
}
Fallback "VertexLit"
}
第二种:
Shader"ff3" {
SubShader{
Pass{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
struct a2v {
float4 vertex:POSITION;//告诉unity把模型空间下的顶点坐标填充给 vertex
float3 normal:NORMAL;//告诉unity 把模型空间下的法线方向填充给normal
float4 texcoord : TEXCOORD0;//告诉UNITY把第一套纹理坐标填充给texcoord
};
struct v2f {
float4 position : SV_POSITION;
float3 temp:COLOR0;//这个语义可以由用户自己定义,一般用来存储颜色 };
v2f vert(a2v v) {//效果的计算放在顶点函数里 顶点之外的点是通过插值来计算的 性能高 但是效果一般
v2f f;
f.position = UnityObjectToClipPos(v.vertex);
f.temp = v.normal;
return f;
}
fixed4 frag(v2f f) : SV_Target{
return fixed4(f.temp,0);
}
ENDCG
}
}
Fallback "VertexLit"
}