一下内容主要来自冯乐乐的《unity shader 入门精要》,学习笔记,这里斗胆作为原创发表。
写在SubShader语义块中的代码是表面着色器的做法,
写在Pass语义块的代码是顶点/片元着色器和固定函数着色器的做法
而所有真正意义上的Shader代码都需要包含在ShaderLab语义块中,
Surface Shader示例:
Shader "Custom/Simple Surface Shader"
{
SubShader {
Tags{"RenderType"="Opaque"}
CGPROGRAM
#pragma surface surf Lambert
struct Input
{
float4 color:COLOR;
};
void surf (Input IN,inout SurfaceOutput o)
{
o.Albedo=1;
}
ENDCG
}
FallBack "Diffuse"
}
从中可以看出表面着色器被定义在SubShader语义块中的
CGPROGRAM和ENDCG之间,这样就不需要开发者关系使用多少个
Pass,每个Pass如何渲染等问题
然后下面是一个非常简单的顶点/片元着色器代码示例:
SubShader{
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
float4 vert(float4 v : POSITION):SV_POSITION
{
return mul (UNITY_MATRIX_MVE,V);
}
fixed4 frag():SV_Target
{
return fixed4 (1.0,0.0,0.0,1.0);
}
ENDCG
}
}
最后是固定函数着色器的代码示例:
Shader "Tutorial/Basic"
{
Properties
{
_Color("Main Color",Color)=(1,0.5,0.5,1)
}
SubShader
{
Pass
{
Material
{
Diffuse[_Color]
}
Lighting On
}
}
}
固定函数的代码是被定义在Pass语义块中,而且我们需要完全使用ShaderLab的语法,
而非CG/HLSL。