2013-02-19 105 views
3

我正在製作一個2D遊戲,涉及在屏幕上繪製大量重疊四邊形。什麼並不重要。當點有相同的深度時,opengl深度緩衝區變慢

如果我繪製每個四元組的z值從0開始,並設置glDepthFunc(GL_LESS),我會得到相當不錯的速度提升,就像您期望的那樣。 這是爲了避免必須繪製完全隱藏或部分隱藏在其他四邊形之後的四邊形。 所以我使用類似繪製四邊形:

float small = (float(1)/1000000); 
for (int iii = 0; iii < 100000; iii++) { 
    freeSpace = bullets[iii]->draw(opengl, freeSpace, iii*small); 
} 

不過,因爲我不使用實際深度Z值好像我應該能夠只是去:

for (int iii = 0; iii < 100000; iii++) { 
    freeSpace = bullets[iii]->draw(opengl, freeSpace, 0.0f); 
} 

或者只是將0.0f的z值編碼到着色器中。 (第三個參數是z值,最終在着色器中不變地設置爲gl_position。)

奇怪的是,第二種方法(其中我每次將z值設置爲0.0f)最終變得差不多不到前者幀率的一半。

這是爲什麼?他們都使用glDepthFunc(GL_LESS)和

glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); 
glDrawArrays(GL_TRIANGLES, 0, 100000*(2*3)); 

只是一樣。我會認爲,如果將z設置爲0.0f,每次都會更快。爲什麼不是?

+0

什麼值你清除深度緩衝區? – 2013-02-19 04:07:38

+0

不,但小於1(這是深度緩衝區被清除的內容)。所以這個想法是每個像素只寫入一次。我可以使用GL_LEQUAL,它仍然有可怕的表現(與GL_LESS相同)。我的目標是試圖讓深度緩衝區只讓每個像素被繪製一次,以減少填充率要求。 – Ellipsis 2013-02-19 04:08:14

+0

深度緩衝區清除爲默認值(我從不改變它)。所以我相信它會清楚地表明1.0。 – Ellipsis 2013-02-19 04:33:45

回答

3

我並不積極,但我的猜測是基元之間z值的小三角形允許zcull硬件工作。這將在片段到達片段着色器之前挑選出碎片。除了避免片段着色器的工作外,當片段進行深度緩衝區測試時,這種剔除的發生速度可能比正常的z-測試更快。

+0

啊,謝謝。這聽起來可能。我在片段着色器中丟棄了,所以我認爲早期的zcull是不可能的。然而,正常的撲殺可能會發生。奇怪的是,當點具有和z值時它不會發生?我怎麼能解決這個問題?我目前的方法似乎令人費解。我應該使用模板緩衝區,還是讓頂點着色器以某種方式生成z值?無論如何,謝謝你的回覆。 – Ellipsis 2013-02-19 04:28:34

+0

哦,是的,如果你在片段着色器中殺掉碎片,zcull硬件將無法使用,這也會影響其他z測試性能的提升。如果你可以避免做片段着色器殺死你可能會發現一個顯着的性能改善。 – 2013-02-19 04:44:48

+0

我必須畫圓圈,因爲這似乎是不可避免的。我正在將四邊形紋理繪製到四邊形和以太網上,所以我必須對其進行混合,這會導致放慢速度,或者在片段着色器中丟棄Alpha值爲0的所有像素。還有另一種(更好的)方法嗎?即使我在片段着色器中丟棄了,我是否認爲某種類型的拼圖仍在繼續? – Ellipsis 2013-02-19 04:58:42