標籤:體繪製 通道 over table geometry shader 攝像機 綠色 不同
http://blog.csdn.net/meegomeego/article/details/42060389
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:不記錄深度,通常用於半透明物體。
Unity3D ShaderLab 修改渲染隊列進行深度排序