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

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