shader刚学一点点,做个笔记
Properties
{
属性 可以在外部调节类似于C#中 public int a;
_Color("_Color",color)=(1,1,1,1)
属性(外部显示的名称,类型)=值
}
// SubShader可以有很多个 显卡运行效果的时候 从第一个Shader开始,
// 如果第一个SubShader里面的效果都可以实现,那么就使用第一个SubShader
// 如果显卡发现这个SubShader里面的效果它实现不了 他会自动执行下一个SubShader
SubShader
{
Pass // 一个Pass相当于一个方法
{
CGPROGRAM
…
ENDCG
}
}
语义:
应用阶段到顶点着色器时用常用的语义如下:
POSITION:模型空间中的顶点坐标
NORMAL:模型空间中的法线方向
TANGENT:模型空间中的切线方向
TEXCOORDn:模型空间中第n组纹理坐标
COLOR:模型空间中顶点的颜色
顶点着色器传递数据给片元着色器时常用的语义如下:
SV_POSITION:裁剪空间中的顶点坐标
COLOR0:输出第一组顶点颜色,不是必须
COLOR1:输出第二组顶点颜色,不是必须
TEXCOORDn:输出第n组纹理坐标,不是必须
片元着色器输出数据到unity阶段常用的语义如下:
SV_Target:输出值存储到渲染目标中。
可以把语义写在结构体中
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; temp用来存法线位置
return f;
}
float frag(v2f f) : SV_Target 输出值存储到渲染目标中
{
return fixed4(f.temp,1);
}
在unity5.6以上版本中,shader中的UNITY_MATRIX_MVP将会被UnityObjectToClipPos替代