使用多个 VAO 时,glDrawElements 抛出被零除的错误
glDrawElements throws divide by zero error when using multiple VAO
我正在使用 opengl 构建游戏。当我调用 glDrawElements 时,抛出 ig9icd32.dll 中除以零的错误。通过一些研究,我发现它是一个英特尔库
由于ig9icd32.dll是Intel驱动,我尝试运行用专用GPU玩游戏,但出现同样的错误。
使用单个 VAO 并在不绘制第二个的情况下进行编译 不会 给出任何错误。
我检查了 VAO 生成和 VBO 绑定:它们工作得很好。
{
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是在Header.They中定义的变量,初始化为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);
}
如果您需要更多代码,我很乐意添加到 post。
在此先感谢您的帮助。
要创建和初始化缓冲区对象的数据存储,您必须绑定适当的 ARRAY_BUFFER
缓冲区对象:
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(data), data, GL_DYNAMIC_DRAW);
glBindVertexArray
不 将任何缓冲区对象绑定到 ARRAY_BUFFER
缓冲区目标。
注意,绑定到目标 ARRAY_BUFFER
的最后一个缓冲区是 buffer
:
glBindBuffer(GL_ARRAY_BUFFER, buffer);
此状态将被保留且不会再更改。因此 vbo
的缓冲区对象的数据存储从未被创建和初始化。
这与 index buffer (ELEMENT_ARRAY_BUFFER
). The index buffer binding is stored within the Vertex Array Object 的行为不同。
注意,VAOs 状态向量中声明的每个属性可能引用不同的 ARRAY_BUFFER
。在调用 glVertexAttribPointer
时存储此引用。然后当前绑定到目标的缓冲区 ARRAY_BUFFER
与属性相关联,对象的名称(值)存储在 VAO 的状态向量中。
我正在使用 opengl 构建游戏。当我调用 glDrawElements 时,抛出 ig9icd32.dll 中除以零的错误。通过一些研究,我发现它是一个英特尔库
由于ig9icd32.dll是Intel驱动,我尝试运行用专用GPU玩游戏,但出现同样的错误。
使用单个 VAO 并在不绘制第二个的情况下进行编译 不会 给出任何错误。 我检查了 VAO 生成和 VBO 绑定:它们工作得很好。
{
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是在Header.They中定义的变量,初始化为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);
}
如果您需要更多代码,我很乐意添加到 post。
在此先感谢您的帮助。
要创建和初始化缓冲区对象的数据存储,您必须绑定适当的 ARRAY_BUFFER
缓冲区对象:
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(data), data, GL_DYNAMIC_DRAW);
glBindVertexArray
不 将任何缓冲区对象绑定到 ARRAY_BUFFER
缓冲区目标。
注意,绑定到目标 ARRAY_BUFFER
的最后一个缓冲区是 buffer
:
glBindBuffer(GL_ARRAY_BUFFER, buffer);
此状态将被保留且不会再更改。因此 vbo
的缓冲区对象的数据存储从未被创建和初始化。
这与 index buffer (ELEMENT_ARRAY_BUFFER
). The index buffer binding is stored within the Vertex Array Object 的行为不同。
注意,VAOs 状态向量中声明的每个属性可能引用不同的 ARRAY_BUFFER
。在调用 glVertexAttribPointer
时存储此引用。然后当前绑定到目标的缓冲区 ARRAY_BUFFER
与属性相关联,对象的名称(值)存储在 VAO 的状态向量中。