一个最简单的顶点片元着色器
顶点片元的基本结构
Shader "ShaderStruct"{
Properties{
//属性
}
SubShader
{
//针对显卡A的SubShader
Pass
{
//设置渲染状态和标签
//开始CG代码片段
CGPROGRAM
//代码片段的编译指令
#pragma vertex vert
#pragma fragment frag
//cg代码
ENDCG
//其他设置
}
//其他Pass
}
SubShader
{
//针对显卡B的SubShader
}
//上述SubShader都失败后用于回调的UnityShader
Fallback "VertexLit"
}
增加顶点片段着色器对应的方法
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
Shader "SimpleShader"{
Properties{
//属性
}
SubShader
{
//针对显卡A的SubShader
Pass
{
//设置渲染状态和标签
//开始CG代码片段
CGPROGRAM
//代码片段的编译指令
#pragma vertex vert
#pragma fragment frag
//cg代码
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
//其他设置
}
//其他Pass
}
//上述SubShader都失败后用于回调的UnityShader
Fallback "VertexLit"
}
代码第一行通过Shader语义定义UnityShader名字 这个Shader并没有使用Properties块,不是必需的。然后声明了SubShader和Pass语义块,这个例子中不需要任何渲染状态和标签,因此SubShader将使用默认的渲染状态和标签设置,Pass中我们同样没有进行任何自定义的渲染设置和标签设置。接下来是 CGPROGRAM和ENDCG包围的CG片段,首先两个编译指令
#pragma vertex vert
#pragma fragment frag
告诉Unity 哪个函数包含了顶点着色器代码,哪个函数包含了片元着色器代码
接下来具体看一下vert函数的定义
float4 vert(float4 v: POSITION): SV_POSITION
{
return mul(<