glDrawArray第二次未绘制

glDrawArray not drawing the second time

本文关键字:绘制 第二次 glDrawArray      更新时间:2023-10-16

嗨,所以我基本上一直在努力理解OpenGL混淆的

我试着在书籍、教程中找到答案,甚至尝试使用

所以基本上,我有一个opengl程序,可以第一次绘制我的两个三角形,但是当我再次尝试重新绘制第一个三角形时,它似乎不起作用

我不知道我遗漏了什么信息,但没有任何意义

据我所知,一旦VAO和VBO被创建、绑定并缓冲到内存,顶点属性指针被设置并启用,一旦我绑定了我想画的VAO对象,我只需要做

在初始化后,问题是,一旦我重新绑定另一个vao对象,它似乎不会绘制

我的代码很长,如果你愿意,我可以把它粘贴在这里,但我认为代码的绘图部分就足够了

这是

          GLfloat vec[] = {0.0f, 0.0f,
                            1.0f, -1.0f,
                           -1.0f, -1.0f};
          GLfloat vec2[] = {0.0f, 1.0f,
                            1.0f, 0.0f,
                           -1.0f, 0.0f};
   //next step is to upload data to graphics memory
   //generating a buffer from openGL 
   GLuint vbo;
   GLuint vbo2 ; 
   GLuint vao;
   GLuint vao2;
   glGenBuffers(1, &vbo);
   glGenBuffers(1, &vbo2);
   glGenVertexArrays(1, &vao);
   glGenVertexArrays(1, &vao2);
   //to upload the actual data must make the object active by binding it to a target
   glBindBuffer(GL_ARRAY_BUFFER, vbo);
   //upload the data of active object to memory
   glBufferData(GL_ARRAY_BUFFER, sizeof(vec), vec, GL_STATIC_DRAW);
   glBindBuffer(GL_ARRAY_BUFFER, vbo2);
   glBufferData(GL_ARRAY_BUFFER, sizeof(vec2), vec2, GL_STATIC_DRAW);

   //bind and draw
   glBindBuffer(GL_ARRAY_BUFFER, vbo);
   glBindVertexArray(vao);
   glEnableVertexAttribArray(0);
   glVertexAttribPointer(0,2,GL_FLOAT, GL_FALSE, 0, NULL);

   glDrawArrays (GL_TRIANGLES, 0, 3);
   glXSwapBuffers ( dpy, glxWin );
   sleep(3);
   glClear(GL_COLOR_BUFFER_BIT);
   //rendering second triangle 
   glBindBuffer(GL_ARRAY_BUFFER, vbo2);
   glBindVertexArray(vao2);
   glEnableVertexAttribArray(0);
   glVertexAttribPointer(0,2,GL_FLOAT, GL_FALSE, 0, NULL);
   glDrawArrays (GL_TRIANGLES, 0, 3);
   glXSwapBuffers ( dpy, glxWin );
   sleep(3);
   //rendering the first triangle again------where the problem lies!!!
   glClear(GL_COLOR_BUFFER_BIT);
   glBindVertexArray(vao);
   glEnableVertexAttribArray(0);
   glVertexAttribPointer(0,2,GL_FLOAT, GL_FALSE, 0, NULL);

   glDrawArrays (GL_TRIANGLES, 0, 3);
   glXSwapBuffers ( dpy, glxWin );
   sleep(3);

您还需要清除深度缓冲区glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

如果你遵循教程,那么你可能已经在它提供的openGL设置样板中启用了深度测试。这是因为更多的人想要使用深度缓冲区。

在设置过程中也不能调用glEnable(GL_DEPTH_TEST);