【问题标题】:With OpenGL 4.3, how do I correctly use glVertexAttribFormat/Binding?使用 OpenGL 4.3,如何正确使用 glVertexAttribFormat/Binding?
【发布时间】:2021-03-16 10:19:26
【问题描述】:

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

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。谁能告诉我为什么或如何正确地拨打电话?

【问题讨论】:

    标签: c++ opengl opengl-4


    【解决方案1】:

    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));
    

    【讨论】:

    • 首先,感谢您的回答。其次,您能解释一下绑定索引是什么或代表什么吗?
    • @TuxStash.de 见Separate attribute format
    猜你喜欢
    • 2015-08-03
    • 1970-01-01
    • 1970-01-01
    • 2013-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-19
    相关资源
    最近更新 更多