首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Opengl VAO被覆盖

Opengl VAO被覆盖
EN

Stack Overflow用户
提问于 2015-07-13 08:25:34
回答 1查看 243关注 0票数 0

我正在学习opengl,目前我正在与VAOs进行斗争。我想用VAOs绘制一个立方体和一个三角形,但不幸的是,只绘制了稍后创建的对象。这就是我在主循环中所做的工作:

代码语言:javascript
复制
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的身份证。例如,这是generateTriangle()

代码语言:javascript
复制
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,如果这有帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-14 13:37:18

在OpenGL 3.0中引入了VAOs作为标准功能。在Mac上,默认上下文版本为2.1。因此,您需要在安装过程中专门请求一个3.x上下文。

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

请注意,Mac只支持3.x和更高版本的核心配置文件。因此,您将不能再使用不推荐的功能了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31378604

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档