说明:
Unity的Shader分为三类:
- Fixed function shader——属于固定渲染管线Shader, 基本用于高级Shader在老显卡无法显示时的Fallback。
- Vertex and Fragment Shader——属于Unity常见Shder之一,可编程渲染管线.。
- Surface Shade——属于Unity常见Shader之一,使用Unity预制的光照模型来进行光照运算。
主要说明一下Vertex and Fragment Shader与Surface Shade的一些常见性质,对总搞不清这两种常见可编程Shader的童鞋们科普一下。
Vertex and Fragment Shader与Surface Shade的共同点:
- 必须从唯一一个根Shader开始
- 可以设置Properties参数部分,作用及语法完全相同
- 具体功能都在SubShader里(Subshader: 子Shader,Shader会自上而下运行第一个硬件能支持的Subshader,主要作用是对不用硬件的支持。)
- 都可以打标签,例如Tags { "RenderType" = "Opaque" } LOD100 等
- 都可以设置Fallback,如“Fallback "Legacy Shaders/Transparent/VertexLit"”
- 都可以处理基本的功能,例如光照漫反射(Diffuse)以及镜面反射(Specular)。
Vertex and Fragment Shader与Surface Shade的差异:
- Vertex and Fragment Shader在subshader下面还有pass{}
- Surface Shader,由于已经将具体内容打包在光照模型了,不能加pass{},加了会报错。
- Vertex and Fragment Shader的核心是:
CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" ENDCG
Surface Shader的核心:
<pre name="code" class="html">CGPROGRAM #pragma surface surf Lambert ENDCG
Surface Shader是Unity3d自带光照模型Lambert,也不做顶点处理,那么只需要一个表面处理函数surf即可
Surface Shade标准的输出结构的三种:
SurfaceOutput
struct SurfaceOutput
{
<span style="white-space:pre"> </span>fixed3 Albedo; // 漫反射颜色
<span style="white-space:pre"> </span>fixed3 Normal; // 切线空间法线,如果赋值的话
<span style="white-space:pre"> </span>fixed3 Emission;
<span style="white-space:pre"> </span>half Specular; // 高光强度,范围是0-1
<span style="white-space:pre"> </span>fixed Gloss; // specular intensity
<span style="white-space:pre"> </span>fixed Alpha; // 透明度
};
SurfaceOutputStandard
struct SurfaceOutputStandard
{
fixed3 Albedo; // 基础 (漫反射或镜面反射) 颜色
fixed3 Normal; // 切线空间法线,如果赋值的话
half3 Emission;
half Metallic; // 0=非金属, 1=金属
half Smoothness; // 0=粗糙, 1=光滑
half Occlusion; // 遮挡(默认1)
fixed Alpha; // 透明度
};
SurfaceOutputStandardSpecular
struct SurfaceOutputStandardSpecular
{
fixed3 Albedo; // 漫反射颜色
fixed3 Specular; // 镜面反射颜色
fixed3 Normal; // 切线空间法线,如果赋值的话
half3 Emission;
half Smoothness; // 0=粗糙, 1=光滑
half Occlusion; // 遮挡(默认1)
fixed Alpha; // 透明度
};