使用OpenGL 4.3,如何正确使用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的参数是绑定索引、缓冲区对象、偏移量和步长。Stride是压缩缓冲区的(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));

相关内容

  • 没有找到相关文章

最新更新