Как настроить VAO и VBO для заказной структуры - PullRequest
1 голос
/ 28 января 2020

Я пытаюсь построить бар.

Сначала я объявляю структуру

struct VertexFormat
    {
        glm::vec3 positions;
        glm::vec3 normal;
        glm::vec2 texCoord;
        VertexFormat(glm::vec3 pos, glm::vec3 norm, glm::vec2 coord) : positions(pos), normal(norm), texCoord(coord)
        {   }
    };

, а затем настраиваю VAO и VBO

    glBindVertexArray(m_VAO);
    glBindBuffer(GL_ARRAY_BUFFER, m_VBO);
    glBufferData(GL_ARRAY_BUFFER, data.size() * sizeof(VertexFormat), &data[0], GL_STATIC_DRAW);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices.size(), &indices[0], GL_STATIC_DRAW);
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, data.size() * sizeof(VertexFormat), (void*)0);
    glEnableVertexAttribArray(1);
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, data.size() * sizeof(VertexFormat), (void*)(3 * sizeof(float)));
    glEnableVertexAttribArray(2);
    glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, data.size() * sizeof(VertexFormat), (void*)(6 * sizeof(float)));
    glBindVertexArray(0);

Ничего вырисовывается при вводе команд рисования

 glBindVertexArray(m_VAO);
glDrawElements(GL_TRIANGLES, 24, GL_UNSIGNED_INT, 0);
glBindVertexArray(0);

У меня вопрос, правильно ли я определяю смещения для данных в буфере?

1 Ответ

4 голосов
/ 28 января 2020

Есть несколько проблем с этим кодом:

Во-первых, объем данных, загруженных в EBO, неверен. Размер данных должен быть указан в байтах . Предполагая, что indices содержит целые числа без знака, код должен быть:

glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices.size() * sizeof(unsigned int), &indices[0], GL_STATIC_DRAW);

Тогда stride описывает смещение между двумя последовательными вершинами в буфере, а не общий размер ваших данных. В вашем случае каждая вершина начинается sizeof(VertexFormat) после предыдущей.

Правильный код должен быть:

glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(VertexFormat), (void*)0);
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(VertexFormat), (void*)(3 * sizeof(float)));
glEnableVertexAttribArray(2);
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(VertexFormat), (void*)(6 * sizeof(float)));
...