一:
CG的入口为Subshader,
其中有若干pass, 依次产生效果(基于计算机硬件)
若某一个PASS不能产生应有的效果,则跳过此PASS
二:
CGPOGRAM 表示CG代码段开始
CGEND 表示CG代码段结束
三:
每个CG代码段都必须有
#pragma vertex xxx
#pragma fragment xxx
表示顶点 与片元的入口
顶点函数: 将模型上的点转化为裁剪窗口上的点
片元函数: 返回模型上对应屏幕上的像素颜色
Shader "YCB/02 shader"{
SubShader{
Pass{
CGPROGRAM
//顶点函数 从顶点坐标-》裁剪窗口(游戏环境->摄像机)
#pragma vertex vert
//片元函数 返回模型上对应屏幕上的像素的颜色
#pragma fragment frag
float4 vert(float4 v:POSITION):SV_POSITION{ //通过语义告诉系统,这个参数的作用,比如postion告知系统需要顶点坐标
//SV_POSTION这个语义用来解释说明返回值,意思是返回值是裁剪窗口下的坐标
//float4 pos=mul(UNITY_MATRIX_MVP,v);
//return pos;
return mul(UNITY_MATRIX_MVP,v);
}
//上部分代码等价于:
fixed4 frag():SV_Target{
return fixed4(0.55,0.1,0.1,1);
}
ENDCG
}
}
Fallback "VertexLit"
}
结构体的使用:
Shader "YCB/03 shader"{
SubShader{
Pass{
CGPROGRAM
//顶点函数 从顶点坐标-》裁剪窗口(游戏环境->摄像机)
#pragma vertex vert
//片元函数 返回模型上对应屏幕上的像素的颜色
#pragma fragment frag
//替换部分代码等价于:
struct a2v {
float4 vertex:POSITION;
};
float4 vert(a2v v) :SV_POSITION{
return mul(UNITY_MATRIX_MVP,v.vertex);
}
fixed4 frag():SV_Target{
return fixed4(0.55,0.5,0.5,1);
}
ENDCG
}
}
Fallback "VertexLit"
}
添加法线:
Shader "YCB/03 shader"{
SubShader{
Pass{
CGPROGRAM
//顶点函数 从顶点坐标-》裁剪窗口(游戏环境->摄像机)
#pragma vertex vert
//片元函数 返回模型上对应屏幕上的像素的颜色
#pragma fragment frag
//application to vertex
struct a2v {
float4 vertex:POSITION;
float3 normal : NORMAL;
float4 texcoord :TEXCOORD0;
};
//vertex to fragment
struct v2f{
float3 tmp:COLOR0;
float4 position : SV_POSITION;
};
v2f vert(a2v v) {
v2f f;
f.position = mul(UNITY_MATRIX_MVP,v.vertex);
f.tmp=v.normal;
return f;
}
fixed4 frag(v2f f):SV_Target{
return fixed4(f.tmp,1);
}
ENDCG
}
}
Fallback "VertexLit"
}