簡體   English   中英

使用多個VAO時glDrawElements拋出除零錯誤

[英]glDrawElements throws divide by zero error when using multiple VAO

我正在使用opengl構建游戲。 當我調用glDrawElements時,會拋出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);

}

如果您需要更多代碼,我很樂意添加到帖子中。

先謝謝您的幫助。

要創建和初始化緩沖區對象的數據存儲,必須綁定適當的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的緩沖區對象的數據存儲。

這與索引緩沖區ELEMENT_ARRAY_BUFFER )的行為不同。 索引緩沖區綁定存儲在“ 頂點數組對象”中
注意,在VAO狀態向量中聲明的每個屬性都可以引用不同的ARRAY_BUFFER 調用glVertexAttribPointer時將存儲此引用。 然后,當前綁定到目標ARRAY_BUFFER的緩沖區與屬性關聯,並且對象的名稱(值)存儲在VAO的狀態向量中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM