2011-02-06 155 views
4

我剛開始使用VBOs,並且除了頂點索引緩衝區之外,一切似乎都很好。如果我啓用索引緩衝區後調用glDrawElements,我會得到一個訪問衝突錯誤(找不到索引),如果我簡單地用指向內存中索引數組開頭的指針調用它,它就會工作..OpenGL:頂點索引緩衝區問題

//DOESN'T WORK 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indices); 
glDrawElements(GL_TRIANGLES, stripIndices.size(), GL_UNSIGNED_INT, 0); 

//WORKS 
glDrawElements(GL_TRIANGLES, stripIndices.size(), GL_UNSIGNED_INT, &stripIndices[0]); 

我覺得設置起來的時候,我做的一切權利,但我仍然會後一些代碼:

glGenBuffers(1,&vtxBuffer); 
glGenBuffers(1,&nrmBuffer); 
glGenBuffers(1,&clrBuffer); 
glGenBuffers(1,&indices); 

glBindBuffer(GL_ARRAY_BUFFER, vtxBuffer); 
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*vertices.size(), 
    &vertices[0], GL_STATIC_DRAW); 

glBindBuffer(GL_ARRAY_BUFFER, nrmBuffer); 
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*normals.size(), 
    &normals[0], GL_STATIC_DRAW); 

glBindBuffer(GL_ARRAY_BUFFER, clrBuffer); 
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*colors.size(), 
    &colors[0], GL_STATIC_DRAW); 

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indices); 
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLuint)*stripIndices.size(), 
    &stripIndices[0], GL_STATIC_DRAW); 

,並提請我做的:

glEnableClientState(GL_VERTEX_ARRAY); 
glEnableClientState(GL_COLOR_ARRAY); 
glEnableClientState(GL_NORMAL_ARRAY); 

glPushMatrix(); 
    glRotatef(25.f,0.f,1.f,0.f); 
    s->draw(); 
glPopMatrix(); 

glDisableClientState(GL_VERTEX_ARRAY); 
glDisableClientState(GL_COLOR_ARRAY); 
glDisableClientState(GL_NORMAL_ARRAY); 

的S->畫()線路電話:

glBindBuffer(GL_ARRAY_BUFFER, vtxBuffer); 
glVertexPointer(3,GL_FLOAT,0,&vertices[0]); 

glBindBuffer(GL_ARRAY_BUFFER, clrBuffer); 
glNormalPointer(GL_FLOAT,0,&colors[0]); 

glBindBuffer(GL_ARRAY_BUFFER, clrBuffer); 
glColorPointer(3,GL_FLOAT,0,&clrVtx[0]); 

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indices); 
glDrawElements(GL_TRIANGLES, stripIndices.size(), GL_UNSIGNED_INT, &stripIndices[0]); 

(注:在所有的指針/ drawElements呼叫,而不是& .. [0]在端指針我想使用頂點緩衝器下標,但我不能)。

這是問題出現的地方。我不明白。我生成的緩衝區對象,填充索引數據,但是當涉及到繪製它似乎並沒有找到它。任何人有任何想法如何解決這個問題?

由於

編輯:我認爲編譯器解釋的偏移「0」到緩衝器對象在內存中的指針位置「0」,這將引發訪問衝突錯誤。

+0

你能用你實際使用的代碼更新你的問題嗎?例如,用tibur的回答中的建議來修正對glVertexPoint的調用。而且,你的代碼初始化一個正常的緩衝區;然後使用顏色緩衝區。很難說你的代碼看起來不完整。 – rotoglup 2011-02-06 22:25:38

+0

好點,我沒有注意到 – Zepee 2011-02-06 22:55:10

回答

2

你應該嘗試:

glBindBuffer(GL_ARRAY_BUFFER, vtxBuffer); 
glVertexPointer(3,GL_FLOAT,0,0L); 

glBindBuffer(GL_ARRAY_BUFFER, clrBuffer); 
glColorPointer(3,GL_FLOAT,0,0L); 

當緩衝區束縛,gl*Pointer調用的最後一個參數是一個在GPU上的緩衝區偏移量,而不是一個內存地址。

編輯

你的指數似乎是int型的(看你glBufferData),但您使用它們在你的glDrawElements爲無符號。

+0

是的,當然,我錯過了...但它仍然無法正常工作..如果它有幫助,當程序崩潰時它會出現'訪問衝突讀取位置0x0000000 '例外(在glDrawElements線) – Zepee 2011-02-06 15:55:34

-2

你就錯失了一個呼叫

glEnableClientState(GL_INDEX_ARRAY) 

... 

glDisableClientState(GL_INDEX_ARRAY) 

這使GL知道索引,從一個物體發出,而不是一個直接指針。
上帝我討厭這些功能。