Unity3D ShaderLab 修改渲染隊列進行深度排序


Unity3D ShaderLab 修改渲染隊列進行深度排序

為了更深刻的理解透明度,我們還需要學習一下深度排序,簡單來說就是物體被渲染的先后順序。

Unity允許我們通過代碼來控制某個特定物體渲染到屏幕的順序。這個做法類似於photoshop中圖層的概念。

開始之前,准備工作還是新建Shader Material,准備測試場景。為了對比 是需要使用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{}模塊就可以自主控制渲染順序了。

Unity內置的渲染隊列如下:

渲染隊列 渲染隊列描述 渲染隊列值

Background

【背景】

這個隊列被最先渲染。它被用於skyboxes等。 1000

Geometry

【幾何體】

這是默認的渲染隊列。它被用於絕大多數對象。不透明幾何體使用該隊列。 2000

AlphaTest       

【透明度測試】

用於alpha測試的幾何體,它和Geometry隊列不同,在所有幾何體物體繪制后再進行渲染的對象,它更有效率。 2450

Transparent

【透明】

該渲染隊列在Geometry和AlphaTest隊列后被渲染,采用由后到前的次序。任何通過alpha通道混合的(也就是說,那些不寫入深度緩存的Shaders)對象使用該隊列,例如玻璃和粒子效果。 3000

Overlay

【覆蓋】

該渲染隊列是用於實現疊加效果的。任何最后被渲染的對象使用該隊列,例如鏡頭光暈。 4000

一旦你確定好了使用哪一個渲染隊列,就可以給他賦予內置的渲染隊列標簽了。我們的着色器使用Geometry,所以我們寫的是Tags { "Queue"="Geometry-20" }

同時我們告訴物體再幾何體隊列之后在進行渲染,所以我們把它修改成了"Geometry-20"。這樣做的目的就是告訴unity,我們將它修改改成一個不透明或者說是實體對象。

但是它會在其他所有不透明的物體之后才進行渲染。

最后,我們需要在subshader中申明Zwrite 標簽。這樣告訴unity 我們要重寫物體的渲染深度順序。

我們為它所標識的渲染隊列賦予了一個值,Zwrite 的值被設置為Off。不設置,木有效果的哦!

ZWrite:是否此物體的像素深度會被記錄(默認記錄)

Zwrite on:進行深度記錄

Zwrite off:不記錄深度,通常用於半透明物體。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM