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

57 篇文章 1 订阅
27 篇文章 1 订阅
大部分教材对于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数学是必须的。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值