【问题标题】:Opengl VAO gets overwrittenOpengl VAO 被覆盖
【发布时间】:2015-07-13 08:25:34
【问题描述】:

我正在学习 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 并设置属性。然后他们返回 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。

【问题讨论】:

  • 检查 generate* 的返回值,看看它是否是一个有效的 VAO
  • 另外检查glGetAttribLocation返回的值是否不是-1
  • @legends2k @ratchet 三角形的 VAO:0,立方体的 VAO:0,glGetAttribLocation 返回值为正。如果我颠倒drawTriangle()drawCube()的顺序:立方体的VAO:0,三角形的VAO:1375791943(可以是-1吗?)。
  • 这是你的问题,两者的 VAO 不应该相同。任何渲染调用(或其顺序)都不应更改 VAO 值。
  • 您使用什么版本/配置文件来创建上下文?您需要 3.x 上下文来支持 VAO。

标签: c++ opengl vao


【解决方案1】:

VAO 在 OpenGL 3.0 中作为标准功能引入。在 Mac OS 上,默认上下文版本是 2.1。因此,您需要在设置期间专门请求 3.x 上下文。

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

请注意,Mac OS 仅支持 3.x 及更高版本的核心配置文件。因此,您将无法再使用已弃用的功能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-22
    • 2012-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多