2016-07-05 109 views
0

我有一個復古的2D遊戲,有很多精靈(讓人想起世嘉的超級縮放器拱廊),它不使用半透明。我曾考慮過使用Z-Buffer進行排序來簡化事情。好吧,但默認情況下寫的做,即使阿爾法是零Z緩衝,使這裏所示的效果:OpenGL ES,Z緩衝區,2D精靈,丟棄,性能

http://i.stack.imgur.com/ubLlp.png

現在,因爲我在OpenGL ES是2,我沒有alpha測試,所以從我的理解我唯一的可能性是放棄像素着色器,如果alpha爲0,以便它不會被寫入Z緩衝區。但就性能而言,這是錯誤的:不僅if速度很慢,而且discard基本上也會造成目的,因爲它禁用了早期的深度測試,結果比在軟件中做得更糟。

if (val.a < 0.5) { 
    discard; 
} 

有沒有其他解決方案我可以使用哪些不會殺死性能?所有的2D遊戲都會自行排序,而不是使用深度緩衝區?

回答

0

這是一個折衷。如果您讓z緩衝區在您的着色器中進行排序並使用丟棄,那麼由於您說的分支和深度測試,GPU上的代價會更高。

如果您對自己進行深度排序,那麼您會發現以最佳順序發出繪圖調用會更困難(例如,您將不得不更改紋理)。在GLES2上繪製調用在低端設備上有非常顯着的CPU命中,計數可能會增加。

如果性能是一個很大的問題,那麼如果你在紋理圖形前端花費很大的努力來減少繪製調用次數,那麼第二種方法可能會更好,如果你的精靈很低,這可能特別有效分辨率的復古精靈,因爲你可以得到每個紋理地圖集大量的精靈。這不是一個明顯的贏家,我可以想象不同的比賽採取不同的方法。另外,你應該考慮到絕大多數目標硬件都會按照你選擇的路徑執行,也許你應該選擇一個更快實現的代碼,並且使你的代碼更簡單(這是可能會讓z緩衝區進行排序)。

如果你喜歡技術上的挑戰,我經常會認爲最好的方法可能會將你的精靈分成完全不透明的部分和透明部分,並將這兩部分作爲單獨的網格物體(它們將不再是四邊形)。您必須進行大量預處理並繪製更多的三角形,但通過使用完全不透明的部件進行一些渲染,您可以利用所有iOS設備中的隱藏表面去除技術以及大量Android設備。當然,通過這樣做,您應該能夠減少填充率,但是以增加的平局請求爲代價,並且可能會對代碼和工具造成不必要的高額複雜性。

+0

感謝您的評論!只是爲了確定,你說的第二個選項是什麼?我吸引了很多人(典型的2000〜3000個大型精靈)。 所以在透明和不透明的部分分離的利益是: - 我渲染一個簡單的着色器,通過推移和使用Z緩衝, 不透明貼圖 - 然後我呈現透明的精靈部分,採用Z緩衝太(部件尚未被遮擋)使用if + discard着色器。 - 我嘗試通過預處理去除大部分完全透明的區域。 有點讓我想起我們以前用Mega Drive上的精靈來做什麼^^ – Brunni

+0

今天我遇到了這個馬裏博客,其中提到了爲了效率原因將2D精靈分成不透明和透明的部分:https://community.arm。 COM /組/臂馬裏圖形/博客/ 2015/11/19 /馬裏性能-7-加速-2D-渲染-使用的OpenGL-ES – Columbo