2015-07-13 108 views
0

我正在学习opengl,目前我正在与VAO拼搏。 我想用VAO画一个立方体和一个三角形,但不幸的是,只绘制了我以后创建的对象。这是我做的主循环:Opengl VAO被覆盖

void main() 
{ 
    //loading shader, generate window, etc ... 

    //generate a cube: 
    GLuint cube_vao = generateCube(); 

    //next, generate a triangle: 
    GLuint triangle_vao = generateTriangle(); 

    glEnable(GL_DEPTH_TEST); 
    glDepthFunc(GL_LESS); 

    // Clear the screen 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    do 
    { 
    //draw: 
    glBindVertexArray(triangle_vao); 
    glDrawArrays(GL_TRIANGLES, 0, 3); 

    glBindVertexArray(cube_vao); 
    glDrawArrays(GL_TRIANGLES, 0, 12*3); 

    glfwPollEvents(); 
    glfwSwapBuffers(window); 

    } while (glfwGetKey(window, GLFW_KEY_ESCAPE) != GLFW_PRESS && 
      glfwWindowShouldClose(window) == 0); 
} 

两者generateCube()generateTriangle()基本上做同样的事情:创造顶点,创建VBO,创建VAO并设置属性。然后他们返回vao id。 这是generateTriangle()例如:

generateTriangle() 
{ 
    //generate the vertex positions: 
    GLfloat triangle_pos[] = //not part of the snippet -> too long 

    //generate vbo for the positions: 
    GLuint pos_vbo; 
    glGenBuffers(1, &pos_vbo); 
    glBindBuffer(GL_ARRAY_BUFFER, pos_vbo); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(triangle_pos), triangle_pos, GL_STATIC_DRAW); 

    //next, generate the vertex colors: 
    GLfloat triangle_color[] = //not part of the snippet -> too long 

    //generate vbo for the colors: 
    GLuint col_vbo; 
    glGenBuffers(1, &col_vbo); 
    glBindBuffer(GL_ARRAY_BUFFER, col_vbo); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(triangle_color), triangle_color, GL_STATIC_DRAW); 

    //generate VAO: 
    GLuint vao; 
    glGenVertexArrays(1, &vao); 
    glBindVertexArray(vao); 

    GLint pos_attrib_id = glGetAttribLocation(programID, "line_pos"); 
    glEnableVertexAttribArray(pos_attrib_id); 
    glBindBuffer(GL_ARRAY_BUFFER, pos_vbo); 
    glVertexAttribPointer(pos_attrib_id, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); 

    GLint col_attrib_id = glGetAttribLocation(programID, "color"); 
    glEnableVertexAttribArray(col_attrib_id); 
    glBindBuffer(GL_ARRAY_BUFFER, col_vbo); 
    glVertexAttribPointer(col_attrib_id, 4, GL_FLOAT, GL_FALSE, 0, (void*)0); 

    //function to set the perspective (argument is the model matrix) 
    setPerspective(glm::mat4(1.0f)); 

    return vao; 
} 

有了这个代码,但只有立方体被绘制。 此外,如果我注释掉主线中的线条: glBindVertexArray(cube_vao);glDrawArrays(GL_TRIANGLES, 0, 12*3);,则三角形会被绘制出来,但具有立方体的颜色和位置,这让我发疯。

如果有帮助,我使用OSX和着色器版本120。

+1

检查generate *的返回值并查看它是否有效VAO –

+1

另外,检查'glGetAttribLocation'返回的值是否不是'-1'。 – legends2k

+0

@ legends2k @ratchet freak三角形的VAO:0,立方体的VAO:0,glGetAttribLocation的返回值是正值。如果我倒转立方体:0,VAO的三角形:1375791943(可能是-1?)的'drawTriangle()'和'drawCube()':VAO的顺序。 – KO70

回答

1

在OpenGL 3.0中引入了VAO作为标准功能。在Mac OS上,默认的上下文版本是2.1。所以你需要在安装过程中专门请求3.x上下文。

获取3.x上下文的确切机制取决于您使用的窗口系统接口/工具包。例如,在GLUT中,在glInitDisplayMode()的参数中包含GLUT_3_2_CORE_PROFILE标志。使用Cocoa,您可以在像素格式属性中包含NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersion3_2Core

请注意,Mac OS仅支持3.x及更高版本上下文的Core Profile。因此,您将无法再使用已弃用的功能。