[英]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.