大部分教材对于FallBack是这么解释的:
回退 (Fallback) 可定义在所有子着色器 (Subshader) 之后。大致来说就是“如果所有子着色器都无法在该硬件上运行,请尝试使用另一个着色器的子着色器”。
但事实是:
如果你新建一个最简单Shader,比如给Cube加上一张纹理图片,如果没有添加FallBack,则没有阴影!!!
如果自己写一个半透明物体的Shader,没有添加FallBack,则阴影出错!表现为,透过物体透明部分看不到地上的阴影,或者阴影是一个方块,没有对应的纹理!
见下图,如果使用 Fallback "Diffuse",则有纹理,但阴影被自己遮挡且阴影纹理不正确(这个问题我找了半个下午才发现是Fallback出现了问题!)
添加
Fallback "Transparent/Cutout/VertexLit"
不加Fallback则没有阴影
这是怎么回事呢??
请教各位(有答必回)
回退 (Fallback) 可定义在所有子着色器 (Subshader) 之后。大致来说就是“如果所有子着色器都无法在该硬件上运行,请尝试使用另一个着色器的子着色器”。
但事实是:
如果你新建一个最简单Shader,比如给Cube加上一张纹理图片,如果没有添加FallBack,则没有阴影!!!
如果自己写一个半透明物体的Shader,没有添加FallBack,则阴影出错!表现为,透过物体透明部分看不到地上的阴影,或者阴影是一个方块,没有对应的纹理!
见下图,如果使用 Fallback "Diffuse",则有纹理,但阴影被自己遮挡且阴影纹理不正确(这个问题我找了半个下午才发现是Fallback出现了问题!)
![点击查看原图 e](http://www.ceeger.com/forum/attachment/thumb/1606/thread/2_108918_7c52032ef2b9ccd.png)
添加
Fallback "Transparent/Cutout/VertexLit"
![点击查看原图 g](http://www.ceeger.com/forum/attachment/thumb/1606/thread/2_108918_2157ba772a55930.png)
不加Fallback则没有阴影
这是怎么回事呢??
请教各位(有答必回)
国内的开发者都是半吊子 不求甚解
官方有一句话:
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内部,应该和表面着色器的编译后的文件有关,有兴趣可以详细看看。
官方有一句话:
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内部,应该和表面着色器的编译后的文件有关,有兴趣可以详细看看。
yxriyin:国内的开发者都是半吊子 不求甚解原来如此……我搜索到这句话了,嘿,以前看过官网这个页面,但这句话在最后的Detail里面,不知道为什么官方放在最后……
官方有一句话:
A fallback statement has the same effect as if all subshaders from the other shader would be i...
还有,我写了一个最简单的Surface Shader,加上与不加FallBack,使用代码比较器发现编译后的代码就那一行FallBack不同,其它都一样,这是这么回事呢?(点击Shader的show generated code 以及 Compile and show code)