shader实例(八)渲染路径RenderingPath

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不融合之前的颜色,只用现在的颜色

原文地址:https://www.cnblogs.com/nafio/p/9137343.html