shader实例(八)渲染路径RenderingPath

来源:互联网 发布:directx9修复软件 编辑:程序博客网 时间:2024/06/03 18:40

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

0 0