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

  • 相关阅读:
    java移位运算符详解[转]
    Android四大基本组件介绍与生命周期
    oracle中怎么得到日期相减除去周末后的天数
    小计_合计_统计
    Oracle--SQL技巧之一(查询连续的记录)
    游戏中地图的制作(一)
    在别的地方看的<<给程序员介绍一些C++开源库>>,记录给大家共同学习
    C语言调用python代码
    XML文件中怎么写小于号 等特殊符号
    system->copy 和 ShellExecute 用法
  • 原文地址:https://www.cnblogs.com/nafio/p/9137343.html
Copyright © 2020-2023  润新知