Рассчитать индекс-размер буфера куба
В течение нескольких недель я проходил курс компьютерной графики и готовился к экзамену, однако я застрял на теме индексных буферов.
Я знаю, что буфер вершин хранит все вершины меша. Теперь предположим, что мы хотим сделать куб. Это означает, что для его построения требуется 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 ответ
- Куб имеет 6 граней
- Каждое лицо состоит из 2 треугольников
- Каждый треугольник состоит из 3 вершин
- Таким образом, 6 * 2 * 3 = 36 вершин. Каждая вершина индексируется здесь один раз, поэтому без каких-либо хитростей ваш индексный буфер содержит 36 элементов.
Однако этот метод применяется, если вы используете GL_TRIANGLES
т.е. где каждый треугольник указан независимо от следующего.
Ты можешь использовать GL_TRIANGLE_STRIP
и укажите каждое лицо с 4 индексами, используя 6 вызовов отрисовки, но при этом вы получите размер 4 * 6 = 24. Это расточительное использование вызовов отрисовки, и 24!= 32. Кроме того, вам придется использовать некоторый вызов отрисовки со смещением индекса-буфера, который просто глуп для рисования куба.
Ты можешь использовать GL_TRIANGLE_STRIP
и метод вырожденных треугольных полос, чтобы еще больше уменьшить количество нужных вам индексов.
- Оберните 4 грани куба вокруг одной оси. Каждое ребро имеет 2 вершины, но первое ребро необходимо повторить, чтобы покрыть последнюю грань. Это 2 * 5 = 10.
- Индексируйте непокрытую грань, на которой лежит последний индекс из шага 1, повторяя начальный индекс (вызывая вырожденный треугольник). 4
- Добавьте вырожденный индекс к последнему индексу и еще один в начале оставшейся грани куба. 2
- Индексируйте последнюю грань куба. 4
- Всего у нас 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 просто не имеет смысла.