5

我正在学习 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);
}

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

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

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));
}

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

4

1 回答 1

8

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

于 2012-07-02T03:37:48.013 回答