2011-12-10 36 views
1

我有以下代碼:OpengGL glDrawElements繪製線條,但不是三角形

for(auto m:shapes) { 
    glVertexPointer(3, GL_DOUBLE, 0, m->verts); 

    glNormalPointer(GL_DOUBLE, 0, m->normals); 

    glDrawElements(GL_TRIANGLES, m->num_triangles*3, GL_UNSIGNED_INT, m->indices); 
} 

(在圖片圓與點沒關係,它們是由一些其他的代碼繪製對不起,我不能文章中的圖片,我是一個新的用戶...)

http://dl.dropbox.com/u/5269/Screen%20shot%202011-12-10%20at%2012.38.28%20PM.png

這似乎不畫任何東西。

如果我改變GL_TRIANGLES到GL_LINES:

for(auto m:shapes) { 
    glVertexPointer(3, GL_DOUBLE, 0, m->verts); 

    glNormalPointer(GL_DOUBLE, 0, m->normals); 

    glDrawElements(GL_TRIANGLES, m->num_triangles*3, GL_UNSIGNED_INT, m->indices); 
} 

http://dl.dropbox.com/u/5269/Screen%20shot%202011-12-10%20at%2012.44.56%20PM.png

如此看來,座標是在vertext緩衝有效,並且索引緩存也沒關係。 glGetError返回0.最奇怪的是相同的代碼適用於由同一個源生成的其他頂點緩衝區。

任何想法?

+0

也許你是以相反的順序繪製你的Verticle?嘗試'glDisable(GL_CULL_FACE)' –

+0

嗨Banthar!它已被禁用。 –

+0

我不能沒有更多的上下文,但如果你正在使用GL_TRIANGLE基元,爲什麼要乘以'm-> num_triangles * 3'?另外,第二個代碼示例與第一個代碼示例相同。 –

回答

0

嘗試在for循環之前將多邊形模式設置爲GL_LINE(glPolygonMode)。如果你看到線條,它可能是你的投影矩陣的2D繪圖的東西。另外,您在第二張圖片中顯示的線條是否正確?對我來說看似隨機。

+0

我實際上是以3d渲染,凸輪可以旋轉。畫出的線條當然不是三角形的輪廓,但是正確的。我會嘗試改變多邊形模式,好主意。 –

0

你使用這兩個例子非常相同的M->指數(其中,順便說一句,是相同的也佈雷特·黑爾指出,因爲你可能沒有在第二個例子中改變枚舉常量)?

GL_LINES預計對,其中GL_TRIANGLES期望三元組的流的流。我不知道你是怎麼填M->指數,但如果你做了這樣的事情:

0 1 1 2 2 3 3 4 4 5 5 6 ... 

你可能會遇到同樣的問題。當您解讀流爲由對你所有,你很可能看到段:

01 12 23 34 45 56 ... 

但是當你將其解釋爲三胞胎你的三角形,使得兩個頂點重合,所以他們是簡併因此未畫出。

011 223 344 556 ... 

這也是不可能的,你可以成功地使用相同的表達M-> num_triangles * 3兩個電話。也許這是帖子中的另一個問題,你確實在代碼中改變了它。看看glBegin Man Page