Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Opengl索引数组更改另一个对象索引数组_C++_Opengl - Fatal编程技术网

C++ Opengl索引数组更改另一个对象索引数组

C++ Opengl索引数组更改另一个对象索引数组,c++,opengl,C++,Opengl,我有两个不同的对象,我想在一个场景中渲染它们 初始化第一个对象时,我调用以下代码: 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,-

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

初始化第一个对象时,我调用以下代码:

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数组。因为物体看起来应该不同。在第二个对象中,我不需要太多顶点,因此我更改了indar[](我将其缩短)。 问题是,第一个对象似乎受到这种变化的影响

场景看起来像

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);

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

你在哪里申报vbo?我看到您将pos和col设置为vbo[0]和vbo[1],因此这些都是您的成员变量,但我没有看到vbo的声明

实际上,我需要看到更多的代码来做出判断,因为它没有直接的“错误”

试一试推杆

glFlush();
glBindVertexArray(0);
在对象初始化代码的末尾

同时编辑并编辑f[]和c[]

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

glFlush();

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

添加此行没有效果,仍然是相同的错误。它们在类的头中声明。
glFlush();