顶点函数和片元函数编写结构:
Shader "MyShader/02_Shader"{
SubShader{
Pass{
CGPROGRAM
//声明顶点函数的函数名,基本作用是完成顶点坐标从模型空间到剪裁空间的转换
#pragma vertex vert
//声明片元函数的函数名,基本作用是返回模型对应的屏幕上每一个像素的颜色值
#pragma fragment frag
//顶点函数
float4 vert(float4 v:POSITION):SV_POSITION{//通过POSITION语义告诉系统我需要顶点坐标,把顶点坐标传给v
//通过SV_POSITION语义用来解释说明返回值,意思是返回值是剪裁空间下的顶点坐标
return UnityObjectToClipPos(v);//矩阵跟点相乘,作用是完成顶点坐标从模型空间到剪裁空间的转换
}
//片元函数
fixed4 frag():SV_Target{//通过SV_Target语义传递给系统的颜色值,传递给系统的颜色
return fixed4(1,0,0,1);
}
ENDCG
}
}
Fallback "VertexLit"
}
使用struct编写:(常用格式)
Shader "MyShader/03_Shader"{
SubShader{
Pass{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
struct av{
float4 ps:POSITION;//告诉Unity把模型空间下的顶点坐标填充给ps
float3 nm:NORMAL;//告诉Unity把模型空间下的法线方向填充给nm
float4 tc0:TEXCOORD0;//告诉Unity把第一套纹理坐标填充给tc0
};
struct vf{
float4 position:SV_POSITION;
fixed3 cl : COLOR;
};
//顶点函数
vf vert(av v){
vf f;
f.position=UnityObjectToClipPos(v.ps);
f.cl=v.nm;
return f ;
}
//片元函数
fixed4 frag(vf f):SV_Target{//通过SV_Target语义传递给系统的颜色值,传递给系统的颜色
return fixed4(f.cl,1);
}
ENDCG
}
}
Fallback "VertexLit"
}
Unity中的语义:
从应用程序传递给顶点函数的语义:
POSITION 模型顶点坐标
NORMAL 法线向量
TANGENT 正交于表面法线的向量(切线)
TEXCOORDi 第i组纹理坐标(也即UV坐标,坐标范围在0-1之间),i是0-7中的一个数字
COLOR 顶点颜色
从顶点函数传递给片元函数的语义:
SV_POSITION 剪裁空间中的顶点坐标(一般是系统直接使用)
COLOR0 可以传递一组值 4个
COLOR1 可以传递一组值 4个
TEXCOORD0~7 传递纹理坐标
从片元函数传递给系统的语义:
SV_Target 颜色值,输出到屏幕上的颜色