在 OpenGL 4.3 中,如何正确使用 glVertexAttribFormat/Binding?

With OpenGL 4.3, how do I correctly use glVertexAttribFormat/Binding?

我正在尝试使用此功能,这是我所做的:

glGenBuffers(1, &m_vbo_id);
glGenVertexArrays(1, &m_vao_id);

glBindBuffer(GL_ARRAY_BUFFER, m_vbo_id);
glBindVertexArray(m_vao_id);

glEnableVertexAttribArray(0);  // Vertices
glEnableVertexAttribArray(1);  // Color
glEnableVertexAttribArray(2);  // Texture coordinates

glVertexAttribFormat(0, 3, GL_FLOAT, GL_FALSE, 0);
glVertexAttribBinding(0, m_vbo_id);
glVertexAttribFormat(1, 4, GL_FLOAT, GL_FALSE, 24* sizeof(float));
glVertexAttribBinding(1, m_vbo_id);
glVertexAttribFormat(2, 2, GL_FLOAT, GL_FALSE, 42* sizeof(float));
glVertexAttribBinding(2, m_vbo_id);

glBindVertexBuffer(m_vbo_id, m_buffer_data[00], 54*sizeof(float), 0);
glBindVertexBuffer(m_vbo_id, m_buffer_data[18], 54*sizeof(float), 0);
glBindVertexBuffer(m_vbo_id, m_buffer_data[42], 54*sizeof(float), 0);

m_bufferdata 是一个 std::array<float, 54>,包含所有浮点数,每帧都会重建。 这将生成一个GL_INVALID_OPERATION。谁能告诉我为什么或如何正确订购电话?

glVertexAttribBinding的第二个参数不是缓冲区对象,而是绑定索引。
glBindVertexBuffer 的参数是绑定索引、缓冲区对象、偏移量和步幅。对于紧凑的缓冲区,步幅为 (3+4+2)*sizeof(float)

int bindingindex = 0;

glVertexAttribFormat(0, 3, GL_FLOAT, GL_FALSE, 0);
glVertexAttribBinding(0, bindingindex);
glVertexAttribFormat(1, 4, GL_FLOAT, GL_FALSE, 24* sizeof(float));
glVertexAttribBinding(1, bindingindex);
glVertexAttribFormat(2, 2, GL_FLOAT, GL_FALSE, 42* sizeof(float));
glVertexAttribBinding(2, bindingindex);

glBindVertexBuffer(bindingindex, m_vbo_id, 0, 9*sizeof(float));