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

  • 相关阅读:
    遇到项目上面有叉,但是找不到错误的原因
    遇到build的问题
    遇到scan configurtation CDT builder等的错误
    遇到attemp to invoke virtual method
    遇到looper之类关于消息循环的
    Linux与Windows信息交互快捷方法
    并行查询
    PostgreSQL 事务管理的MVCC
    Linux安装memcached
    Linux 安装 Redis
  • 原文地址:https://www.cnblogs.com/nafio/p/9137343.html
Copyright © 2020-2023  润新知