Я изучаю 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, если это помогает.
проверить возвращаемое значение generate * и посмотреть, действительно ли это VAO –
. Кроме того, проверьте, не вернулось ли значение, возвращаемое 'glGetAttribLocation',' -1'. – legends2k
@ legends2k @ratchet freak VAO треугольника: 0, VAO куба: 0, значения возврата glGetAttribLocation являются положительными. Если я отменил порядок 'drawTriangle()' и 'drawCube()': VAO куба: 0, VAO треугольника: 1375791943 (может быть -1?). – KO70