2009-06-11 181 views
3

我有一個可以是三角形和四邊形的多邊形網格數據結構。什麼是使用OpenGL繪製它的最快方法?OpenGL:繪製三角形和四邊形混合的最快方法?

緩慢的方法是迭代結構和每個多邊形,以使10或GL_TRIANGLES爲合適的glBegin() .. glEnd()。我想避免必須爲每個多邊形執行glBegin() .. glEnd()

另一種選擇是將結構分成兩個結構,一個包含三角形,另一個包含四邊形,然後分別翻過來。這也是我想避免的,因爲我真的想把它們全部放在一個單一的結構中。

不幸的是,將四邊形三角形分成三角形不是目前的選擇。

有沒有很好的解決方案呢?

+0

「每個多邊形」,你的意思是每個三角形\ quad,或者你是指每個由三角形和四邊形組成的網格? – 2010-06-29 21:20:46

回答

3

您可能需要創建兩個指示表,一個用於三角形四邊形,然後寫入所有四邊形,然後是三角形(或反轉)。要使用索引數組進行繪製,請使用glDrawElementsglVertexPointerglEnableClientState以使其起作用。

此外,如果你真的想獲得速度,你可以把所有的頂點放在一個VBO和你的指針。這樣你就可以獲得GPU內存上的所有頂點和索引。

+1

作爲推論:使用OpenGL減少glXXX調用的次數通常會提供加速。 如果可能,您還應該使用_STRIP繪圖模式。 – Dolphin 2009-06-11 19:59:26

3

你總是可以很容易地將它們全部轉換成三角形。

基本上僞會是這個樣子:

glBegin(GL_TRIANGLES); 
for each (object *a in objectList) 
    if (a->type == TRIANGLE) 
    glVertex3fv(a->vertices); 
    if (a->type == QUAD) 
    { 
    glVertex3f(a->vertices[0]); 
    glVertex3f(a->vertices[1]); 
    glVertex3f(a->vertices[2]); 

    glVertex3f(a->vertices[2]); 
    glVertex3f(a->vertices[1]); 
    glVertex3f(a->vertices[3]); 
    } 
glEnd(); 

你必須要小心,讓他們面向同樣的方式(順時針或逆時針),但它應該工作!

+0

這個問題是,如果我用glPolygonMode(GL_LINE)繪製它,會出現一條對角線。 – shoosh 2009-06-13 00:52:42

1

至於glPolygonMode(GL_LINE)和分解的GL_QUADS go,glEdgeFlagPointer()應該是您正在查找的功能。 GL_TRUE用於四邊形線段,GL_FALSE用於四邊形對角線。

不要忘記glEnableClientState(GL_EDGE_FLAG_ARRAY)。