簡體   English   中英

OpenGL ES,Z緩沖區,2D精靈,廢棄,性能

[英]OpenGL ES, Z-Buffer, 2D sprites, discard, performance

我有一個復古的2D游戲,其中包含很多不使用半透明性的精靈(讓人聯想到Sega的Super Scaler街機游戲)。 我已經考慮過使用Z緩沖區進行排序以簡化事情。 好的,但是默認情況下,即使alpha為零,也會對Z緩沖區進行寫操作,效果如下所示:

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

現在,由於我使用的是OpenGL ES 2,所以我沒有進行alpha測試,因此據我了解,我唯一的可能性是如果alpha為0,則從片段着色器中丟棄像素,以免將其寫入到Z緩沖區。 但是就性能而言,這是錯誤的:不僅if的速度很慢,而且discard基本無法達到目的,因為它禁用了早期的深度測試,其結果比在軟件中做的還要差。

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

我還有其他可以使用的解決方案嗎? 所有2D游戲都自己對精靈進行排序而不使用深度緩沖區嗎?

確實是一個權衡。 如果讓z緩沖區進行排序並在着色器中使用丟棄,那么在GPU上的價格會更高,這是因為您所說的分支和后期深度測試。

如果您自己進行深度排序,那么您會發現很難以最佳順序發出繪圖調用(例如,您將不得不更改紋理)。 在低端設備上,GLES2上的繪圖調用對CPU的影響很大,並且數量可能會增加。

如果性能是一個大問題,那么如果您在紋理貼圖前端上花大力氣以最大程度地減少繪制調用次數,那么第二種選擇可能會更好,如果您的精靈是低分辨率的復古精靈,這可能會特別有效,因為您可以在每個紋理圖集上獲得大量精靈。 無論如何,這顯然不是贏家,我可以想象不同的游戲采用不同的方法。

另外,您應考慮到,無論選擇哪種路徑,絕大多數目標硬件都將正常運行,也許您應該只選擇一種實現速度更快,使代碼更簡單的路徑(這可能會使z -buffer進行排序)。

如果您遇到技術難題,我通常認為最好的方法可能是將子畫面划分為完全不透明的部分和具有透明性的部分,並將這兩個部分渲染為單獨的網格(不再是四邊形)。 您必須進行大量預處理並繪制更多三角形,但是通過能夠使用完全不透明的部分進行渲染,您可以在所有iOS設備和許多其他設備中利用隱藏表面去除技術。 Android設備。 當然,這樣做可以減輕填充率的負擔,但要以增加繪制調用為代價,並且代碼和工具的復雜性可能會不必要地增加。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM