我想在opengl中爲我的2D遊戲繪製大量的2D圓圈。他們都是相同的大小,並具有相同的紋理。許多精靈重疊。什麼是最快的方式來做到這一點?性能 - 在opengl中繪製許多2D圓圈
an example of the kind of effect I'm making http://img805.imageshack.us/img805/6379/circles.png
(應當指出的是,黑邊只是由於圈子的擴大爆炸,裏面裝着一會兒這個截屏拍攝後。
目前我我使用了一對帶紋理的三角形來製作每一個圓,我在紋理的邊緣有透明效果,使它看起來像一個圓圈,使用混合來證明這非常緩慢(並且z culling是不可能的,因爲它們是但是我沒有使用混合,而是讓我的片段着色器丟棄了alpha爲0的任何片段。這可以起作用,但這意味着早期的z不是poss ible(作爲碎片被丟棄)。
的速度由大量透支和GPU的填充率限制。圓圈的順序並不重要(假設它在創建閃爍的幀之間不會改變),所以我一直試圖確保屏幕上的每個像素只能寫入一次。
我試圖通過使用深度緩衝區。在每幀開始時,它被清除爲1.0f。然後當繪製圓時,它將深度緩衝區的那部分更改爲0.0f。如果通常會繪製另一個圓圈,則不是新圓圈的z爲0.0f。這不會低於當前深度緩衝區中的0.0f,因此不會被繪製。這是有效的,並且應該減少必須繪製的像素的數量。然而;奇怪的是它並沒有更快。我已經提出了一個關於這種行爲的問題(opengl depth buffer slow when points have same depth),並且建議在使用相等的z值時,z culling沒有被加速。
相反,我必須給所有我的圈子,從0向上分離假z值。然後當我使用glDrawArrays和默認的GL_LESS渲染時,由於z剔除,我們正確地獲得了速度提升(儘管早期的z不可能,因爲碎片被丟棄以使圓圈可能)。然而,這並不理想,因爲我不得不添加大量與z相關的代碼來進行2d遊戲,而這種遊戲根本不需要它(並且如果可能的話,不會傳遞z值更快)。然而,這是我目前找到的最快捷的方式。
最後,我使用模板緩衝區已經嘗試,這裏我用
glStencilFunc(GL_EQUAL, 0, 1);
glStencilOp(GL_KEEP, GL_INCR, GL_INCR);
當模板緩衝區被重置爲0的每個幀。這個想法是在第一次繪製像素之後。然後在模板緩衝區中將其更改爲非零。那麼該像素不應再次被繪製,從而減少透支量。然而,這已經證明不會比僅僅繪製沒有模板緩衝區或深度緩衝區的東西快。
什麼是最快的方法人們發現寫做什麼,我想?
你是在一個批次中繪製它們嗎? – 2013-02-19 16:38:48
是的,只有一個glDrawArrays(GL_TRIANGLES,0,100001 *(2 * 3));每幀畫出它們全部。 – Ellipsis 2013-02-19 16:52:06
嗯我會期待相當好的結果 - 當窗戶較小時,它會更快? – 2013-02-19 17:01:23