2015-07-13 109 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。因此,您將無法再使用已棄用的功能。