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? Если нет, то какая лучшая альтернатива для моей ситуации?