2012-07-15 30 views
5

我正在嘗試頂點陣列的東西,但由於某些原因,glDrawElements命令不會爲我繪製任何東西。我可以在兩者之間使用glBegin/glEnd和glDrawElements,但glDrawElements不起作用。這裏有一個代碼片段:OpenGL:glDrawElements不繪製

這些陣列獲取在構造設置:

double points[100]; 
GLint indices[50]; 

for (int i=0; i < 50; i++){ 
    points[2*i] = radius * cos(i*2*PI/50); 
    points[2*i + 1] = radius * sin(i*2*PI/50); 
    indices[i] = i; 
} 

工作只用點陣列glArrayElement代碼:

void GLCircle::draw() 
{ 
    glEnableClientState(GL_VERTEX_ARRAY); 
    glVertexPointer(2, GL_DOUBLE, 0, points); 

    glBegin(GL_POLYGON); 
    for (int i=0; i < 50; i++){ 
     glArrayElement(i); 
    } 
    glEnd(); 
} 

而且工作代碼,使用點陣列,通過索引數組訪問的特定索引:

void GLCircle::draw() 
{ 
    glEnableClientState(GL_VERTEX_ARRAY); 
    glVertexPointer(2, GL_DOUBLE, 0, points); 

    glBegin(GL_POLYGON); 
    for (int i=0; i < 50; i++){ 
     glArrayElement(indices[i]); 
    } 
    glEnd(); 
} 

非工作代碼,試圖使用glDrawElements:

void GLCircle::draw() 
{ 
    glEnableClientState(GL_VERTEX_ARRAY); 
    glVertexPointer(2, GL_DOUBLE, 0, points); 

    glDrawElements(GL_POLYGON, 4, GL_INT, indices); 
} 

有什麼建議嗎?這不是完全必要對我來說,在這一點上使用它,但它是令人不安的是,它不工作...

回答

7

glDrawElements的第二個參數是count,所以不宜4是指標數(50) ?是

4

glDrawElements() 

的參數如下..:

第一[模式]參數是呈現什麼樣的原語。

2nd [count]參數應該是要呈現的元素的數量。即。的頂點

第三[類型]參數應在第四參數的值的類型..只能爲

GL_UNSIGNED_BYTE or GL_UNSIGNED_SHORT or GL_UNSIGNED_INT 

第四[指數]參數是指向索引存儲位置的指針。

你可以閱讀更多關於這個here ...

+3

「第四[指數]參數是一個指向索引的存儲位置。」 NOOOOOO!索引必須存儲在當前綁定到GL_ELEMENT_ARRAY_BUFFER的緩衝區中。第四個參數是indices數組中的偏移指針。 – IceCool 2013-07-22 19:51:37

+0

我在引用官方文檔.. http://www.opengl.org/sdk/docs/man/xhtml/glDrawElements.xml – iKlsR 2013-07-22 19:57:39

+5

哦,是的,對吧。它確實是指向索引存儲位置的指針。但與普通的c指針不同,它不指向系統內存中的數據,而是指向元素緩衝區中的數據(因此0x0是IB中的第一個元素)。 – IceCool 2013-07-24 21:04:00

0

我剛剛遇到了同樣的問題。

嘗試GL_UNSIGNED_INT

glDrawElements(GL_POLYGON, 4, GL_UNSIGNED_INT, indices);