Shader深度渲染隊列Queue預定義值:Background(1000)、Geometry(2000)、AlphaTest(2450)、Transparent(3000)、Overlay(4000)。
渲染優先順序: Queue值越小越先渲染,后渲染的物體會覆蓋先渲染的物體。
測試:我想讓遠處的紅色方塊遮擋住近處的藍色方塊,即讓藍色的先渲染,紅色的后渲染,我將紅塊的Queue設置為Transparent ,藍塊的Queue值設置為Transparent -1,按照上面的渲染優先順序,值越小越先渲染,按道理紅塊后渲染應該覆蓋在藍塊前面對吧,結果卻不是這樣的,藍塊依舊在紅塊前面。
這是為什么呢?原因在下面兩條指令,shader代碼中雖然沒有定義,但是默認存在的。
ZTest:深度測試。(LEqua小於等於、Less小於、Greater大於、Equal等於 , NotEqual不等於)
ZWrite:深度寫入。(On打開、Off關閉)。
系統中存在一個顏色緩沖區和一個深度緩沖區,分別存儲顏色值和深度值,來決定畫面上應該顯示什么顏色。深度值是物體在世界空間中距離攝像機的遠近,距離越近深度值越小,反之越大。
上面的測試中,藍色方塊比紅色方塊近,那么藍色方塊的深度值就比紅色方塊小。假設藍塊的深度值為1,紅塊深度值為2,例子中藍塊優先渲染,系統就先將藍色值存入顏色緩沖區,將深度值1存入了深度緩沖區。
接下來渲染紅塊,系統會將紅塊的深度值和緩沖區的深度值對比(這個過程就是深度測試),由於ZTest的深度測試方式是Lequal小於等於,即深度值小於1才會通過測試,如果通過了測試,且ZWrite處於On狀態,
該顏色的深度值就會替換深度緩沖區中的值,顏色值也會替換顏色緩沖區中的值,從而顯示新的顏色。很顯然,2 > 1,深度測試並不能通過,紅色也就不能顯示在藍色的前面。
如果我們硬要遠處的紅塊遮擋近處的藍塊,很顯然,我們應該關閉深度寫入ZWrite或者關閉深入測試ZTest,能得到我們想要的結果,如下: