【问题标题】:glDrawArrays Access ViolationglDrawArrays 访问冲突
【发布时间】:2016-01-19 18:08:18
【问题描述】:

我正在尝试遵循 [this][1] 简单教程,但在到达“glDrawArrays”时出现以下错误:

openGLTest.exe 中 0x03D7598E (nvoglv32.dll) 处的未处理异常:0xC0000005:访问冲突读取位置 0x00000000。

void createMesh(void) {
    float* vertices = new float[18];// Amount of vertices

    vertices[0] = -0.5; vertices[1] = -0.5; vertices[2] = 0.0; // Bottom left corner
    vertices[3] = -0.5; vertices[4] = 0.5; vertices[5] = 0.0; // Top left corner
    vertices[6] = 0.5; vertices[7] = 0.5; vertices[8] = 0.0; // Top Right corner

    vertices[9] = 0.5; vertices[10] = -0.5; vertices[11] = 0.0; // Bottom right corner
    vertices[12] = -0.5; vertices[13] = -0.5; vertices[14] = 0.0; // Bottom left corner
    vertices[15] = 0.5; vertices[16] = 0.5; vertices[17] = 0.0; // Top Right corner

    glGenVertexArrays(1, &vaoID[0]); // Create our Vertex Array Object
    glBindVertexArray(vaoID[0]); // Bind our Vertex Array Object so we can use it

    glGenBuffers(1, vboID); // Generate our Vertex Buffer Object
    glBindBuffer(GL_ARRAY_BUFFER, vboID[0]); // Bind our Vertex Buffer Object
    glBufferData(GL_ARRAY_BUFFER, 18 * sizeof(GLfloat), vertices, GL_STATIC_DRAW); // Set the size and data of our VBO and set it to STATIC_DRAW

    glVertexAttribPointer((GLuint)0, 3, GL_FLOAT, GL_FALSE, 0, 0); // Set up our vertex attributes pointer

    glEnableVertexAttribArray(0); // Disable our Vertex Array Object
    glBindVertexArray(0); // Disable our Vertex Buffer Object

    delete[] vertices; // Delete our vertices from memory

    glBindVertexArray(vaoID[0]); // Bind our Vertex Array Object

    glDrawArrays(GL_TRIANGLES, 0, 6); // Draw our square

    glBindVertexArray(0); // Unbind our Vertex Array Object 
}

我不知道是什么原因造成的,因为教程是一样的!

【问题讨论】:

  • 我还在查看代码,但预感如果你删除delete[] vertices;会发生什么?
  • 我删除了它,但仍然发生相同的访问冲突。
  • 好的。 OpenGL 在幕后做了一些有趣的事情,所以最好排除这样的事情。
  • 您可能希望发布整个代码,包括 main 方法。 initGL() 函数看起来有点可疑,但我无法确定这一点,除非我能看到它是如何从主函数中调用的。
  • 我尝试移动 glewInit,但无济于事。代码在上面发布,减去与 OpenGL 无关的方法。这个简单的方框图部分似乎是唯一出现的 OpenGL 问题,因为我可以毫无问题地绘制点和线。对于一些见解,这是有效的:示例视频

标签: c++ opengl visual-studio-2013 gldrawarrays


【解决方案1】:

在处理 OpenGL 时,读取位置 0 的访问冲突通常意味着未正确建立与 OpenGL API 的挂钩。 GLEW 是否在您的代码中正确设置?您是否致电glewInit() 并验证结果为GL_TRUEglewInit() 是在使上下文成为当前上下文之前还是之后被调用的?验证所有这些内容,它应该可以解决问题。

【讨论】:

  • 我在我的 'int InitGL(GLvoid)' 方法中调用 glewInit() 来设置诸如 'glShadeModel(GL_SMOOTH)' 或 'glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST)' 之类的东西。这还不算早吧?它给出了 GLEW_OK 并且似乎没有进入错误检查。更新了主要问题以显示这一点。
【解决方案2】:

经过大量实验,我通过将第一行更改为:

float vertices[18];

并删除:

delete[] vertices;

【讨论】:

  • 您可能没有修复它,而是使错误更难重现。
【解决方案3】:

我在使用 glDraw 时遇到了同样的错误。我通过先绑定 VertexArray 然后再绑定 IndexBuffer 来修复它

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-04
    • 1970-01-01
    • 1970-01-01
    • 2017-05-06
    • 2013-02-26
    • 2015-04-23
    相关资源
    最近更新 更多