2015-07-13 3 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. Это 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 являются положительными. Если я отменил порядок 'drawTriangle()' и 'drawCube()': VAO куба: 0, VAO треугольника: 1375791943 (может быть -1?). – KO70

ответ

1

В стандартную функциональность OpenGL 3.0 были введены VAO. В Mac OS по умолчанию используется версия 2.1. Поэтому вам нужно будет запросить контекст 3.x во время установки.

Точная механика получения контекста 3.x будет зависеть от оконного системного интерфейса/инструментария, который вы используете. Например, в GLUT вы включаете флаг GLUT_3_2_CORE_PROFILE в аргументе glInitDisplayMode(). В Cocoa вы включаете NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersion3_2Core в атрибуты формата пикселя.

Обратите внимание, что Mac OS поддерживает только основной профиль для контекстов 3.x и более поздних. Таким образом, вы больше не сможете использовать устаревшие функции.

Смежные вопросы