Unity3D ShaderLab修改渲染队列进行深度排序

发表于2018-07-23
评论0 2k浏览
为了更深刻的理解透明度,我们还需要学习一下深度排序,简单来说就是物体被渲染的先后顺序。  Unity允许我们通过代码来控制某个特定物体渲染到屏幕的顺序。这个做法类似于photoshop中图层的概念。下面就来看看是怎么通过修改渲染队列进行深度排序的。

开始之前,准备工作还是新建ShaderMaterial,准备测试场景。为了对比是需要使用2个材质球的。  

打开我们的shader,稍微编辑一下即可看到效果。过程简单如下:  
Shader "91YGame/DepthSort" {
    Properties {
        _MainTex ("Base (RGB)", 2D) = "white" {}
    }
    SubShader {
        //Tags { "RenderType"="Opaque" } default Tags.
        Tags { "Queue"="Geometry-20" }        //我们的
        Zwrite Off        //通知unity重写物体的渲染深度顺序。
        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,看看效果:  
是的,你没看错。影子在前面,暴露了他的真实坐标位置。可是在最终的成像渲染确把绿色的球体渲染到后面了。  

默认情况下,unity会根据物体和摄像机之间的距离来决定渲染顺序,这是符合大多数场景需求的。如果某天你需要改变。  
那么你是用Tags{}模块就可以自主控制渲染顺序了。  

一旦你确定好了使用哪一个渲染队列,就可以给他赋予内置的渲染队列标签了。我们的着色器使用Geometry,所以我们写的是Tags{"Queue"="Geometry-20"}。  

同时我们告诉物体再几何体队列之后在进行渲染,所以我们把它修改成了"Geometry-20"。这样做的目的就是告诉unity,我们将它修改改成一个不透明或者说是实体对象。  
但是它会在其他所有不透明的物体之后才进行渲染。  

最后,我们需要在subshader中申明Zwrite标签。这样告诉unity我们要重写物体的渲染深度顺序。  

我们为它所标识的渲染队列赋予了一个值,Zwrite的值被设置为Off。不设置,木有效果的哦!  
ZWrite:是否此物体的像素深度会被记录(默认记录)  
Zwriteon:进行深度记录  
Zwriteoff:不记录深度,通常用于半透明物体。  
原文地址:http://www.cnblogs.com/2Yous/p/4271168.html

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引