本来是想一个只投下影子的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/