UnityShaderLab笔记
渲染路径和LightMode的关系
不同的LightMode被选择的顺序
-
VertexLit渲染路径下Pass的执行
只有含有LightMode=Vertex的Pass会被执行
-
Forward渲染路径下Pass的执行
包含了针对Forward渲染路径的Pass都会被执行,若没有包含针对Forward渲染路径的Pass可执行,则执行含有针对Vertex渲染路劲的Pass,但是若存在针对Forward渲染路劲的Pass,则不会执行针对VertexLit渲染路径的Pass
-
Defeerd渲染路径下Pass的执行
同上,若存在针对Deferred的Pass可执行,则执行针对Forward的Pass,若还不存在则执行针对VertexLit的Pass
不同的LightMode下"LightMode"="Always"Pass被执行的顺序
AlwaysPass输出红色 ,其他Pass输出绿色
- VertexLit
与AlwaysPass的位置有关,在代码中靠前则先执行,混合颜色后得到黄色
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
Shader "Custom/Deferred_Always.2"
{
Properties{
_MainTex("Base(RGB)",2D)="white"{
}
}
SubShader{
Tags{
"RenderType"="Opaque"}
Pass{
Tags{
"LightMode"="Always"}
Blend One zero
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include"Lighting.cginc"
#include"UnityCG.cginc"
struct v2f
{
float4 pos:SV_POSITION;
float4 color:COLOR;
};
v2f vert(appdata_base v)
{
v2f o;
o.pos=UnityObjectToClipPos(v.vertex);
o.color=float4(0,1,0,1);
return o;
}
float4 frag(v2f i):COLOR
{
return i.color;
}
ENDCG
}
Pass{
Tags{
"LightMode"="Vertex"}
Blend One one
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include"Lighting.cginc"
#include"UnityCG.cginc"
struct v2f
{
float4 pos:SV_POSITION;
float4 color:COLOR;
};
v2f vert(appdata_base v)
{
v2f o;
o.pos=UnityObjectToClipPos(v.vertex);
o.color=float4(1,0,0,1);
return o;
}
float4 frag(v2f i):COLOR
{
return i.color;
}
ENDCG
}
}
}
而AlwaysPass位置靠后则后执行,混合(Blend)1之前颜色为0后输出本Pass颜色,即绿色
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
Shader "Custom/Deferred_Always.2"
{
Properties{
_MainTex("Base(RGB)",2D)="white"{
}
}
SubShader{
Tags{
"RenderType"="Opaque"}
Pass{
Tags{
"LightMode"="Vertex"}
Blend One one
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include"Lighting.cginc"
#include"UnityCG.cginc"
struct v2f
{
float4 pos:SV_POSITION;
float4 color:COLOR;
};
v2f vert(appdata_base v)
{
v2f o;
o.pos=UnityObjectToClipPos(v.vertex);
o.color=float4(1,0,0,1);
return o;
}
float4 frag(v2f i):COLOR
{
return i.color;
}
ENDCG
}
Pass{
Tags{
"LightMode"="Always"}
Blend One zero
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include"Lighting.cginc"
#include"UnityCG.cginc"
struct v2f
{
float4 pos:SV_POSITION;
float4 color:COLOR;