shader最后FallBack 很重要,但不知道原因,请指教!(颠覆认知)

本文探讨了Unity中Shader的FallBack特性对阴影效果的影响。通过分析FallBack的工作原理及其实现方式,解释了为何缺少FallBack会导致阴影缺失或错误显示的问题。
大部分教材对于FallBack是这么解释的: 
回退 (Fallback) 可定义在所有子着色器 (Subshader) 之后。大致来说就是“如果所有子着色器都无法在该硬件上运行,请尝试使用另一个着色器的子着色器”。 
但事实是: 
如果你新建一个最简单Shader,比如给Cube加上一张纹理图片,如果没有添加FallBack,则没有阴影!!! 


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



添加 
Fallback "Transparent/Cutout/VertexLit" 
g



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


请教各位(有答必回)
分享:
游客
要评论请先 登录 或者  注册
yxriyin
yxriyin  师者  2016-06-30 10:21 1楼
国内的开发者都是半吊子  不求甚解
官方有一句话:
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内部,应该和表面着色器的编译后的文件有关,有兴趣可以详细看看。
weiran
weiran  学徒  2016-06-30 11:08 2楼
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)
yxriyin
yxriyin  师者  2016-06-30 15:08 3楼
weiran:原来如此……我搜索到这句话了,嘿,以前看过官网这个页面,但这句话在最后的Detail里面,不知道为什么官方放在最后……
还有,我写了一个最简单的Surface Shader,加上与不加FallBack,使用代码比较器发现编译后的代码就那一行...
回到原帖
具体我也没研究过 毕竟unity不开源 我只能推测它为了优化效率 将阴影的底层代码直接用汇编层处理了 毕竟着色器的性能是需要做到极致的优化才行
weiran
weiran  学徒  2016-07-04 09:09 4楼
yxriyin:具体我也没研究过 毕竟unity不开源 我只能推测它为了优化效率 将阴影的底层代码直接用汇编层处理了 毕竟着色器的性能是需要做到极致的优化才行 回到原帖
有道理,慢慢实践吧,可能自己能力还不够到理解的程度~
Arc
Arc  新手  2016-10-21 17:47 5楼
我来告诉你为什么,unity专门用一个额外的pass来更新光源的阴影纹理映射,也就是一个LightMode被设置为ShadowCaster的pass,如果在你的shader中这样的pass没有被定义那么unity就会到你的fallback里去找。也就是说你如果不写fallback又没写这个pass,unity就找不到这样的pass从而不会渲染阴影。选择不同的fallback渲染阴影所用的pass也可能根据fallback的不同而不同从而造成形成的阴影不同。
s5366973
s5366973  学徒  2017-04-10 15:28 6楼
这个在Fallback里面写了一个阴影处理的pass 名字是“lightmode”=“shadowcaster”,这个是专门用来显示阴影的pass,如果想要当前的物体接受阴影,那么就需要对坐标添加阴影映射。shadowcaster这个pass是指当前的物体可以投射阴影!
s5366973
s5366973  学徒  2017-04-10 15:29 7楼
它们一层一层继承下去,最终,会继承这个shadowcaster的pass也就会显示阴影啦,这就是你去掉之后不显示的根本原因。
s5366973
s5366973  学徒  2017-04-11 16:48 8楼
yxriyin:国内的开发者都是半吊子  不求甚解
官方有一句话:
A fallback statement has the same effect as if all subshaders from the other shader would be i...
回到原帖
看我的解释,想要有阴影而且正确,自己也可以写一个pass,专门处理阴影的
s5366973
s5366973  学徒  2017-04-11 16:49 9楼
yxriyin:国内的开发者都是半吊子  不求甚解
官方有一句话:
A fallback statement has the same effect as if all subshaders from the other shader would be i...
回到原帖
想要真正了解shader,建议写顶点和片段着色器,从cg语言基础入门,3d数学是必须的。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值