因為,每家芯片的特性不同,根據向framebuffer寫法的不同,分為tile-based的mobile cpu,如ImgTec
PowerVR
,ARM Mali,一部分老版本Qualcomm
Adreno
。還有標准的direct(immediate
)的mobile cpu,如Nvida,Intel,Viante,以及一部分Qualcomm芯片(Qualcomm的Adreno.3xx系列后是可以在這兩者之間進行切換的)。對tile-based的GPU來說,一旦使用打開alpha test或者其他discard功能的指令,就意味着這個fragment shader上不再只繪制一次像素了。這樣會增加額外的性能消耗,所以一般都是建議用不實用alpha test,或者用alpha blend來代替。
tile-based gpu又分為Tiled Deferred(PowerVR)和Tiled(Adreno,Mali),兩者都是在tile里進行渲染,而區別是TBR有自己的預處理,可以只着色可見像素。

圖 1 三種管線。
TBDR,以蘋果設備用的ImgTec的PowerVR系列來說,在渲染處理時,會在fragment shading 階段提供,在每個tile使用Deferred的方法,進行Hidden Surface Removal(HSR)的處理,原理是fs階段前,對多邊形進行預處理,決定它的哪個像素會對最終結果產生貢獻,后面就只對這些像素進行着色。這個功能需要對不透明幾何體進行排序。也就是說,要進行這種優化,必須要確保一定有能遮擋的像素,然而使用帶有discard的shader指令,例如alpha-test,sample mask,alpha-to-coverage等等,會使得一些本來被遮擋的像素對最終結果產生貢獻,所以,這個特性可能只能對一部分物體產生作用,從而產生額外的狀態切換消費。以及該
fragment額外隱藏像素的處理。

圖2
ImgeTec的渲染處理
除此之外,ImgeTec還有另一個depth-only pass功能,生成深度緩沖,再次
進行渲染時,就可以獲取每個像素的可見深度,只有可見像素才會進行處理。
所以,對於蘋果設備來說,在CPU階段對不透明物體的那種從前向后預處理排序是沒有必要的。而是應該根據渲染狀態來排序。

圖3 ImgTec的
渲染提示
TBR也上有提供類似的
HSR
方法,也就是
early z-cull
,使用粗糙,低精度和分辨率的Zbuffer進行depth-test,測試失敗的fragment則不傳說給rasterization。如果打開alpha test,后果跟TBDR也是類似的。

圖4 TBDR的Deferred vs TBR的 Early z

圖5
Qualcomm的TBR
而IMR上,還是按照傳統方法,盡可能的在CPU上進行Cull,以及從前向后進行距離排序,也提高erlay-z的效率。


不透明物體,early-z的overdraw測試,只有PowerVR不需要進行預先排序處理。紅色是從前向后繪制,藍色是從后向前繪制

如圖,當繪制透明和半透明混合物體時,必須使用discard命令的話,對性能的消耗還是很大的

不同芯片上的的推薦繪制順序
OpenGL Insights Performance Tuning for Tile-Based Architectures
Next-Generation AAA Mobile Rendering
FastMobileShaders
High-End Graphics for Smartphones and Tablets: A Development Case Study" CEDEC 2013