Opengl VAO 被覆盖
Opengl VAO gets overwritten
我正在学习 opengl,目前正在为 VAO 苦苦挣扎。
我想使用 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 和设置属性。然后他们 return 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 一起使用。
VAO 在 OpenGL 3.0 中作为标准功能引入。在 Mac OS 上,默认上下文版本为 2.1。因此,您需要在设置期间专门请求 3.x 上下文。
获取 3.x 上下文的确切机制将取决于您使用的 window 系统 interface/toolkit。例如,在 GLUT 中,您在 glInitDisplayMode()
的参数中包含 GLUT_3_2_CORE_PROFILE
标志。使用 Cocoa,您可以在像素格式属性中包含 NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersion3_2Core
。
请注意,Mac OS 仅支持 3.x 及更高版本的核心配置文件。因此您将无法再使用已弃用的功能。
我正在学习 opengl,目前正在为 VAO 苦苦挣扎。 我想使用 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 和设置属性。然后他们 return 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 一起使用。
VAO 在 OpenGL 3.0 中作为标准功能引入。在 Mac OS 上,默认上下文版本为 2.1。因此,您需要在设置期间专门请求 3.x 上下文。
获取 3.x 上下文的确切机制将取决于您使用的 window 系统 interface/toolkit。例如,在 GLUT 中,您在 glInitDisplayMode()
的参数中包含 GLUT_3_2_CORE_PROFILE
标志。使用 Cocoa,您可以在像素格式属性中包含 NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersion3_2Core
。
请注意,Mac OS 仅支持 3.x 及更高版本的核心配置文件。因此您将无法再使用已弃用的功能。