unity关于shader投影 Fallback实际上并不是备胎

本来是想一个只投下影子的shader的,不需要fallback,然后发现去掉就不正常了,然后直接使用fallback里的也不能有正确结果

就想到了fallback与shader有着联系,而不仅仅是一个看上去的备胎

unity关于shader投影 Fallback实际上并不是备胎_第1张图片


官网的解释是

After all Subshaders a Fallback can be defined. It basically says “if none of subshaders can run on this hardware, try using the ones from another shader”.

也就是说所有shader都不能运行的时候运行这个shader


但是对某些shader来说并不是这样


比如http://docs.unity3d.com/Manual/SL-SurfaceShaderExamples.html

  Shader "Example/Diffuse Simple" {
    SubShader {
      Tags { "RenderType" = "Opaque" }
      CGPROGRAM
      #pragma surface surf Lambert
      struct Input {
          float4 color : COLOR;
      };
      void surf (Input IN, inout SurfaceOutput o) {
          o.Albedo = 1;
      }
      ENDCG
    }
    Fallback "Diffuse"
  }
如果把
//Fallback "Diffuse"
注释掉(或者Fallback off)

就会发现影子没有(前提是让场景中有投影)

这是因为unity在表面着色器上有个机制,就是投影是单独的系统(大概是这样),如果你没有被称为"ShadowCaster" 或者"ShadowCollector"的pass

而且没有fallback那么shader将不产生阴影,所以你需要至少用Fallback进来Diffuse 或者 VertexLit(Diffuse实际上包含了VertexLit)来保证表面着色器能自动生成投影的pass

所以这里的Fallback并不是备胎,而是必要的保存投影的方式

当然投影的方式你也能自己写

参考http://docs.unity3d.com/Manual/SL-SurfaceShaders.html

http://docs.unity3d.com/Manual/SL-SurfaceShaders.html

是从这里得到的提示http://forum.unity3d.com/threads/fallback-off-turns-off-shadows-in-surface-shader.257430/




你可能感兴趣的:(unity,shader,投影,U3D,fallback)