【问题标题】:OpenGL ignoring bound vertex bufferOpenGL忽略绑定顶点缓冲区
【发布时间】:2019-04-01 04:36:27
【问题描述】:

我遇到了一些关于顶点数组对象和顶点缓冲区对象的问题。

代码如下:

float vertex_data[] = 
{
     0.f,   0.5f,    0.f, 0.f, 1.f,
     0.5f, -0.5f,    0.f, 1.f, 0.f,
    -0.5f, -0.5f,    1.f, 0.f, 0.f
};
float vertex_data_2[] =
{
     0.f,   0.5f,    1.f, 0.f, 0.f,
     0.5f, -0.5f,    1.f, 0.f, 0.f,
    -0.5f, -0.5f,    1.f, 0.f, 0.f
};

unsigned int indices[] =
{
    0, 1, 2
};

unsigned int vertex_array, vertex_array_2;
glGenVertexArrays(1, &vertex_array);
glGenVertexArrays(1, &vertex_array_2);


IndexBuffer index_buffer(3 * sizeof(unsigned int), 3, GL_UNSIGNED_INT, indices);


glBindVertexArray(vertex_array);
VertexBuffer vertex_buffer(3 * 5 * sizeof(float), vertex_data);
vertex_buffer.Bind();
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(float), reinterpret_cast<void*>(0));

glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(float), reinterpret_cast<void*>(2 * sizeof(float)));
index_buffer.Bind();


glBindVertexArray(vertex_array_2);
VertexBuffer vertex_buffer_2(3 * 5 * sizeof(float), vertex_data_2);
vertex_buffer_2.Bind();
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(float), reinterpret_cast<void*>(0));

glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(float), reinterpret_cast<void*>(2 * sizeof(float)));
index_buffer.Bind();


Shader shader(Shader::FromFile("rescources/shaders/basic.vs"), 
    Shader::FromFile("rescources/shaders/basic.fs"));

shader.Bind();

// main loop
while (!glfwWindowShouldClose(glfw_window))
{
    glClear(GL_COLOR_BUFFER_BIT);
    glClearColor(0.f, 0.f, 0.f, 1.f);

    // problem is here
    glBindVertexArray(vertex_array);
    vertex_buffer_2.Bind();
    glDrawElements(GL_TRIANGLES, index_buffer.GetCount(), index_buffer.GetType(), nullptr);


    glfwSwapBuffers(glfw_window);
    glfwPollEvents();
}

旁注:Bind() 只是调用 glBindBuffer()

所以基本上我绑定了第二个顶点缓冲区,但 glDrawElements() 仍然使用第一个顶点缓冲区,无论出于何种原因。就好像它完全忽略了绑定了哪个顶点缓冲区,只关心绑定了哪个顶点数组。我觉得这很奇怪,因为我的印象是顶点数组对象不绑定顶点缓冲区。更奇怪的是,即使顶点数组对象确实绑定了顶点缓冲区对象,在这种情况下也没关系,因为我在绑定 vao 之后绑定了 vbo。有什么帮助或说明吗?

【问题讨论】:

  • @Cristy 它不是一个 uint,它是一个 VertexBuffer,它是一个用于顶点缓冲区对象的小型包装类

标签: c++ opengl


【解决方案1】:

着色器中的属性与要读取的缓冲区之间的绑定是在 glVertexAttribPointer 处使用当前绑定的缓冲区完成的(即,在 yourBuffer.Bind() 之后)。

这些绑定(属性缓冲区)存储在 VAO 中。

因此,在调用glDrawXXX 之前调用glBindVertexArray 并使用正确的缓冲区。绑定VAO后绑定缓冲区没有效果。

【讨论】:

  • 好的,我想我现在明白了。所以我唯一应该绑定顶点缓冲区的时间是在设置属性时?
  • @Jono。是的。并且绑定索引(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,...) 同时绑定 VAO。
  • @Jono:“所以我唯一应该绑定顶点缓冲区的时间是我设置属性的时候?”不。你绑定它的时候'重新上传数据给它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-19
相关资源
最近更新 更多