顶点 / 片元 着色器
顶点/片元着色器的基本结构:
Shader "MyShaderName" {
Properties {
// 属性
}
SubShader {
// 针对显卡 A 的 SubShader
Pass {
// 设置渲染状态和标签
// 开始CG代码
CGPROGRAM
// 该代码片段的编译指令,如:
#pragma vertex vert
#pragma fragment frag
float4 vert (float4 v : POSITION) : SV_POSITION {
return mul(UNITY_MATRIX_MVP, v);
}
fixed4 frag() : SV_Target {
return fixed4(1.0, 1.0, 1.0, 1.0);
}
ENDCG
}
}
SubShader {
// 针对显卡 B 的 SubShader
}
// 上述SubShader都失败后用于回调的Unity Shader
Fallback "VertexLit"
}
两行编译指令:
#pragma vertex vert
#pragma fragment frag
它们将告诉Unity,哪个函数包含了顶点着色器的代码,哪个函数包含了片元着色器的代码。
更通用的编译指令表示如下:
#pragma vertex funcName1
#pragma fragment funcName2
其中funcName就是我们指定的函数名,我们一般使用vert和frag来定义这两个函数。
顶点着色器vert函数
float4 vert (float4 v : POSITION) : SV_POSITION {
return UnityObjectToClipPos(v);
}
这是顶点着色器代码,逐顶点执行。
vert函数的输入v包含了这个顶点的位置,这是通过POSITION语义指定的。
vert函数返回值是一个float4类型的变量,是该顶点在裁剪空间中的位置。
SV是Systems Value的简写。SV_POSITION语义将告诉Unity,顶点着色器的输出是裁剪空间中的顶点坐标。
return mul(UNITY_MATRIX_MVP, v);
把顶点坐标从模型空间转换到裁剪空间中。UNITY_MATRIX_MVP矩阵是Unity内置的模型·观察·投影矩阵
在unity5.6以上版本会被升级为&