我的 IndexBuffer 有什么问题? 我尝试在 IndexBuffer 的帮助下渲染矩形,但应用程序崩溃了
问题是,如果我使用纯 VAO 对象和 glDrawArrays 一切正常,但是一旦我开始使用 IBO 和 glDrawElements 应用程序就会关闭。
我可以在一瞬间看到我的矩形,顶点坐标值错误,稍微向左移动
我发现,问题发生在主循环的第二次迭代上。
在这两种情况下,我都使用相同的 VBO
我的主要功能
float vertices[] = {
// positions // colors
-0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f, // bottom left
0.5f, -0.5f, 0.0f, 0.0f, 1.0f, 0.0f, // bottom right
-0.5f, 0.5f, 0.0f, 0.0f, 0.0f, 1.0f, // top left
0.5f, 0.5f, 0.0f, 0.0f, 0.0f, 1.0f, // top right
};
unsigned int indices[] = {
0, 1, 2,
2, 1, 3
};
int main (int argc, char** argv) {
initGlfw();
GLFWwindow* window = createWindow();
initGlad();
initViewPort(WINDOW_WIDTH, WINDOW_WIDTH);
VertexArray va;
VertexBuffer vb(vertices, 6 * 4 * sizeof(float));
VertexBufferLayout vbl;
vbl.Push<float>(3);
vbl.Push<float>(3);
va.AddBuffer(vb, vbl);
IndexBuffer ib(indices, 6);
ib.Bind();
Shader shader("/home/caerus/Sandbox/cpp/opengl/assets/shaders/basic.shader");
shader.Bind();
va.Unbind();
vb.Unbind();
ib.Unbind();
renderLoop(window, shader.GetRendererID(), va, vb, ib);
glfwTerminate();
return 0;
}
索引缓冲类
IndexBuffer::IndexBuffer(const unsigned int* data, unsigned int count): m_Count(count)
{
glGenBuffers(1, &m_RendererID);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_RendererID);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, count * sizeof(unsigned int), data, GL_STATIC_DRAW);
}
IndexBuffer::~IndexBuffer()
{
glDeleteBuffers(1, &m_RendererID);
};
void IndexBuffer::Bind() const
{
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_RendererID);
}
void IndexBuffer::Unbind() const
{
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
}
渲染函数
void render(unsigned int shaderProgram, IndexBuffer ib)
{
std::cout << "--| handle render" << std::endl;
GLCall(glClearColor(0.2f, 0.3f, 0.3f, 1.0f));
GLCall(glClear(GL_COLOR_BUFFER_BIT));
// glDrawArrays(GL_TRIANGLES, 0, 6);
GLCall(glDrawElements(GL_TRIANGLES, ib.GetCount(), GL_UNSIGNED_INT, nullptr));
}
void renderLoop(GLFWwindow* window, unsigned int shaderProgram, VertexArray va, VertexBuffer vb, IndexBuffer ib)
{
int needRender = 1;
while (!glfwWindowShouldClose(window))
{
processInput(window);
va.Bind();
ib.Bind();
render(shaderProgram, ib);
glfwSwapBuffers(window);
glfwPollEvents();
needRender = 0;
}
}