C++ 当使用多个VAO时,GLD元素抛出被零除的错误

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

我正在使用opengl构建一个游戏。当我调用GLDrainElements时,会抛出ig9icd32.dll中的除以零错误。经过一点研究,我发现这是一个英特尔库

由于ig9icd32.dll是一个Intel驱动程序,我尝试使用专用GPU运行游戏,但出现了相同的错误

使用单个VAO并编译而不绘制第二个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是标头中定义的变量。它们被初始化为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,不是吗?是的,现在一切都修复了。我将对原始问题进行编辑。再次感谢