C++ 当使用多个VAO时,GLD元素抛出被零除的错误
我正在使用opengl构建一个游戏。当我调用GLDrainElements时,会抛出ig9icd32.dll中的除以零错误。经过一点研究,我发现这是一个英特尔库 由于ig9icd32.dll是一个Intel驱动程序,我尝试使用专用GPU运行游戏,但出现了相同的错误 使用单个VAO并编译而不绘制第二个VAO不会给出任何错误。 我检查了VAO生成和VBO绑定:它们工作得很好C++ 当使用多个VAO时,GLD元素抛出被零除的错误,c++,opengl,opengl-3,C++,Opengl,Opengl 3,我正在使用opengl构建一个游戏。当我调用GLDrainElements时,会抛出ig9icd32.dll中的除以零错误。经过一点研究,我发现这是一个英特尔库 由于ig9icd32.dll是一个Intel驱动程序,我尝试使用专用GPU运行游戏,但出现了相同的错误 使用单个VAO并编译而不绘制第二个VAO不会给出任何错误。 我检查了VAO生成和VBO绑定:它们工作得很好 { glGenVertexArrays(1, &m_HighwayVAO);
{
glGenVertexArrays(1, &m_HighwayVAO);
glGenVertexArrays(1, &m_lanesVAO);
{
glBindVertexArray(m_HighwayVAO);
unsigned int vbo, ebo;
glGenBuffers(1, &vbo);
glGenBuffers(1, &ebo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);
//Vertex: x,y,z, u,v
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)0);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)(3 * sizeof(float)));
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
glBindVertexArray(0);
}
{
glBindVertexArray(m_lanesVAO);
unsigned int buffer, index;
glGenBuffers(1, &buffer);
glGenBuffers(1, &index);
glBindBuffer(GL_ARRAY_BUFFER, buffer);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index);
//Vertex: x,y,z, r,g,b,
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), 0);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)(3 * sizeof(float)));
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
glBindVertexArray(0);
}
}
这是我初始化VAO的地方。
它们位于不同的作用域上,这样我就可以在编辑器上折叠。
如果没有作用域,则会发生相同的错误
m_HighwayVAO和m_lanesVAO是标头中定义的变量。它们被初始化为0
void Rendr::highway(double time) {
float factor = time / 3;
//Vertex: x,y,z, u,v
float data[] = {
-1.0f, 0.0f, 0.0f, 0.0f, 1.0f + factor,
1.0f, 0.0f, 0.0f, 1.0f, 1.0f + factor,
-1.0f, 0.0f, 6.0f, 0.0f, 0.0f + factor,
1.0f, 0.0f, 6.0f, 1.0f, 0.0f + factor
};
unsigned int indices[] = {
0,2,3,
3,1,0
};
glBindVertexArray(m_HighwayVAO);
glBufferData(GL_ARRAY_BUFFER, sizeof(data), data, GL_DYNAMIC_DRAW);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_DYNAMIC_DRAW);
glUseProgram(m_TextureProgram);
glDrawElements(GL_TRIANGLES, sizeof(indices) / sizeof(int), GL_UNSIGNED_INT, (void*)0);
//error thrown here
glBindVertexArray(0);
}
如果你需要更多的代码,我很乐意添加到帖子中
提前感谢您的帮助。要创建并初始化缓冲区对象的数据存储,您必须绑定适当的
数组\u buffer
buffer对象:
glBindBuffer(GL_数组_BUFFER,vbo);
glBufferData(GLU数组缓冲区、sizeof(数据)、数据、GLU动态绘图);
不将任何缓冲区对象绑定到数组\u缓冲区
缓冲区目标
注意,绑定到目标
ARRAY\u buffer
的最后一个缓冲区是buffer
:
glBindBuffer(GL_数组_BUFFER,BUFFER);
此状态保持不变,以后不再更改。因此,vbo
的缓冲区对象的数据存储永远不会被创建和初始化
这与(元素\数组\缓冲区
)的行为不同。索引缓冲区绑定存储在中。注意,VAOs状态向量中说明的每个属性可能指的是不同的
数组\u缓冲区
。调用时存储此引用。然后,当前绑定到目标ARRAY\u buffer
的缓冲区与属性关联,对象的名称(值)存储在VAO的状态向量中。要创建和初始化缓冲区对象的数据存储,必须绑定适当的ARRAY\u buffer
缓冲区对象:
glBindBuffer(GL_数组_BUFFER,vbo);
glBufferData(GLU数组缓冲区、sizeof(数据)、数据、GLU动态绘图);
不将任何缓冲区对象绑定到数组\u缓冲区
缓冲区目标
注意,绑定到目标
ARRAY\u buffer
的最后一个缓冲区是buffer
:
glBindBuffer(GL_数组_BUFFER,BUFFER);
此状态保持不变,以后不再更改。因此,vbo
的缓冲区对象的数据存储永远不会被创建和初始化
这与(元素\数组\缓冲区
)的行为不同。索引缓冲区绑定存储在中。注意,VAOs状态向量中说明的每个属性可能指的是不同的
数组\u缓冲区
。调用时存储此引用。然后,当前绑定到目标ARRAY\u buffer
的缓冲区与属性关联,对象的名称(值)存储在VAO的状态向量中。请发布您得到的准确错误消息。在调用glpaurements
之前,您是否检查了您的程序是否存在GL错误?请发布您收到的确切错误消息。在调用glpaurements
之前,您是否检查了您的程序是否存在GL错误?谢谢,我认为VAO也存储了缓冲区绑定,因为我尝试了第二个VAO,并且成功了。所以每次我想更改顶点数据时,我都要绑定GL_ARRAY_BUFFER和VAO,不是吗?是的,现在一切都修复了。我将对原始问题进行编辑。感谢AgainThanks,我认为VAO也存储了缓冲区绑定,因为我尝试了第二个VAO,它成功了。所以每次我想更改顶点数据时,我都要绑定GL_ARRAY_BUFFER和VAO,不是吗?是的,现在一切都修复了。我将对原始问题进行编辑。再次感谢