OpenGL:顶点索引缓冲区问题
我刚开始使用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”,这将引发访问冲突错误。
你应该尝试:
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
为无符号。
是的,当然,我错过了...但它仍然无法正常工作..如果它有帮助,当程序崩溃时它会出现'访问冲突读取位置0x0000000 '例外(在glDrawElements线) – Zepee 2011-02-06 15:55:34
你就错失了一个呼叫
glEnableClientState(GL_INDEX_ARRAY)
...
glDisableClientState(GL_INDEX_ARRAY)
这使GL知道索引,从一个物体发出,而不是一个直接指针。
上帝我讨厌这些功能。
你能用你实际使用的代码更新你的问题吗?例如,用tibur的回答中的建议来修正对glVertexPoint的调用。而且,你的代码初始化一个正常的缓冲区;然后使用颜色缓冲区。很难说你的代码看起来不完整。 – rotoglup 2011-02-06 22:25:38
好点,我没有注意到 – Zepee 2011-02-06 22:55:10