ZTest,ZWrite,Early-Z優化,爲什麼Alpha Test消耗較大

來自:https://blog.csdn.net/puppet_master/article/details/53900568

 

unity渲染順序

Early-Z優化,也就是Depth-Test發生在Vertex階段和Fragment階段之間,之後Fragment結束後還有一次AlphaTest,確保遮擋順序正確

簡單總結一下Unity中的渲染順序:先渲染不透明物體,順序是從前到後;再渲染透明物體,順序是從後到前

 

Alpha Test(Discard)在移動平臺消耗較大的原因

從本人剛剛開始接觸渲染,就開始聽說移動平臺Alpha Test比較費,當時比較納悶,直接discard了爲什麼會費呢,應該更省纔對啊?這個問題困擾了我好久,今天來刨根問底一下。還是跟我們上面講到的Early-Z優化。正常情況下,比如我們渲染一個面片,不管是否是開啓深度寫入或者深度測試,這個面片的光柵化之後對應的像素的深度值都可以在Early-Z(Z-Cull)的階段判斷出來了;而如果開啓了Alpha Test(Discard)的時候,discard這個操作是在fragment階段進行的,也就是說這個面片光柵化之後對應的像素是否可見,是在fragment階段之後才知道的,最終需要靠Z-Check進行判斷這個像素點最終的顏色。其實想象一下也能夠知道,如果我們開了Alpha Test並且還用Early-Z的話,一塊本來應該被剃掉的地方,就仍然寫進了深度緩存,這樣就會造成其他部分被一個完全沒東西的地方遮擋,最終的渲染效果肯定就不對了。所以,如果我們開啓了Alpha Test,就不會進行Early-Z,Z Test推遲到fragment之後進行,那麼這個物體對應的shader就會完全執行vertex shader和fragment shader,造成over draw。有一種方式是使用Alpha Blend代替Alpha Test,雖然也很費,但是至少Alpha Blend雖然不寫深度,但是深度測試是可以提前進行的,因爲不會在fragment階段再決定是否可見,因爲都是可見的,只是透明度比較低罷了。不過這樣只是權宜之計,Alpha Blend並不能完全代替Alpha Test。

關於Alpha Test對於Power VR架構的GPU性能的影響,簡單引用一下官方的鏈接以及一篇討論帖:


 

其他部分參看頂部鏈接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章