Unity的摄像机上支持3种RenderingPath,分别是VertexLit,Forward和Dferred Lighting,而shader中的LightMode标签Vertex,ForwardBase,forwardAdd,PrepassBase,PrepassFinal等,分别表示当前pass是为哪一个RenderingPath下设计使用的。
下面的shader中LightMode有三种模式,分别为Vertex, ForwardBase, deferred,它们输出的颜色分别为蓝,绿,红。在摄像机中选择不同的RenderingPath时,模型就会改变成相应的颜色。
Shader "Custom/Deferred_Forward_Vertex" { SubShader{ Blend One One pass{ Tags{"LightMode"="Vertex"} Blend One Zero CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" #include "Lighting.cginc" struct vertOut{ float4 pos:SV_POSITION; float4 color:COLOR; }; vertOut vert(appdata_base v) { vertOut o; o.pos = mul(UNITY_MATRIX_MVP, v.vertex); o.color = float4(0,0,1,1); return o; } float4 frag(vertOut i):COLOR { return i.color; } ENDCG } pass{ Tags{"LightMode"="ForwardBase"} Blend One One CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" #include "Lighting.cginc" struct vertOut{ float4 pos:SV_POSITION; float4 color:COLOR; }; vertOut vert(appdata_base v) { vertOut o; o.pos = mul(UNITY_MATRIX_MVP, v.vertex); o.color = float4(0,1,0,1); return o; } float4 frag(vertOut i):COLOR { return i.color; } ENDCG } CGPROGRAM #pragma surface surf MyDeferred half4 LightingMyDeferred_PrePass(SurfaceOutput s, half4 light){ half4 c; c.rgb = s.Albedo; c.a = s.Alpha; return c; } sampler2D _MainTex; struct Input { float2 uv_MainTex; }; void surf (Input IN, inout SurfaceOutput o) { o.Albedo = float3(1,0,0); } ENDCG } }
注:选择了Deferred时,优先选择deferred模式下的pass,如果找不到,则会选择forward模式下面的pass。
选择了Forward时,优先选择Forward模式下的pass,如果找不到,则会选择Vertex模式下面的pass。
Unity在一个时间只会执行一个渲染路径下的pass。
关于这3个渲染路径之外的参数【Always】:
always + deferred:在选择deferred时,只执行deferred的pass。
always + vertexLit:都会执行,并且谁靠前谁先执行。
always + forward:都会执行,并且谁靠前谁先执行。
而无参数执行顺序和always一样。
渲染顺序用Blend测试
One One将之前颜色和现在的融合
One Zero不融合之前的颜色,只用现在的颜色