VAO с несколькими VBO и IBO с OpenGL

Я создаю программу OpenGL, в которой я рисую сетку плиток на экране. Чтобы добиться этого, я создаю VBO и IBO, которые содержат вершины для сетки квадов, чтобы нарисовать на экране. Я текстурирую эти четырехугольники с помощью листа листов, поэтому я также создал еще один VBO и IBO, содержащий текстурные координаты для отображения текстуры каждого четырехугольника.

Прямо сейчас у меня есть простое тестовое приложение, где я рисую сетку 1x2 на экране. Для начала я придерживаюсь простого подхода и использую изображение листа плитки с одной плиткой, поэтому я пытаюсь нарисовать два четырехугольника с одинаковой текстурой.

Я создал класс Grid для визуализации сетки. Вот код:

/**
 * Initialize the VAO, VBO's, and IBO's for the grid.
 * zLayer value allows us to define the layering order
 * when multiple grids are layered on top of each other.
 */
void Grid::init(const float zLayer) {
    //generate the VAO
    glGenVertexArrays(1, &vertexArrayId);
    glBindVertexArray(vertexArrayId);

    // VERTEX BUFFER SETUP

    //generate vertex buffer to hand off to OGL
    glGenBuffers(1, &vertexBufferId);
    //set the current state to focus on our vertex buffer
    glBindBuffer(GL_ARRAY_BUFFER, vertexBufferId);

    // Vertices for the background
    const GLfloat vertices[]{
        0, 0, zLayer,
        1, 0, zLayer,
        2, 0, zLayer,
        0, 1, zLayer,
        1, 1, zLayer,
        2, 1, zLayer
    };

    //actually memcopy the data - only do this once
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
    //we need to set up the vertex array
    glEnableVertexAttribArray(0);
    //key function to get up how many elements to pull out at a time (3)
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, nullptr);

    // TEXTURE BUFFER SETUP

    glGenBuffers(1, &textureBufferId);
    glBindBuffer(GL_ARRAY_BUFFER, textureBufferId);

    const GLfloat texture[] = {
        0, 1,
        1, 1,
        0, 0,
        1, 0
    };

    glBufferData(GL_ARRAY_BUFFER, sizeof(texture), texture, GL_STATIC_DRAW);
    glEnableVertexAttribArray(1);
    glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, nullptr);

    // VERTEX INDEX BUFFER SETUP

    glGenBuffers(1, &vertIndexBufferId);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vertIndexBufferId);

    const GLuint vertIndices[]{
        0, 1, 3,
        1, 4, 3,
        1, 2, 4,
        2, 5, 4
    };

    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(vertIndices), vertIndices, GL_STATIC_DRAW);
    glEnableVertexAttribArray(2);
    glVertexAttribPointer(2, 3, GL_UNSIGNED_INT, GL_FALSE, 0, nullptr);

    // TEXTURE INDEX BUFFER SETUP

    glGenBuffers(1, &texIndexBufferId);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, texIndexBufferId);

    const GLuint texIndices[]{
        0, 1, 2,
        0, 2, 3,
        0, 1, 2,
        0, 2, 3
    };

    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(texIndices), texIndices, GL_STATIC_DRAW);
    glEnableVertexAttribArray(4);
    glVertexAttribPointer(4, 3, GL_UNSIGNED_INT, GL_FALSE, 0, nullptr);

    glBindVertexArray(0);
}

/**
 * Draws the entire grid to the screen
 */
void Grid::draw() const {
    glBindVertexArray(vertexArrayId);
    glDrawElements(GL_TRIANGLES, 12, GL_UNSIGNED_INT, nullptr);
    glBindVertexArray(0);
 }

Тем не менее, это не дает желаемого эффекта. Все примеры, которые я нашел, используют только одно IBO, поэтому я не уверен, как настроить VAO с несколькими IBO; один для вершины VBO и один для координаты текстуры VBO. Что не так с моим подходом, и что я могу сделать, чтобы он работал так, как мне нравится? Можно ли даже использовать несколько IBO? Если нет, то какая лучшая альтернатива для моей ситуации?

0 ответов

Другие вопросы по тегам