shader最后FallBack

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

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

在这里插入图片描述

添加
Fallback “Transparent/Cutout/VertexLit”

在这里插入图片描述
不加Fallback则没有阴影

解答01:官方有一句话:
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内部,应该和表面着色器的编译后的文件有关,有兴趣可以详细看看。

解答02:unity专门用一个额外的pass来更新光源的阴影纹理映射,也就是一个LightMode被设置为ShadowCaster的pass,如果在你的shader中这样的pass没有被定义那么unity就会到你的fallback里去找。也就是说你如果不写fallback又没写这个pass,unity就找不到这样的pass从而不会渲染阴影。选择不同的fallback渲染阴影所用的pass也可能根据fallback的不同而不同从而造成形成的阴影不同。

  • 6
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值