Unity ZTest深度測試 & ZWrite深度寫入


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,能得到我們想要的結果,如下:

 


免責聲明!

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



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