2010-06-20 60 views
1

我正在用OpenGL繪製2D形狀。他們沒有使用那麼多的多邊形。我注意到,只要它們不重疊,我可以有很多很多形狀。如果我在背後有一個形狀,那麼它就會開始落後。我覺得我可能會做錯事。這是正常的,有沒有辦法解決這個問題(我不能忽略渲染,因爲我混合了alpha)。我也啓用了CW背面剔除。2D OpenGL場景變慢,出現大量重疊的形狀

謝謝

回答

2

你的兩個案例(重疊和不重疊)使用完全相同的一組形狀?因爲如果重疊的情況涉及所有形狀的總面積大於第一種情況,那麼預計它會變慢。如果它們是一組相同的形狀,如果它們中的一些重疊會減慢速度,那麼這將是非常不尋常的,並且不應該發生在任何標準硬件OpenGL實現(您使用的平臺是什麼?)上。背面剔除不會造成任何問題。

每當繪製圖形時,GPU必須爲它在屏幕上覆蓋的每個像素做一些工作。如果你在同一個地方繪製相同的形狀100次,那麼這是100倍的像素工作。如果以深度排序的順序繪製對象,則深度緩衝可以減少不透明對象的一些額外成本,但該技巧對於使用透明度的事物不起作用。

使用透明度時,它是每個渲染形狀的面積的總和。不是呈現所有內容後所覆蓋的屏幕數量。

+1

如果我在它的頂部有相同的形狀100倍,它的速度比100個副本慢5個單位。 – jmasterx 2010-06-20 16:47:40

+0

你使用什麼硬件/驅動程序?這在任何硬件加速的GL實現中都不應該發生。除非您的非重疊案例將某些形狀從窗口邊緣移開,因爲GPU可以忽略視錐體外部的某些對象。 – Alan 2010-06-21 18:04:44

0

如果不透明,您需要從前到後排列您的形狀。然後深度測試可以快速輕鬆地拒絕每個像素。

然後,如果它們是透明的,那麼您需要對它們進行反向排序。渲染透明度亂序很慢。

編輯:嗯,我(不知何故)錯過了事實,即這是2D,儘管事實上,OP的反覆提及。

+0

它們按照它們繪製的順序排序,考慮到我在繪製2D圖形時應該啓用深度緩衝區嗎? – jmasterx 2010-06-20 13:39:16

+0

我在做glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); – jmasterx 2010-06-20 13:40:55

+0

如何在2D中解決它?謝謝 – jmasterx 2010-06-20 14:00:45