【问题标题】:OpenGL 3.0: Access Violation exception caused by VBOsOpenGL 3.0:由 VBO 引起的访问冲突异常
【发布时间】:2011-07-11 16:00:22
【问题描述】:

我正在更新一个相当过时的 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 的旧式调用一切正常...但现在我的程序因访问冲突异常而崩溃。知道这可能来自哪里吗?

谢谢

【问题讨论】:

  • 我也尝试在初始化期间调用 glBufferData() 但没有成功。

标签: vbo opengl-3


【解决方案1】:
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);

不要打电话给他们。它们不需要并且已弃用。 你只需要告诉 OpenGL 你的数据是如何用属性集组织的。 看看这个教程: http://arcsynthesis.org/gltut/

另外,不要使用 GLew。它会导致 glErrors() 出现,因为它使用不推荐的方式来枚举扩展。 请改用 GL3w。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-17
    • 2017-01-01
    • 2012-11-14
    相关资源
    最近更新 更多