Using Striped Arrays in VAO

I am learning OpenGL 4.0 and want to draw a simple triangle using OpenGL 4.0 and GLSL. I am using VAO with alternating arrays to do this, but the result it displays is not what I want:

enter image description here

Now I am sending part of my code:

void SceneBasic::setupVAOInterleavedArrays()
{
    //三角形的顶点和颜色信息数组:混合数组
    float positionAndColorData[] = {
        -0.8f, -0.8f, 0.0f,1.0f, 0.0f, 0.0f,
        0.8f, -0.8f, 0.0f,0.0f, 1.0f, 0.0f,
        0.0f,  0.8f, 0.0f,0.0f, 0.0f, 1.0f };

    //glInterleavedArrays(GL_C3F_V3F,0,positionAndColorData)

    GLuint vboHandle;//VBO
    glGenBuffers(1,&vboHandle);

    glBindBuffer(GL_ARRAY_BUFFER,vboHandle);
    glBufferData(GL_ARRAY_BUFFER,18 * sizeof(float),
        positionAndColorData,GL_STATIC_DRAW);

    //VAO
    glGenVertexArrays(1,&vaoHandle);
    glBindVertexArray(vaoHandle);

    //enable the generic vertex attribute indexes
    //indicates that the values for the attributes will be accessed
    //and used for rendering
    glEnableVertexAttribArray(0);//position
    glEnableVertexAttribArray(1);//color

    //make the connection between the buffer objects and the generic 
    //vertex attributes indexes
    glBindBuffer(GL_ARRAY_BUFFER,vboHandle);
    glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,3 * sizeof(float),BUFFER_OFFSET(0));
    glBindBuffer(GL_ARRAY_BUFFER,vboHandle);
    glVertexAttribPointer(1,3,GL_FLOAT,GL_FALSE,3 * sizeof(float),BUFFER_OFFSET(3 * sizeof(float)));
}

void SceneBasic::initScene()
{
    compileAndLinkShader();

    //setupVAO();
    setupVAOInterleavedArrays();
}

void SceneBasic::render()
{
    glClear(GL_COLOR_BUFFER_BIT);

    glBindVertexArray(vaoHandle);
    glDrawArrays(GL_TRIANGLES,0,3);
    glBindVertexArray(0);
}

But if I do not use a striped array, the result will be right: enter image description here

This is part of my code when I do not use striped arrays:

void SceneBasic::setupVAO()
{
    //三角形的顶点和颜色信息数组
    float positionData[] = {
        -0.8f, -0.8f, 0.0f,
        0.8f, -0.8f, 0.0f,
        0.0f,  0.8f, 0.0f };
    float colorData[] = {
        1.0f, 0.0f, 0.0f,
        0.0f, 1.0f, 0.0f,
        0.0f, 0.0f, 1.0f };

    glGenBuffers(2,vboHandles);
    GLuint positionBufferHandle = vboHandles[0];
    GLuint colorBufferHandle = vboHandles[1];

    glBindBuffer(GL_ARRAY_BUFFER,positionBufferHandle);
    glBufferData(GL_ARRAY_BUFFER,9 * sizeof(float),
        positionData,GL_STATIC_DRAW);

    glBindBuffer(GL_ARRAY_BUFFER,colorBufferHandle);
    glBufferData(GL_ARRAY_BUFFER,9 * sizeof(float),
        colorData,GL_STATIC_DRAW);

    //VAO
    glGenVertexArrays(1,&vaoHandle);
    glBindVertexArray(vaoHandle);

    //enable the generic vertex attribute indexes
    //indicates that the values for the attributes will be acessed
    //and used for rendering
    glEnableVertexAttribArray(0);
    glEnableVertexAttribArray(1);

    //make the connection between the buffer objects abd the generic 
    //vertex attributes indexes
    glBindBuffer(GL_ARRAY_BUFFER,positionBufferHandle);
    glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,0,BUFFER_OFFSET(0));

    glBindBuffer(GL_ARRAY_BUFFER,colorBufferHandle);
    glVertexAttribPointer(1,3,GL_FLOAT,GL_FALSE,0,BUFFER_OFFSET(0));
}

I am so curious why my code does not give the expected result when using alternating arrays?

+5
source share
1 answer

The step is incorrect, since you have 6 elements to the top, you need to go 6 * sizeof (float)as a step.

+8
source

All Articles