我正在更新一个过时的OpenGL项目。所以我试图从顶点数组转移到VBO,但是我有一个无法跟踪的访问冲突异常。
所以我使用的是我在类构造函数中生成的VBO和IBO:
if (glewIsSupported("GL_VERSION_3_0")) {
glGenBuffers(2, bufferIds);
}
(已经调用了glewInit())
各种渲染对象定义为:
struct RenderBufferVertexElement
{
NxVec3 position;
NxVec3 normal;
float texCoord[2];
};
// The rendering buffers
RenderBufferVertexElement* mVertexRenderBuffer;
NxU32* mIndexRenderBuffer;
// Buffer Objects
enum {
VBO,
IBO
};
GLuint bufferIds[2];
然后在我的绘图功能中我做:
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
// VBO
glBindBuffer(GL_ARRAY_BUFFER, bufferIds[VBO]);
glBufferData(GL_ARRAY_BUFFER, sizeof(mVertexRenderBuffer), mVertexRenderBuffer, GL_STREAM_DRAW);
glVertexPointer(3, GL_FLOAT, sizeof(RenderBufferVertexElement), BUFFER_OFFSET(offsetof(RenderBufferVertexElement,position)));
glNormalPointer(GL_FLOAT, sizeof(RenderBufferVertexElement), BUFFER_OFFSET( offsetof(RenderBufferVertexElement,normal) ));
// IBO
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, bufferIds[IBO]);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(mIndexRenderBuffer), mIndexRenderBuffer, GL_STREAM_DRAW);
textures.front()->setClientActive();
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(2, GL_FLOAT, sizeof(RenderBufferVertexElement), BUFFER_OFFSET(offsetof(RenderBufferVertexElement,texCoord)));
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, textures.front()->textureId);
[...]
glDrawElements(GL_TRIANGLES, numElements, GL_UNSIGNED_INT, BUFFER_OFFSET(0));
glDisableClientState(...);
glDisable(GL_TEXTURE_2D);
对于glVertexPointer的旧样式调用,一切正常...但是现在我的程序因访问冲突异常而崩溃。知道可能来自何处?
由于
答案 0 :(得分:2)
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
不要打电话给他们。它们不需要和弃用。 您只需要告诉OpenGL如何使用属性集来组织数据。 看看这个教程: http://arcsynthesis.org/gltut/
而且,不要使用GLew。它会导致glErrors()出现,因为它使用不推荐的方式来枚举Extensions。 请改用Gl3w。