2011-12-04 117 views
0

我打算使用VBO來顯示一個大的點數組,大約512x512。爲了顯示它,每個頂點依賴於它的最近的鄰居。例如,如果我有如下表:OpenGL VBO繪畫順序

[ 1, 2, 3, 5, 6, 7 
    8, 9,10,11,12,13, 
14,15,16,17,18,19] 

,我想用5點繪製多邊形,我將不得不使用下面的代碼:

glBegin(GL_TRIANGLE_STRIP) 
glVertex(Points5) 
glVertex(Points6) 
glVertex(Points11) 
glVertex(Points12) 
glEnd() 

等任何其他點我知道在任何給定的時刻,我的緩衝區只能保存512x512點,但我怎樣才能「教」它以使用GL_TRIANGLE_STRIP和VBO以特定方式繪製?

+2

有沒有關於你在[這個答案](http://stackoverflow.com/a/8293488/734069)的評論中有困惑的話嗎? Datenwolf已經告訴你不要這樣做,「把每個都作爲一個單獨的地帶」來完成。這可能就是爲什麼你的表現在即時模式下很糟糕。 –

+0

Nicol Bolas:好吧,我不能找到在給定的代碼(你的鏈接)中的部分,我指定繪畫的方式,如上面的glVertex示例所示 –

回答

0

首先,不會爲每個獨立的四邊形繪製單獨的三角形條帶!只需將這些四邊形中的每一個分成兩個三角形,並將這些三角形的所有頂點索引放入單個索引數組/緩衝區中,就像Brett Hale所建議的那樣。通過這種方式,您可以通過一次調用glDrawElements(GL_TRIANGLES, ...)來繪製整個網格。

如果你不知道索引數組是什麼或者頂點數組/緩衝區是什麼,那麼你應該深入研究一下這個主題。但通過一切手段,請遠離目前爲每個四邊形繪製單條的解決方案。它聽起來可能聽起來很棒(關於發送頂點的數量),但事實並非如此。請記住,VBOs的優勢不僅僅在於可能的GPU存儲,也是因爲您不需要針對每個原始單元的驅動程序調用,而且您的當前解決方案只能以這種方式完成。

您也可以使用GL_QUADS而不是GL_TRIANGLES。這樣,你仍然只需要四個索引(相比之下,使用三角形時爲6),並且仍然可以在一次調用中繪製它。但是請記住GL_QUADS已經從較新的OpenGL版本(3+)以及ES的核心配置文件中刪除。所以GL_TRIANGLES可能是一個更便攜的解決方案(無論如何GPU都會將它分解成三角形)。

2

我認爲最好的解決方案是使用索引(GL_ELEMENT_ARRAY_BUFFER)緩衝區以索引表示基元。 ref

編輯:

我無法從你的問題告訴我們,但你可能需要調查退化三角形帶(加入退化三角形),以避免過多的繪製調用。

+0

儘管degenrate三角形可能是需要研究的東西,但絕對不適合每個單獨的四邊形,就像他現在想要做的那樣。 –

+0

感謝您的回答,另一個問題是,在運行時, 我首先計算每個點分開(CUDA),然後,在繪畫(glVertex)過程中,我必須重新構建我的整個數據數組結構,二次繪畫風格(每次添加3個額外的點到當前點 - 請參閱我的問題從繪畫風格)? 不會變慢嗎?因爲我首先必須重新排列點並繪製它們。 –