使用glDrawElement时访问冲突

时间:2013-08-19 10:19:16

标签: opengl opengl-es

我用glDrawElement编写代码来绘制一个矩形:

Vertex verticesData[] =
    {
        Vertex( Vector3 (-0.5f, -0.5f, 0.0f) , Vector3 (1.0f, 0.0f, 0.0f) ), //0 
        Vertex( Vector3 (-0.5f, 0.5f, 0.0f ) , Vector3 (0.0f, 1.0f, 0.0f)  ), //1
        Vertex( Vector3 (0.5f, 0.5f, 0.0f  ) , Vector3 (0.0f, 0.0f, 1.0f)  ), //2
        Vertex( Vector3 (-0.5f, -0.5f, 0.0f) , Vector3 (0.5f, 0.5f, 0.5f) ) //3
    };

    GLubyte indices[] = 
    {
        0, 1, 2, //1
        0, 2, 3  //2
    };

    glGenBuffers(1, &vboId);
    glBindBuffer(GL_ARRAY_BUFFER, vboId);
    glBufferData(GL_ARRAY_BUFFER, sizeof(verticesData), verticesData, GL_STATIC_DRAW);

    glGenBuffers(1, &indexBufferId);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBufferId);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);

这是在Init()函数中。当程序运行到代码行时,程序会产生runetime错误(访问违规):

glDrawElements(GL_TRIANGLES, 18, GL_UNSIGNED_BYTE, NULL);

此语句位于Draw()函数中。我的代码很长,所以我不能在这里发布我的所有代码,但如果我使用glDrawArray替换2代码块,则没有错误。所以我认为问题出在上面的代码中。 任何人都可以帮我解决这个问题,

1 个答案:

答案 0 :(得分:1)

GLubyte indices[] = 
{
    0, 1, 2, //1
    0, 2, 3  //2
};

...

glDrawElements(GL_TRIANGLES, 18, GL_UNSIGNED_BYTE, NULL);
                             ^^

你有6个指数。如果你告诉OpenGL你有18个,它会在indices数组的末尾读到。

代替传入6。