Рассчитать индекс-размер буфера куба

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

Я знаю, что буфер вершин хранит все вершины меша. Теперь предположим, что мы хотим сделать куб. Это означает, что для его построения требуется 8 вершин. Каждая вершина состоит из 3 координат (x,y,z), таким образом, буфер вершин будет занимать 3 x 8 = 24 единицы пространства.

Я читал, что индексные буферы хранят индексы вершин. Таким образом, индексы вершин нашего куба будут от 1 до 8. Это означает, что 1 треугольник занимает 3 единицы пространства.

Меня беспокоит вопрос: сколько единиц пространства займет наш индексный буфер?

Я считаю, что куб имеет 6 граней. Каждое лицо состоит из 2 треугольников. Это означает, что существует 12 треугольников, поэтому индексный буфер будет занимать 3 x 12 = 36 единиц пространства. (Я использовал этот сайт, чтобы прийти к такому выводу: https://msdn.microsoft.com/en-us/library/windows/desktop/bb147325(v=vs.85).aspx). Тем не менее, мой лист ответов утверждает, что это 32.

Обычно я бы не стал размещать сообщения в Stackru и просто спрашивать своего учителя, однако он сейчас в отпуске и вернется только после экзамена. Таким образом, кто-нибудь может объяснить мне, как регулируется размер индексного буфера? (Предположим, это индексный буфер, используемый в OpenGL, если это имеет значение).

1 ответ

Решение
  1. Куб имеет 6 граней
  2. Каждое лицо состоит из 2 треугольников
  3. Каждый треугольник состоит из 3 вершин
  4. Таким образом, 6 * 2 * 3 = 36 вершин. Каждая вершина индексируется здесь один раз, поэтому без каких-либо хитростей ваш индексный буфер содержит 36 элементов.

Однако этот метод применяется, если вы используете GL_TRIANGLES т.е. где каждый треугольник указан независимо от следующего.


Ты можешь использовать GL_TRIANGLE_STRIP и укажите каждое лицо с 4 индексами, используя 6 вызовов отрисовки, но при этом вы получите размер 4 * 6 = 24. Это расточительное использование вызовов отрисовки, и 24!= 32. Кроме того, вам придется использовать некоторый вызов отрисовки со смещением индекса-буфера, который просто глуп для рисования куба.


Ты можешь использовать GL_TRIANGLE_STRIP и метод вырожденных треугольных полос, чтобы еще больше уменьшить количество нужных вам индексов.

  1. Оберните 4 грани куба вокруг одной оси. Каждое ребро имеет 2 вершины, но первое ребро необходимо повторить, чтобы покрыть последнюю грань. Это 2 * 5 = 10.
  2. Индексируйте непокрытую грань, на которой лежит последний индекс из шага 1, повторяя начальный индекс (вызывая вырожденный треугольник). 4
  3. Добавьте вырожденный индекс к последнему индексу и еще один в начале оставшейся грани куба. 2
  4. Индексируйте последнюю грань куба. 4
  5. Всего у нас 10 + 4 + 2 + 4 = 20 индексов.

Но это не 32. Облом.


Если вы действительно хотите упаковать этот индексный буфер, вы можете использовать 2 треугольных вентилятора (через GL_TRIANGLE_FAN) и некоторые необычные розыгрыши, чтобы получить 16 индексов. Каждый вентилятор начинается в противоположном углу и обвивает его смежные грани.

Увы, это тоже не равно 32.


Итак, откуда взялся этот eldritch 32?

  • Это может быть число битов в int, которое, вероятно, используется в качестве типа индекса в буфере индекса. Это размер чего-то... Indexy... это 32...
  • Может быть, что ответ думал с помощью GL_TRIANGLES на 4 стороны и GL_TRIANGLE_STRIP для 2-х сторон было разумно.
  • Почти наверняка может быть, что вы либо неправильно прочитали вопрос, либо прочитали ответ на другую проблему, либо ваш лист ответов неверен.

32 просто не имеет смысла.

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