打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
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的不同而不同从而造成形成的阴影不同。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
【风宇冲】Unity3D教程宝典之Shader篇:第二十二讲MultiPass
Unity的一些笔试题
map、mesh、texture、material 和 shader 的联系
Unity轻量级渲染管线LWRP源码及案例解析(下)
Unity AssetBundle 打包,使用,管理及AssetBundle,Shader丢失的问题
[ζ?随风去旅行] 【整理】unity3d优化总结篇 【续】
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服