模型空间---》世界空间---》观察空间---》裁剪空间---》屏幕空间
矩阵变换:
CG语言使用的是行优先的方法。unity脚本中Matrix使用的是列优先方法;
WPOS cg中对屏幕坐标的定义;VPOS是HLSL中对屏幕坐标的语义。
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
Shader "Custom/1"
{
Properties
{
_Color("Color",Color)=(1.0,1.0,1.0,1.0)
}
SubShader
{
Pass{
CGPROGRAM
//CG代码
//指定着色器编译指令 vertex 顶点着色器 fragment 片元着色器
//#program 着色器 name
#program vertex vert;
#program fragment frag;
//引用properties中定义的属性
float4 _Color;
//用结构体定义顶点着色器的输入 访问到模型的顶点位置、法线、切线、纹理坐标、顶点颜色等
//unity 语义 :作为输入时,根据他来填充结构体 从哪来?由材质Mesh Render组件提供 每帧调用Draw Call时,它会负责将渲染的模型数据发送给unity Shader.
struct a2v{
float4 vertex:POSITION;//用模型顶点填充vertex变量
float3 normal:NORMAL;//用模型法线方向填充normal
float4 texcoord: TEXCOORD0;//用模型第一套纹理坐标填充texcoord变量
}
//输出结构体 在顶点着色器和片元着色器之间传递信息
struct v2f{
//SV_POSITION 包含了裁剪空间中的位置信息 必须包含 不然无法传递裁剪空间顶点信息,也无法渲染到屏幕
float4 pos:SV_POSITION;
//COLOR0 语义存储颜色信息
fixed3 color:COLOR0;
}
//逐顶点执行 输入v包含这个顶点的位置 通过POSITION语义指定
//SV_POSITION 语义:返回该顶点在裁剪空间的位置信息
float4 vert(a2v v):SV_POSITION{
v2f vf;
//模型空间转换为裁剪空间
vf.pos=mul(UNITYMATRIX_MVP,v.vertex);
//v.normal 包含模型顶点的法线 范围在[-1.0,1.0]
//
vf.color=v.normal*0.5+fixed(0.5,0.5,0.5);
return vf;
}
//SV_Target 语义:表示输出颜色存储到渲染目标,默认输出到帧缓存
//(0,0,0,0)表示黑色 (1,1,1,1)表示白色 所有颜色分量在[0,1]之间
//逐片元执行 片元的输入实际上是把顶点着色器的输出插值后得到的结果
fixed4 frag(v2f v):SV_Target{
fixed3 c=v.color;
//使用属性_Color控制颜色属性变换
c*=_Color;
return fixed4(c,1.0);
}
ENDCG
}
}
FallBack "Diffuse"
}