Треугольная полоса

редактировать
Диаграмма из четырех треугольников 1, 2, 3 и 4 с вершинами A, B, C, D, E и F.

A полоса треугольников представляет собой серию соединенных треугольников из треугольной сетки, разделяющих вершины, что позволяет более эффективно использовать память для компьютерной графики. Они более эффективны, чем треугольные списки без индексации, но обычно одинаково быстры или медленнее, чем индексированные треугольные списки. Основная причина использования треугольных полос - уменьшить объем данных, необходимых для создания серии треугольников. Количество вершин, хранящихся в памяти, сокращается с 3N до N + 2, где N - количество треугольников, которые нужно нарисовать. Это позволяет уменьшить использование дискового пространства, а также ускорить их загрузку в RAM.

. Например, четыре треугольника на диаграмме без использования полос треугольников должны быть сохранены и интерпретированы как четыре отдельных треугольники: ABC, CBD, CDE и EDF. Однако, используя полосу треугольников, их можно сохранить просто как последовательность вершин ABCDEF. Эта последовательность будет декодирована как набор треугольников с вершинами в ABC, BCD, CDE и DEF - хотя точный порядок, в котором считываются вершины, не будет в порядке слева направо, так как это приведет к тому, что соседние треугольники будут обращены в чередующихся направлениях..

Содержание
  • 1 Реализация OpenGL
  • 2 Свойства и конструкция
  • 3 Ссылки
  • 4 См. Также
Реализация OpenGL
Модель двух треугольников, нарисованных в OpenGL с использованием полос треугольников.

OpenGL имеет встроенную поддержку треугольных полос. Фиксированная функция OpenGL (не рекомендуется в OpenGL 3.0) поддерживает треугольные полосы с использованием немедленного режима и функций glBegin (), glVertex * () и glEnd (). Более новые версии поддерживают треугольные полосы с использованием glDrawElements и glDrawArrays.

Чтобы нарисовать полосу треугольников с использованием непосредственного режима OpenGL, glBegin () должен быть передан аргумент GL_TRIANGLE_STRIP, который уведомляет OpenGL о том, что треугольная полоса вот-вот будет нарисована. Семейство функций glVertex * () задает координаты каждой вершины полосы треугольников. Для получения дополнительной информации обратитесь к The OpenGL Redbook.

Чтобы нарисовать полосу треугольников на диаграмме с использованием немедленного режима OpenGL, код выглядит следующим образом:

// Вершины ниже имеют ориентацию по часовой стрелке // Настройка по умолчанию для glFrontFace - против часовой стрелки glFrontFace (GL_CW); glBegin (GL_TRIANGLE_STRIP); glVertex3f (0,0f, 1,0f, 0,0f); // вершина 1 glVertex3f (0.0f, 0.0f, 0.0f); // вершина 2 glVertex3f (1.0f, 1.0f, 0.0f); // вершина 3 glVertex3f (1.5f, 0.0f, 0.0f); // вершина 4 glEnd ();

Обратите внимание, что для рисования второго треугольника нужна только одна дополнительная вершина. В OpenGL порядок, в котором указываются вершины, важен, так что нормали поверхности согласованы.

Цитата непосредственно из Руководства по программированию OpenGL :

GL_TRIANGLE_STRIP

Полоса треугольников в OpenGL.svg

Рисует серию треугольников (трехсторонних многоугольников) с использованием вершин v0, v1, v2, затем v2, v1, v3 (примечание порядок), затем v2, v3, v4 и так далее. Порядок должен быть таким, чтобы все треугольники были нарисованы с одинаковой ориентацией, чтобы полоса могла правильно образовывать часть поверхности.

Это еще яснее на страницах справочника:

Рисует связанную группу треугольников. Для каждой вершины, представленной после первых двух вершин, определен один треугольник. Для нечетного n вершины n, n + 1 и n + 2 определяют треугольник n. Для четного n вершины n + 1, n и n + 2 определяют треугольник n. Нарисованы N-2 треугольника.

В приведенном выше примере кода и на диаграмме показаны треугольники, нарисованные по часовой стрелке. Для того, чтобы они считались обращенными вперед, необходим предшествующий вызов glFrontFace (GL_CW), который в противном случае имеет начальное значение GL_CCW (что означает, что треугольники, нарисованные против часовой стрелки, по умолчанию обращены вперед). Это важно, если glEnable (GL_CULL_FACE) и glCullFace (GL_BACK) уже активны (по умолчанию GL_BACK), потому что обращенные назад треугольники будут отбракованы, поэтому не будут нарисованы и вообще не будут отображаться на экране.

Свойства и конструкция

Из определения следует, что подпоследовательность вершин полосы треугольников также представляет собой полосу треугольников. Однако, если эта подстрока начинается с четной (с отсчетом от 1) вершины, то результирующие треугольники изменят свою ориентацию. Например, подстрока BCDEF будет представлять треугольники: BCD, CED, DEF.

Аналогичным образом, перестановка вершин полосы приведет к тому же набору треугольников, если на полосе четное число вершин. (например, полоса FEDCBA будет представлять те же треугольники FED, ECD, DCB, CAB, что и исходная полоса). Однако, если полоса имеет нечетное количество вершин, перевернутая полоса будет представлять треугольники с противоположной ориентацией. Например, переворот полосы ABCDE приведет к полосе EDCBA, которая представляет собой треугольники EDC, DBC, CBA).

Преобразование общей многоугольной сетки в одну длинную полосу до недавнего времени было вообще невозможно. Обычно полосы треугольника аналогичны набору из концевых петель, а полюса на модели представлены веерами треугольника. Такие инструменты, как или представляют модель в виде нескольких полос. Доказана оптимальная группировка набора треугольников в последовательные полосы NP-complete.

В качестве альтернативы, полный объект можно описать как вырожденную полосу, которая содержит треугольники с нулевой площадью, которые программа обработки или оборудование выбросит. вырожденные треугольники эффективно создают неоднородности или «скачки» на полосе. Например, сетка на диаграмме также может быть представлена ​​как ABCDDFFEDC, что можно интерпретировать как треугольники ABC CBD CDD DDF DFF FFE FED DEC (вырожденные треугольники отмечены курсивом). Обратите внимание, как эта полоса сначала строит два треугольника слева, затем перезапускается и строит оставшиеся два справа.

Хотя разрывы в полосах треугольников всегда можно реализовать путем повторной отправки вершин, API-интерфейсы иногда явно поддерживают эту функцию. IRIS GL поддерживал свопы (переворачивание двух последующих вершин в полосе), функцию, на которую опирались ранние алгоритмы, такие как алгоритм SGI. В последнее время OpenGL / DirectX может отображать несколько полос треугольников без вырожденных треугольников с помощью функции Primitive Restart.

Трассировка кривой с использованием полосы треугольников
Ссылки
См. Также
Последняя правка сделана 2021-06-11 11:09:13
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте