在VAO中使用交错数组

Xia*_*Jun 5 c++ opengl graphics

我正在学习OpenGL 4.0,我想用OpenGL 4.0和GLSL绘制一个简单的三角形.我正在使用带有交错数组的VAO来实现它,但它显示的结果并不是我想要的结果:

在此输入图像描述

现在我发布部分代码:

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);
}
Run Code Online (Sandbox Code Playgroud)

但如果我不使用交错数组,结果是正确的: 在此输入图像描述

当我不使用交错数组时,这是我的代码的一部分:

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));
}
Run Code Online (Sandbox Code Playgroud)

我很好奇,为什么我的代码在使用交错数组时没有产生预期的结果?

Ben*_*igt 8

步幅是错误的,因为每个顶点有6个元素,你需要6 * sizeof (float)作为步幅传递.