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