Shader的渲染队列

Unity中的几种渲染队列

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

Background(1000) 最早被渲染的物体的队列。

Geometry   (2000) 不透明物体的渲染队列。大多数物体都应该使用该队列进行渲染,也是Unity Shader中默认的渲染队列。
AlphaTest   (2450) 有透明通道,需要进行Alpha Test的物体的队列,比在Geomerty中更有效。
Transparent(3000) 半透物体的渲染队列。一般是不写深度的物体,Alpha Blend等的在该队列渲染。
Overlay      (4000) 最后被渲染的物体的队列,一般是覆盖效果,比如镜头光晕,屏幕贴片之类的。

当然在Unity中我们也可以自定义渲染队列如

Tags { "Queue" = "Transparent + 1"}

渲染顺序:

unity引擎一般都会先对物体进行排序,在渲染。渲染顺序:

  1. 先渲染所有的不透明物体,并开启他们的深度测试和深度写入。(从前往后渲染)
  2. 把半透明物体按他们距离相机的位置远近来渲染,按照从后往前的顺序渲染,开启他们的深度测试,但是关闭深度写入。这样当半透明物体较多时,半透明物体之间没有所谓的通过深度测试来剔除优化,每个半透明的物体都会进行渲染,会造成大量的Over Draw。这也是为什么粒子特效比较耗费性能的原因。 

ZTest(深度测试)和ZWrite(深度写入)

首先看一下ZTest,ZTest即深度测试,所谓测试,就是针对当前对象在屏幕上(更准确的说是frame buffer)对应的像素点,将对象自身的深度值与当前该像素点缓存的深度值进行比较,如果通过了,本对象在该像素点才会将颜色写入颜色缓冲区(可在屏幕上显示),否则否则不会写入颜色缓冲(不可在屏幕上显示)。

ZTest的状态有:

  1. ZTest Less(深度小于当前缓存则通过
  2. ZTest Greater(深度大于当前缓存则通过)
  3. ZTest LEqual(深度小于等于当前缓存则通过)
  4. ZTest GEqual(深度大于等于当前缓存则通过)
  5. ZTest Equal(深度等于当前缓存则通过)
  6. ZTest NotEqual(深度不等于当前缓存则通过)
  7. ZTest Always(不论如何都通过)

ZWrite比较简单,只有两种状态,ZWrite On(开启深度写入)和ZWrite Off(关闭深度写入),当我们开启深度写入的时候,物体被渲染时针对物体在屏幕(更准确地说是frame buffer)上每个像素的深度都写入到深度缓冲区;反之,如果是ZWrite Off,那么物体的深度就不会写入深度缓冲区。这里写入深度缓冲区我个人的理解就是就是重新设定深度的参考值,在深度测试是用来比较。

ZTest分为通过和不通过两种情况,ZWrite分为开启和关闭两种情况的话,一共就是四种情况:

  1. 深度测试通过,深度写入开启:写入深度缓冲区,写入颜色缓冲区;
  2. 深度测试通过,深度写入关闭:不写深度缓冲区,写入颜色缓冲区;
  3. 深度测试失败,深度写入开启:不写深度缓冲区,不写颜色缓冲区;
  4. 深度测试失败,深度写入关闭:不写深度缓冲区,不写颜色缓冲区;

注:深度测试通过再去看是否开启深度写入,如果深度测试没有通过也就不会有深度写入了。

参考自:https://blog.csdn.net/puppet_master/article/details/53900568

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值