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:不記錄深度,通常用於半透明物體。