使用一个着色器,GLEW,OPGL,C ++绘制多个对象

时间:2018-07-11 18:55:42

标签: c++ opengl glsl glew

我一直在经历tutorial,但我不明白为什么需要进行两次绘制调用,为什么不能在前面的缓冲区中再增加一个三角形并增加数量绘制的顶点数。

当我制作另一个缓冲区只是为了制作一个三角形时,我真的不明白为什么需要另一个MVP,因为应该从同一角度查看它,以及我应该如何只使用一个着色器并确定两个不同物体的位置?

我看了以前的教程,对此仍然感到困惑。我认为我可以做其他练习,但是我不完全了解它的工作原理。

1 个答案:

答案 0 :(得分:0)

我设法找到了解决方法...万一其他人遇到同样的问题:

绘制立方体后,我打电话给

glDisableVertexAttribArray(0);

然后我再次启用它(将新的网格附加到它),并允许着色器使用布局的位置。 我统一了另一个MVP(再次称为MVP,因此相同的着色器也可以使用)。 其他步骤基本相同...

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glUseProgram(programID);

    GLuint MatrixID = glGetUniformLocation(programID, "MVP");
    glUniformMatrix4fv(MatrixID, 1, GL_FALSE, &mvp[0][0]);

    glEnableVertexAttribArray(0);
    glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
    glVertexAttribPointer(
        0,
        3,
        GL_FLOAT,
        GL_FALSE,
        0,
        (void *)0);

    glEnableVertexAttribArray(1);
    glBindBuffer(GL_ARRAY_BUFFER, colorBuffer);
    glVertexAttribPointer(
        1,
        3,
        GL_FLOAT,
        GL_FALSE,
        0,
        (void *)0);

    glDrawArrays(GL_TRIANGLES, 0, /*12*3*/ 36);

    glDisableVertexAttribArray(0);




    GLuint MatrixIDTriangle = glGetUniformLocation(programID, "MVP");
    glUniformMatrix4fv(MatrixIDTriangle, 1, GL_FALSE, &mvpTriangle[0][0]);

    glEnableVertexAttribArray(0);
    glBindBuffer(GL_ARRAY_BUFFER, triangleBuffer);
    glVertexAttribPointer(
        0,
        3,
        GL_FLOAT,
        GL_FALSE,
        0,
        (void *)0);
    glDrawArrays(GL_TRIANGLES, 0, 3);
    glDisableVertexAttribArray(0);


    glfwSwapBuffers(window);
    glfwPollEvents();