美文网首页Unity
(原创)场景内物件和特效和UI的层级遮挡关系

(原创)场景内物件和特效和UI的层级遮挡关系

作者: 炉石不传说 | 来源:发表于2018-05-30 20:13 被阅读55次

                                                  场景内物件和特效和UI的设置规范

    1、 场景内的物件的Layer层要根据场景内的主相机MainCamer的CullingMask来设置,一般设置为Default,一些特殊的可以自行选择所在的层级。(主相机的Depth深度默认为0,UI相机为1,若有特殊相机可以看一下相机深度,遮挡原则:相机深度值越大,在游戏内出现在最前面)

    2、  [在相机Depth深度一致的情况下,影响遮挡关系的就是Sorting Layer 和Order in Layer

    这两个参数遵守的原则:a,sorting layer和order in layer参数值相同时,RenderQueue起决定前后关系,值小的先进渲染关系,结果就是:RenderQueue值越大,出现在游戏的最前面。b,当两个物件的材质球都在[0~2500]或[2501~5000]时,SortingLayer和OrderInLayer的排序原则才生效。否则无视sorting layer和order in layer的影响,直接依据RenderQueue的大小来排序,结果和a的原则一样。

    c,当Sorting Layer层相同,Order in Layer值越大,在游戏内出现在最前面。我们现在游戏内,Sorting Layer层分为四个,Default和FxTop1,FxTop2,FxTop3四个层级,Default是默认的,最低层级。FxTop是供那些需要放到Default层之上的一些东西使用的,比如一些特效,或者是特效上面的UI等,FxTop值越大,在游戏内显示在最前面。

    3、特殊情况,我们自行修改了shader的ZWrite ZTest导致,游戏内的显示曾经已经不遵循上面的原则了。

    特殊情况的原理:Unity在渲染阶段,所做的工作是把所有场景中的对象按照一定的顺序进行渲染。目前更加常用的方式是z-buffer算法,类似颜色缓冲区缓冲颜色,z-buffer中存储的是当前的深度信息,对于每个像素存储一个深度值,这样,我们屏幕上显示的每个像素点都会进行深度排序,就可以保证绘制的遮挡关系是正确的。而控制z-buffer就是通过ZTest,和ZWrite来进行。但是有时候需要更加精准的控制不同类型的对象的渲染顺序,所以就有了渲染队列。Unity内置的几种渲染队列,

    Background(1000)

    Geometry(2000)

    AlphaTest(2450)

    Transparent(3000)

    Overlay(4000)

    规则:1、不透明物体的渲染队列里面的物体的渲染是从前往后的

    2、  半透明物体的渲染队列里面额物体的渲染是从后往前的

    概念:ZWrite就是写深度缓存。ZTest就是根据ZWrite写入的深度值进行比较。比较通过染色就写入当前的颜色缓冲区,替换掉原理的颜色,如果失败就不写入。这时原理的颜色就会遮挡现在的颜色。

    Shader里面可以控制一个贴图是否开启ZWrite和ZTest的规则,这时候想处理遮挡关系我们就可以通过改变ZTest是否通过来控制了,比如不透明物体渲染,然后再渲染半透明物体,这时正常情况应该是半透明物体在前面,如果不透明物体开启了ZWrite,这是颜色缓冲期写入了不透明物体的颜色,这时在渲染半透明的物体,如果半透明物体开启ZTest(使用默认比较方法),这时ZTest是失败的,因为不透明的物体的深度小于半透明的物体,这是颜色就没有办法写入颜色缓冲期的,所以看到的颜色就是不透明的物体的了,想显示半透明的物体有两个修改方式,1、不透明的物体不写入颜色缓冲期,2、关闭ZTest,是半透明的物体的ZTest一直是通过的。这是家就会把颜色写入了。

    相关文章

      网友评论

        本文标题:(原创)场景内物件和特效和UI的层级遮挡关系

        本文链接:https://www.haomeiwen.com/subject/yqbxsftx.html