2011-02-06 158 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知道索引,从一个物体发出,而不是一个直接指针。
上帝我讨厌这些功能。