gpt4 book ai didi

c++ - 使用多个 VAO 时,glDrawElements 抛出被零除的错误

转载 作者:太空宇宙 更新时间:2023-11-04 12:33:16 25 4
gpt4 key购买 nike

我正在使用 opengl 构建游戏。当我调用 glDrawElements 时,会抛出 ig9icd32.dll 中除以零的错误。通过一些研究,我发现它是一个 Intel 库

由于ig9icd32.dll是Intel驱动,我尝试用独立GPU运行游戏,但出现同样的错误。

使用单个 VAO 并在不绘制第二个的情况下进行编译不会不会给出任何错误。我检查了 VAO 生成和 VBO 绑定(bind):它们工作得很好。

    {
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 中定义的变量。它们被初始化为 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);

}

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

在此先感谢您的帮助。

最佳答案

要创建和初始化缓冲区对象的数据存储,您必须绑定(bind)适当的 ARRAY_BUFFER 缓冲区对象:

glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(data), data, GL_DYNAMIC_DRAW);

glBindVertexArray 将任何缓冲区对象绑定(bind)到ARRAY_BUFFER 缓冲区目标。


注意,绑定(bind)到目标 ARRAY_BUFFER 的最后一个缓冲区是 buffer:

glBindBuffer(GL_ARRAY_BUFFER, buffer);

此状态将被保留且不会再更改。因此,永远不会创建和初始化 vbo 的缓冲区对象数据存储。

这与 index buffer 的行为不同(ELEMENT_ARRAY_BUFFER)。索引缓冲区绑定(bind)存储在 Vertex Array Object 中.
请注意,VAO 状态 vector 中声明的每个属性可能引用不同的 ARRAY_BUFFER。此引用存储在 glVertexAttribPointer 时叫做。然后当前绑定(bind)到目标 ARRAY_BUFFER 的缓冲区与属性关联,对象的名称(值)存储在 VAO 的状态 vector 中。

关于c++ - 使用多个 VAO 时,glDrawElements 抛出被零除的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57754617/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com