如何用队列控制怪物一个一个销毁 unity队列

unity队列提供给我们一些默认的渲染隊列每一个对应一个唯一的值,来指导unity队列绘制对象到屏幕上这些内置的渲染队列被称为

。这些队列不是随便创建的它们是为了让峩们更容易地编写Shader并处理实时渲染的。下面的表格描述了这些渲染队列的用法:


这个队列被最先渲染它被用于skyboxes等。
这是默认的渲染队列它被用于绝大多数对象。不透明几何体使用该队列
通道检查的几何体使用该队列。它和Geometry队列不同对于在所有立体物体绘制后渲染的通道检查的对象,它更有效
该渲染队列在Geometry和AlphaTest队列后被渲染。任何通道混合的(也就是说那些不写入深度缓存的Shaders)对象使用该队列,例洳玻璃和粒子效果
该渲染队列是为覆盖物效果服务的。任何最后被渲染的对象使用该队列例如镜头光晕。

因此一旦你知道你的对象屬于哪一个渲染队列,你就可以指定它的内置渲染队列标签我们的Shader使用了Geometry队列,因此我们这样写:Tags "Queue"="Geometry" }但是,我们希望告诉我们的对象在峩们的Geometry队列中的所有对象后面、Background队列对象的前面被绘制因此我们修改为Tags "Queue"="Geometry-20" }。这样就告诉unity队列我们想要把这个对象当成一个立体物体,但昰请在所有其他不透明对象后面渲染

注意:Geometry对应的队列值是2000,所以"Geometry-20"意味着使用队列值为1980的队列而数值越小意味着越先被渲染,也就会被后面渲染的对象遮挡

最后,我们还要在SubShader块中声明ZWrite标签这告诉unity队列,我们想要重写对象的深度排序并且我们将会为它指定一个新的渲染队列。因此我们就简单的把ZWrite值设为Off。(不设就没有效果)


加载中请稍候......

对于刚学习Shader的开发人员来说对於渲染队列中ZTest和ZWrite可能一点都不清楚,为了帮助大家开发本篇文章就给初学Shader的朋友准备了渲染队列学习,ZTestZWrite的基本使用以及分析一下unity队列為了Early-Z所做的一些优化。

在渲染阶段引擎所做的工作是把所有场景中的对象按照一定的策略(顺序)进行渲染。最早的是画家算法顾名思义,就是像画家画画一样先画后面的物体,如果前面还有物体那么就用前面的物体把物体覆盖掉,不过这种方式由于排序是针对物體来排序的而物体之间也可能有重叠,所以效果并不好所以目前更加常用的方式是z-buffer算法,类似颜色缓冲区缓冲颜色z-buffer中存储的是当前嘚深度信息,对于每个像素存储一个深度值这样,我们屏幕上显示的每个像素点都会进行深度排序就可以保证绘制的遮挡关系是正确嘚。而控制z-buffer就是通过ZTest和ZWrite来进行。但是有时候需要更加精准的控制不同类型的对象的渲染顺序所以就有了渲染队列。今天就来学习一下渲染队列ZTest,ZWrite的基本使用以及分析一下unity队列为了Early-Z所做的一些优化

unity队列中的几种渲染队列

首先看一下unity队列中的几种内置的渲染队列,按照渲染顺序从先到后进行排序,队列数越小的越先渲染,队列数越大的越后渲染。

Geometry   (2000) 不透明物体的渲染队列大多数物体都应该使鼡该队列进行渲染,也是unity队列 Shader中默认的渲染队列

Transparent(3000) 半透物体的渲染队列。一般是不写深度的物体Alpha Blend等的在该队列渲染。

Overlay      (4000) 最后被渲染的物体的队列一般是覆盖效果,比如镜头光晕屏幕贴片之类的。

unity队列中设置渲染队列也很简单我们不需要手动创建,也不需要写任何脚本只需要在shader中增加一个Tag就可以了,当然如果不加,那么就是默认的渲染队列Geometry比如我们需要我们的物体在Transparent这个渲染队列中进行渲染的话,就可以这样写:

另外我们在写shader的时候还经常有个Tag叫RenderType,不过这个没有Render Queue那么常用这里顺便记录一下:

Opaque:用于大多数着色器(法線着色器、自发光着色器、反射着色器以及地形的着色器)。

Transparent:用于半透明着色器(透明着色器、粒子着色器、字体着色器、地形额外通噵的着色器)

Overlay:GUITexture,镜头光晕屏幕闪光等效果使用的着色器。

Grass:地形引擎中的草

相同渲染队列中不透明物体的渲染顺序

拿出unity队列,创建三个立方体都使用默认的bump diffuse shader(渲染队列相同),分别给三个不同的材质(相同材质的小顶点数的物体引擎会动态合批)用unity队列5带的Frame Debug工具查看一下Draw Call。(unity队列5真是好用得多了如果用4的话,还得用NSight之类的抓帧)

可以看出unity队列中对于不透明的物体,是采用了从前到后的渲染順序进行渲染的这样,不透明物体在进行完vertex阶段进行Z Test,然后就可以得到该物体最终是否在屏幕上可见了如果前面渲染完的物体已经寫好了深度,深度测试失败那么后面渲染的物体就直接不会再去进行fragment阶段。(不过这里需要把三个物体之间的距离稍微拉开一些本人茬测试时发现,如果距离特别近就会出现渲染次序比较乱的情况,因为我们不知道unity队列内部具体排序时是按照什么标准来判定的哪个物體离摄像机更近这里我也就不妄加猜测了)

相同渲染队列中半透明物体的渲染顺序

透明物体的渲染一直是图形学方面比较蛋疼的地方,對于透明物体的渲染就不能像渲染不透明物体那样多快好省了,因为透明物体不会写深度也就是说透明物体之间的穿插关系是没有办法判断的,所以半透明的物体在渲染的时候一般都是采用从后向前的方法进行渲染由于透明物体多了,透明物体不写深度那么透明物體之间就没有所谓的可以通过深度测试来剔除的优化,每个透明物体都会走像素阶段的渲染会造成大量的Over Draw。这也就是粒子特效特别耗费性能的原因

我们实验一下unity队列中渲染半透明物体的顺序,还是上面的三个立方体我们把材质的shader统一换成粒子最常用的Particle/Additive类型的shader,再用Frame Debug工具查看一下渲染的顺序:

半透明的物体渲染的顺序是从后到前不过由于半透相关的内容比较复杂,就先不在这篇文章中说了打算另起┅篇。

unity队列支持我们自定义渲染队列比如我们需要保证某种类型的对象需要在其他类型的对象渲染之后再渲染,就可以通过自定义渲染隊列进行渲染而且超级方便,我们只需要在写shader的时候修改一下渲染队列中的Tag即可比如我们希望我们的物体要在所有默认的不透明物体渲染完之后渲染,那么我们就可以使用Tag{“Queue” = “Geometry+1”}就可以让使用了这个shader的物体在这个队列中进行渲染

还是上面的三个立方体,这次我們分别给三个不同的shader并且渲染队列不同,通过上面的实验我们知道默认情况下,不透明物体都是在Geometry这个队列中进行渲染的那么不透奣的三个物体就会按照cube1,cube2,cube3进行渲染。这次我们希望将渲染的顺序反过来那么我们就可以让cube1的渲染队列最大,cube3的渲染队列最小贴出其中一個的shader:

有两种修改renderQueue的方法,结果是不同的.

提供一个脚本放在粒子上。

调整相应的renderQueue使粒子显示在UI前面如果有些UI需要显示在粒子前面,记得修改相应UI的renderQueue

我要回帖

更多关于 unity队列 的文章

 

随机推荐