Unity Shader 顶点/片元着色器的基本结构
Shader "MyShaderName"{
Properties{
//属性
}
SubShader{
//针对显卡A的SubShader
Pass{
//设置渲染状态和标签
//开始CG代码片段
CGPROGRAM
//该代码片段的编译指令,例如:
#pragma vertex vert
#pragma fragment frag
//CG代码写在这里
ENDCG
//其他设置
}
//其它需要的Pass
}
SubShader{
//针对显卡B的SubShader
}
//上述SubShader都失败后用于回调的Unity Shader
Fallback "VertexLit"
}
一个简单的顶点/片元着色器代码:
Shader "Custom/SimpleWhiteShader"{
SubShader{
Pass{
CGPROGRAM
#pragma vertex vert //指定vert函数是顶点着色器代码
#pragma fragment frag //指定frag函数是片元着色器代码
float4 vert(float4 v:POSITION):SV_POSITION{
return UnityObjectToClipPos(v);
}
fixed4 frag():SV_Target{
return fixed4(1.0,1.0,1.0,1.0);
}
ENDCG
}
}
Fallback "VertexLit"
}
传递法线、纹理坐标给片元着色器:
Shader "Custom/SimpleStructShader"{
SubShader{
Pass{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
struct a2v{
float4 vertex:POSITION; //模型空间顶点坐标
float3 normal:NORMAL; //模型空间顶点的法线
float4 texcoord:TEXCOORD0; //模型空间顶点的纹理0坐标
};
struct v2f{
float4 pos:SV_POSITION;
float3 color:COLOR0;
};
v2f vert(a2v v){
v2f o;
//v.normal包含了顶点的法线方向,其分量范围在[-1.0,1.0]
//下面的代码把分量范围映射到了[0.0,1.0]
//存储到o.color中传递给片元着色器
o.pos=UnityObjectToClipPos(v.vertex);
o.color=v.normal*0.5+fixed3(0.5,0.5,0.5);
return o;
}
fixed4 frag(v2f i):SV_Target{
//将插值后的i.color显示到屏幕上
return fixed4(i.color,1.0);
}
ENDCG
}
}
Fallback "VertexLit"
}