顺着PBR+顶点着色混合Shader的折腾与反折腾,发现了贼有意思的玩意。
那就是Unity的Skybox的渲染顺序居然是在2500之后。也不是2501,反正就是内置在2500透明分界线之前,但是在Geometry(2000)及AlphaTest(2450)之后渲染。
另一个角度讲,Skybox大概类似于Transparent(>2500)的Background。
为什么会发现这玩意,是因为对这个PBR+顶点着色混合材质的一次偶然折腾,突然就实现了“玻璃的半透明+接收阴影”。这nm就有意思多了。
众所周知,Unity里面,半透明的材质理论上是接收不了阴影。因为普通的半透明材质都是在>2500上绘制的,这顺序系统内置就是不计算阴影。
另外你接收了阴影,那么你理论上也不能投射阴影,因为如果你又是半透明又是投射和接受阴影,这个Blend的通道算法得两脚踩地上天(笑)。
但是由于我这个前向着色器写的有点非常规(当时直接在外网海找,找到一个非常牛叉的老外写的)。他就是能够同时渲染Opaque PBR并混合顶点着色。因为Unity的Standard PBR是面着色器,不受顶点着色影响。那么自然,当用在粒子发射器上时将无法响应发射器的顶点变色请求,比如半透明渐变。
然后后来这个着色器被我乱七八糟改了一通,变成了通用半透明带阴影材质的着色器 。也就是专门部署在玻璃,烟尘之类的物体上面。
然后这几天不是在研究这个渲染顺序么,直接偶然一次给渲染顺序改成2500时,且在投影Pass上弃用产生阴影。然后就突然发现了玻璃居然接收了阴影,且表面不会出现AlphaCutoff点状斑纹。xD
但是这个材质在以天空为背景的时候观察就直接消失了,最后就发现了前面说的Skybox的真实渲染顺序。
所以想了半天解决方案,暂时不想弃用Skybox(因为要自己构造天空色变和太阳月亮有点烦躁),那么只能使用双玻璃的增加开销模式。
————————
根据发现的RenderType参数,经过几天的摸索,终于连带处理了MCS角色渲染器跟HBAO互相干涉的问题。
(说是处理而不是解决,是因为解决的方式不是在Shader层,而是在脚本上控制Shader参数)即直接消隐值大于0.5修改RenderType=Transparent即可。
毕竟我到现在也没搞懂这个角色蒙皮渲染器(MCS基于Unity标准内置渲染器修改而成)跟另外抄Shader Painter的通用面渲染器(自己修改而成的多贴图、多功能渲染器)有何具体区别。
————————
暂无关于此日志的评论。