OpenGL жадная сетка с использованием VBO
Я пытаюсь уменьшить количество граней, которые отображаются в моем механизме вокселей, реализуя алгоритм жадного зацепления, аналогичный алгоритму Миколы ( http://0fps.net/2012/06/30/meshing-in-a-minecraft-game/)
Поскольку я использую VBO для рисования каждого треугольника для каждого куба, мне интересно, как я смогу объединить треугольники соседних кубов?
Для справки вот как выглядит мой массив вершин куба (обратите внимание, что он чередуется, чтобы включить в него координаты текстуры):
GLfloat cubeInterleaved[] =
{
// Front face u v
-0.5f, -0.5f, 0.5f, 0, 0,
0.5f, -0.5f, 0.5f, 1, 0,
0.5f, 0.5f, 0.5f, 1, 1,
-0.5f, 0.5f, 0.5f, 0, 1,
// Right face
0.5f, -0.5f, 0.5f, 0, 0,
0.5f, -0.5f, -0.5f, 1, 0,
0.5f, 0.5f, -0.5f, 1, 1,
0.5f, 0.5f, 0.5f, 0, 1,
// Back face
0.5f, -0.5f, -0.5f, 0, 0,
-0.5f, -0.5f, -0.5f, 1, 0,
-0.5f, 0.5f, -0.5f, 1, 1,
0.5f, 0.5f, -0.5f, 0, 1,
// Left face
-0.5f, -0.5f, -0.5f, 0, 0,
-0.5f, -0.5f, 0.5f, 1, 0,
-0.5f, 0.5f, 0.5f, 1, 1,
-0.5f, 0.5f, -0.5f, 0, 1,
// Top Face
-0.5f, 0.5f, 0.5f, 0, 0,
0.5f, 0.5f, 0.5f, 1, 0,
0.5f, 0.5f, -0.5f, 1, 1,
-0.5f, 0.5f, -0.5f, 0, 1,
// Bottom Face
0.5f, -0.5f, 0.5f, 0, 0,
-0.5f, -0.5f, 0.5f, 1, 0,
-0.5f, -0.5f, -0.5f, 1, 1,
0.5f, -0.5f, -0.5f, 0, 1
};
1 ответ
Так как я использую VBO для рисования каждого треугольника для каждого куба, я запутался в том, как я смогу объединить треугольники соседних кубов.
Используя только подмножество вершин, что делается путем правильного заполнения индексного буфера для рисования.
Возьмите этот набор из 4 треугольников, например
5
/ \
3 --- 4
/ \ / \
0 --- 1 --- 2
Вы можете нарисовать
GL_TRIANGLES: 0 1 3 1 2 4 1 4 3 3 4 5
или если все вершины копланарны, вы можете просто использовать внешние ребра
GL_TRIANGLES: 0 1 5
И то же самое вы можете сделать с вершинами блоков, формирующих ваш мир, путем соответствующего заполнения индексного буфера, передаваемого в glDrawElements