Unity Shader的渲染顺序

作者:追风剑情 发布于:2016-10-22 17:46 分类:Shader

      Unity为了解决渲染顺序的问题提供了渲染队列(render queue)这一解决方案。我们可以使用SubShader的Queue标签来决定我们的模型将归于哪个渲染队列。Unity在内部使用一系列整数索引来表示每个渲染队列,且索引号越小表示越早被渲染。在Unity5中,Unity提前定义了5渲染队列(与Unity5之前的版本相比多了一个AlphaTest渲染队列),当然在每个队列中间我们可以使用其他队列。

Unity提前定义的5个渲染队列
名称 队列索引号 描述
Background 1000 这个渲染队列会在任何其他队列之前被渲染,我们通常使用该队列来渲染那些需要绘制在背景上的物体
Geometry 2000 默认的渲染队列,大多数物体都使用这个队列。不透明物体使用这个队列
AlphaTest 2450 需要透明度测试的物体使用这个队列。在Unity5中它从Geometry队列中被单独分出来,这是因为在所有不透明物体渲染之后再渲染它们会更加高效
Transparent 3000 这个队列中的物体会在所有Geometry和AlphaTest物体渲染后,再按从后往前的顺序进行渲染。任何使用了透明度混合(例如关闭了深度写入的Shader)的物体都应该使用该队列
Overlay 4000 该队列用于实现一些叠加效果。任何需要在最后渲染的物体都应该使用该队列

因此,如果我们想要通过透明度测试实现透明效果,代码中应该包含类似下面的代码
SubShader {
      Tags { "Queue"="AlphaTest" }
       Pass {
           ...
       }
}

如果我们想要通过透明度混合来实现透明效果,代码中应该包含类似下面的代码:
SubShader {
      Tags { "Queue"="Transparent" }
      Pass {
          ZWrite Off
          ...
      }
}

      其中,ZWrite Off用于关闭深度写入,在这里我们选择把它写在Pass中,我们也可以把它写在SubShader中,这意味着该SubShader下的所有Pass都会关闭深度写入。

标签: Shader

Powered by emlog  蜀ICP备18021003号-1   sitemap

川公网安备 51019002001593号