Unity3d shader中Queue如何使用渲染队列进行深度排序

发布时间:2021-09-14 10:37:11 作者:chen
来源:亿速云 阅读:179

这篇文章主要介绍“Unity3d shader中Queue如何使用渲染队列进行深度排序”,在日常操作中,相信很多人在Unity3d shader中Queue如何使用渲染队列进行深度排序问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Unity3d shader中Queue如何使用渲染队列进行深度排序”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

准备工作

  1. 创建一个新的场景,以及两个球体,并且让它们排在一条线上。我们的目标是(没有蛀牙!),无论它们在3D空间中的实际坐标是什么,我们可以随你所欲地安排它们的绘制顺序,即谁在谁的上面。

  2. 为了可以看出修改绘制顺序发生的变化,我们还需要至少两个Shaders。所以,我们创建两个新的Shaders,并可以分别分别命名为Depth001和Depth002。

  3. 你的场景应该看起来和下面图片类似。
    Unity3d shader中Queue如何使用渲染队列进行深度排序

实现

Shader部分的代码实际上很简单;它仅仅需要两行新代码就可以了。

  1. 首先我们决定将目标象绘制到一个新的渲染队列中。为了做到这一点,我们需要修改Tags{}块,也就是在SubShader{}的内部:

     

    Tags { "Queue"="Geometry-20" }

     

  2. 然后,我们需要告诉Unity,我们想要自己控制这个对象的渲染顺序,而不想写到深度缓存中。在上一步代码的下面添加如下代码:

     

    ZWrite Off

     

  3. 保存,返回Unity查看。你将会发现其中一个球体出现在所有对象的后面,甚至当它的3D空间中的实际坐标在所有对象前面时也是一样。如下图所示:
    Unity3d shader中Queue如何使用渲染队列进行深度排序

最后,完整代码如下:

Shader "Custom/Depth001" {  
    Properties {  
        _MainTex ("Base (RGB)", 2D) = "white" {}  
    }  
    SubShader {  
        Tags { "Queue"="Geometry-20" }  
          
        ZWrite Off  
          
        LOD 200  
          
        CGPROGRAM  
        #pragma surface surf Lambert  
  
        sampler2D _MainTex;  
  
        struct Input {  
            float2 uv_MainTex;  
        };  
  
        void surf (Input IN, inout SurfaceOutput o) {  
            half4 c = tex2D (_MainTex, IN.uv_MainTex);  
            o.Albedo = c.rgb;  
            o.Alpha = c.a;  
        }  
        ENDCG  
    }   
    FallBack "Diffuse"  
}

解释

默认情况下,Unity会基于对象距离摄像机的远近来排序你的对象。因此,当一个对象离摄像机越近,它就会优先绘制在其他更远的对象上面。对于大多数情况这是有效并合适的,但是在一些特殊情况下,你可能想要自己控制对象的绘制顺序。而使用Tags{}块我们就可以得到这样的控制。

Unity提供给我们一些默认的渲染队列,每一个对应一个唯一的值,来指导Unity绘制对象到屏幕上。这些内置的渲染队列被称为Background, Geometry, AlphaTest, Transparent, Qverlay。这些队列不是随便创建的,它们是为了让我们更容易地编写Shader并处理实时渲染的。下面的表格描述了这些渲染队列的用法:

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

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

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

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

到此,关于“Unity3d shader中Queue如何使用渲染队列进行深度排序”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!

推荐阅读:
  1. Unity3D 角色Face的显示
  2. Unity3D移动端海水的实时绘制

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

unity3d

上一篇:HTML主体的示例分析

下一篇:XML模式中DocBook XML有什么用

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》