0

我有 2 个不同的对象,我想在一个场景中渲染它们。

当我初始化第一个对象时,我称之为代码:

float f[] = {
              -0.1f, 0.1f, 0.1f,  
               0.1f, 0.1f, 0.1f,
               0.1f,-0.1f, 0.1f,
              -0.1f,-0.1f, 0.1f,
              -0.1f, 0.1f,-0.1f,
               0.1f, 0.1f,-0.1f,
               0.1f,-0.1f,-0.1f,
              -0.1f,-0.1f,-0.1f

              }; 

  float c[] = {
              1.0f, 0.0f, 0.0f,  
              0.0f, 1.0f, 0.0f,
              0.0f, 0.0f, 1.0f,
              1.0f, 0.0f, 0.0f,  
              0.0f, 1.0f, 0.0f,
              0.0f, 0.0f, 1.0f,
              1.0f, 0.0f, 0.0f,  
              1.0f, 0.0f, 0.0f,  
  };

  unsigned int indarr[] = {2,3,6,7,4,3,0,2,1,6,5,4,1,0};

  glGenBuffers(2, vbo); 
  pos = vbo[0]; // Der Buffer für die Position
  col = vbo[1]; // Der BUffer für die Farbe

  glBindBuffer(GL_ARRAY_BUFFER, pos);
  glBufferData(GL_ARRAY_BUFFER, sizeof(f),f,GL_STATIC_DRAW); // Befüllen

  glBindBuffer(GL_ARRAY_BUFFER, col);
  glBufferData(GL_ARRAY_BUFFER, sizeof(c),c,GL_STATIC_DRAW); // Befüllen


  glGenVertexArrays(1, &vao);
  glBindVertexArray(vao);

  glEnableVertexAttribArray(0);
  glEnableVertexAttribArray(1);

  glBindBuffer(GL_ARRAY_BUFFER, pos);
  glVertexAttribPointer(0, 3, GL_FLOAT,GL_FALSE, 3*sizeof(float),0);
  glBindBuffer(GL_ARRAY_BUFFER, col);
  glVertexAttribPointer(1, 3, GL_FLOAT,GL_FALSE, 3*sizeof(float),0);

  glGenBuffers(1, &ind);
  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ind);
  glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indarr),indarr,GL_STATIC_DRAW);

这是渲染函数内部的代码:

  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ind);
  glBindVertexArray( vao );
  glDrawElements(GL_TRIANGLE_STRIP, 14, GL_UNSIGNED_INT, 0);
  glBindBuffer(GL_ARRAY_BUFFER, 0);
  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

当我在场景中渲染这个对象时,一切正常。当我尝试创建另一个对象时,问题就开始了。代码看起来像上面的示例,唯一的区别是,我更改了 f、c 和 intarr 数组。因为对象应该看起来不同。在第二个对象中我不需要这么多顶点,所以我改变了 indarr[](我把它缩短了)。问题是,第一个对象似乎受到了这种变化的影响。

场景看起来像

obj1->render();
obj2->render();

有人可以帮我看看会发生什么吗?尤其是为什么它们会相互影响?

编辑:

嗯,我终于修复了错误,

旧的渲染函数如下所示:

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ind);
glBindVertexArray( vao );
glDrawElements(GL_TRIANGLE_STRIP, 14, GL_UNSIGNED_INT, 0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

我把它改成这样:

glBindVertexArray( vao );
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ind);
glDrawElements(GL_TRIANGLE_STRIP, 14, GL_UNSIGNED_INT, 0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

现在它可以工作了。我仍然不明白为什么会发生错误。也许有人现在可以解释一下吗?

4

1 回答 1

-1

你在哪里声明vbo?我看到您将 pos 和 col 设置为 vbo[0] 和 vbo[1] 所以链接这些是您的成员变量,但我没有看到 vbo 的声明。

实际上,我需要查看更多代码才能在这里做出决定,因为它没有任何直接“错误”。

试着把

glFlush();
glBindVertexArray(0);

在对象初始化代码的末尾。

自从

unsigned int indarr[]

编辑和 f[] 和 c[] 以及

是本地的,当系统超出范围时,系统会释放其内存。然而,那时 OpenGL 可能还没有完全缓冲数据。您的下一个对象可能会在 openGL 读取之前覆盖该内存。

glFlush();

将使代码等到opengl完成。值得一试。

于 2013-03-28T23:54:17.970 回答