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

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

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



官网的解释是

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/




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值