场景内物件和特效和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一直是通过的。这是家就会把颜色写入了。
网友评论