大部分教材对于FallBack是这么解释的: 
回退 (Fallback) 可定义在所有子着色器 (Subshader) 之后。大致来说就是“如果所有子着色器都无法在该硬件上运行,请尝试使用另一个着色器的子着色器”。 
但事实是: 
如果你新建一个最简单Shader,比如给Cube加上一张纹理图片,如果没有添加FallBack,则没有阴影!!! 


如果自己写一个半透明物体的Shader,没有添加FallBack,则阴影出错!表现为,透过物体透明部分看不到地上的阴影,或者阴影是一个方块,没有对应的纹理! 
见下图,如果使用 Fallback "Diffuse",则有纹理,但阴影被自己遮挡且阴影纹理不正确(这个问题我找了半个下午才发现是Fallback出现了问题!) 
shader最后FallBack 很重要,但不知道原因,请指教!(颠覆认知)



添加 
Fallback "Transparent/Cutout/VertexLit" 
shader最后FallBack 很重要,但不知道原因,请指教!(颠覆认知)



不加Fallback则没有阴影 
这是怎么回事呢?? 


请教各位(有答必回)
分享:
shader最后FallBack 很重要,但不知道原因,请指教!(颠覆认知)
要评论请先登录 或者 注册
shader最后FallBack 很重要,但不知道原因,请指教!(颠覆认知)
yxriyin 师者 2016-06-30 10:211楼
国内的开发者都是半吊子  不求甚解
官方有一句话:
A fallback statement has the same effect as if all subshaders from the other shader would be inserted into its place.
所以并不是单纯的尝试用另一个子着色器,而是这个着色器的代码全部插入到了这个位置。
因为假如签名的着色器都不符合,比如LOD都是400, 那么自然会运行后面这个位置的子着色器。
而你的疑惑也可以解释,unity的内置阴影系统完全是利用shader本身的变量来处理的。当你利用
Diffuse的时候,会把整个光照系统中需要的阴影文件全部引入。自然就有阴影了。由此也可推测,
阴影是独立的一个部分,不在shader内部,应该和表面着色器的编译后的文件有关,有兴趣可以详细看看。
shader最后FallBack 很重要,但不知道原因,请指教!(颠覆认知)
weiran 学徒 2016-06-30 11:082楼
yxriyin:国内的开发者都是半吊子  不求甚解
官方有一句话:
A fallback statement has the same effect as if all subshaders from the other shader would be i...
回到原帖
原来如此……我搜索到这句话了,嘿,以前看过官网这个页面,但这句话在最后的Detail里面,不知道为什么官方放在最后……
还有,我写了一个最简单的Surface Shader,加上与不加FallBack,使用代码比较器发现编译后的代码就那一行FallBack不同,其它都一样,这是这么回事呢?(点击Shader的show generated code 以及 Compile and show code)
shader最后FallBack 很重要,但不知道原因,请指教!(颠覆认知)
yxriyin 师者 2016-06-30 15:083楼
weiran:原来如此……我搜索到这句话了,嘿,以前看过官网这个页面,但这句话在最后的Detail里面,不知道为什么官方放在最后……
还有,我写了一个最简单的Surface Shader,加上与不加FallBack,使用代码比较器发现编译后的代码就那一行...
回到原帖
具体我也没研究过 毕竟unity不开源 我只能推测它为了优化效率 将阴影的底层代码直接用汇编层处理了 毕竟着色器的性能是需要做到极致的优化才行
shader最后FallBack 很重要,但不知道原因,请指教!(颠覆认知)
weiran 学徒 2016-07-04 09:094楼
yxriyin:具体我也没研究过 毕竟unity不开源 我只能推测它为了优化效率 将阴影的底层代码直接用汇编层处理了 毕竟着色器的性能是需要做到极致的优化才行回到原帖
有道理,慢慢实践吧,可能自己能力还不够到理解的程度~
shader最后FallBack 很重要,但不知道原因,请指教!(颠覆认知)
Arc 新手 2016-10-21 17:475楼
我来告诉你为什么,unity专门用一个额外的pass来更新光源的阴影纹理映射,也就是一个LightMode被设置为ShadowCaster的pass,如果在你的shader中这样的pass没有被定义那么unity就会到你的fallback里去找。也就是说你如果不写fallback又没写这个pass,unity就找不到这样的pass从而不会渲染阴影。选择不同的fallback渲染阴影所用的pass也可能根据fallback的不同而不同从而造成形成的阴影不同。
shader最后FallBack 很重要,但不知道原因,请指教!(颠覆认知)
s5366973 学徒 2017-04-10 15:286楼
这个在Fallback里面写了一个阴影处理的pass 名字是“lightmode”=“shadowcaster”,这个是专门用来显示阴影的pass,如果想要当前的物体接受阴影,那么就需要对坐标添加阴影映射。shadowcaster这个pass是指当前的物体可以投射阴影!
shader最后FallBack 很重要,但不知道原因,请指教!(颠覆认知)
s5366973 学徒 2017-04-10 15:297楼
它们一层一层继承下去,最终,会继承这个shadowcaster的pass也就会显示阴影啦,这就是你去掉之后不显示的根本原因。
shader最后FallBack 很重要,但不知道原因,请指教!(颠覆认知)
s5366973 学徒 2017-04-11 16:488楼
yxriyin:国内的开发者都是半吊子  不求甚解
官方有一句话:
A fallback statement has the same effect as if all subshaders from the other shader would be i...
回到原帖
看我的解释,想要有阴影而且正确,自己也可以写一个pass,专门处理阴影的
shader最后FallBack 很重要,但不知道原因,请指教!(颠覆认知)
s5366973 学徒 2017-04-11 16:499楼
yxriyin:国内的开发者都是半吊子  不求甚解
官方有一句话:
A fallback statement has the same effect as if all subshaders from the other shader would be i...
回到原帖
想要真正了解shader,建议写顶点和片段着色器,从cg语言基础入门,3d数学是必须的。

相关文章:

  • 2022-12-23
  • 2022-02-10
  • 2022-12-23
  • 2021-04-22
  • 2021-10-09
  • 2021-09-07
  • 2021-07-10
猜你喜欢
  • 2021-08-31
  • 2021-04-02
  • 2021-08-24
  • 2021-07-10
  • 2021-10-01
  • 2021-08-30
  • 2021-11-18
相关资源
相似解决方案