使用 glDrawElements 时什么会导致 OpenGL 崩溃?

问题描述 投票:0回答:0

我的 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;
  }
}
c++ opengl crash glfw
© www.soinside.com 2019 - 2024. All rights reserved.