一个最简单的shader
该shader仅仅实现了物体的点映射到裁剪空间,并给了一个纯白色的值。
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
Shader "Unlit/Chapter5_SimpleShader"
{
SubShader
{
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
// 指明哪个函数包含了顶点着色器的代码,哪个函数包含了片元着色器的代码
float4 vert(float4 v:POSITION):SV_POSITION
{
return UnityObjectToClipPos(v);
}//POSITION语义指明把模型的顶点坐标填充到输入函数v中,SV_POSITION告诉Unity顶点着色器的输出是裁剪空间的顶点坐标。
fixed4 frag () : SV_Target
{
return fixed4(1.0,1.0,1.0,1.0);
}
ENDCG
}
}
}
在每帧调用Draw Call的时候,Mesh Render组件会把它负责渲染的模型数据发送给Unity Shader
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
Shader "Unlit/Chapter5_SimpleShader"
{
SubShader
{
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
// make fog work
struct a2v {
float4 vertex:POSITION;
float3 normal:NORMAL;
float4 texcoord:TEXCOORD0;
};//用一个结构体来定义顶点着色器的输入
float4 vert(a2v v):SV_POSITION
{
return UnityObjectToClipPos(v.vertex);
}
fixed4 frag () : SV_Target
{
return fixed4(1.0,1.0,1.0,1.0);
}
ENDCG
}
}
}
顶点着色器和片元着色器之间如何通信
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
Shader "Unlit/Chapter5_SimpleShader"
{
SubShader
{
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
// make fog work
struct a2v {
float4 vertex:POSITION;
float3 normal:NORMAL;
float4 texcoord:TEXCOORD0;
};
//使用一个结构体来定义顶点着色器的输出
struct v2f{
float4 pos:SV_POSITION;
fixed3 color:COLOR0;
};
v2f vert(a2v v)
{
v2f o;
o.pos=UnityObjectToClipPos(v.vertex);
o.color=v.normal*0.5 + fixed3(0.5,0.5,0.5);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
return fixed4(i.color,1.0);
}
ENDCG
}
}
}
使用属性
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
Shader "Unlit/Chapter5_SimpleShader"
{
Properties{
_Color("Color Tint",Color)=(1.0,1.0,1.0,1.0)
}
SubShader
{
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
// make fog work
fixed4 _Color;
struct a2v {
float4 vertex:POSITION;
float3 normal:NORMAL;
float4 texcoord:TEXCOORD0;
};
struct v2f{
float4 pos:SV_POSITION;
fixed3 color:COLOR0;
};
v2f vert(a2v v)
{
v2f o;
o.pos=UnityObjectToClipPos(v.vertex);
o.color=v.normal*0.5 + fixed3(0.5,0.5,0.5);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
fixed3 c=i.color;
c *=_Color.rgb;
return fixed4(c,1.0);
}
ENDCG
}
}
}
SV开头的代表的是系统数值(system-value),这些语义在渲染流水线上有特殊的含义,用这些语义描述的变量是不可以随便赋值的。