Лекция
Привет, Вы узнаете о том , что такое треугольная полоска, Разберем основные их виды и особенности использования. Еще будет много подробных примеров и описаний. Для того чтобы лучше понимать что такое треугольная полоска, triangle strip , настоятельно рекомендую прочитать все из категории Компьютерная графика.
В компьютерной графике полоса треугольников — это подмножество треугольников в сетке треугольников с общими вершинами , и это более эффективный с точки зрения памяти метод хранения информации о сетке. Они более эффективны, чем неиндексированные списки треугольников, но обычно столь же быстры или медленнее, чем индексированные списки треугольников. Основная причина использования полос треугольников — сокращение объема данных, необходимых для создания серии треугольников. Количество вершин, хранящихся в памяти, уменьшается с 3 N до N + 2 , где N — количество треугольников, которые нужно нарисовать. Это позволяет меньше использовать дисковое пространство , а также ускоряет их загрузку в оперативную память .
Схема четырех треугольников 1, 2, 3 и 4 с вершинами A, B, C, D, E и F.
Например, четыре треугольника на схеме без использования полос треугольников должны были бы храниться и интерпретироваться как четыре отдельных треугольника: ABC, CBD, CDE и EDF. Однако, используя полосу треугольников, их можно хранить просто как последовательность вершин ABCDEF. Эта последовательность будет декодирована как набор треугольников с вершинами в ABC, BCD, CDE и DEF - хотя точный порядок, в котором считываются вершины, не будет слева направо, поскольку это приведет к тому, что смежные треугольники будут смотреть в чередующихся направлениях.
Модель двух треугольников, нарисованная в OpenGL с использованием полос треугольников.
OpenGL имеет встроенную поддержку для полос треугольников. Исправлена функция OpenGL (устарело в OpenGL 3.0) имеет поддержку полос треугольников с использованием немедленного режима и функций . glBegin() glVertex*() glEnd() . Более новые версии поддерживают полосы треугольников с использованием и glDrawElements glDrawArrays
Чтобы нарисовать полосу треугольников с использованием непосредственного режима OpenGL, необходимо передать аргумент , который уведомляет OpenGL о том, что полоса треугольников будет нарисована. Семейство функций определяет координаты каждой вершины в полосе треугольников. Об этом говорит сайт https://intellect.icu . Для получения дополнительной информации обратитесь к The OpenGL Redbook.
Чтобы нарисовать полосу треугольников на диаграмме с использованием непосредственного режима OpenGL, код выглядит следующим образом:
//Вершины ниже имеют ориентацию по часовой стрелке //Настройка по умолчанию для glFrontFace — против часовой стрелки glFrontFace(GL_CW); glBegin(GL_TRIANGLE_STRIP); glVertex3f( 0.0f , 0.0f , 0.0f ); //вершина 1 glVertex3f ( 0.0f , 0.5f , 0.0f ); //вершина 2 glVertex3f ( 0.5f , 0.0f , 0.0f ); //вершина 3 glVertex3f ( 1.0f , 0.5f , 0.0f ); //вершина 4 glEnd ();
Обратите внимание, что для рисования второго треугольника нужна только одна дополнительная вершина. В OpenGL порядок указания вершин важен, чтобы нормали поверхности были согласованными.
Цитата из Руководства по программированию OpenGL :
GL_TRIANGLE_STRIP
Рисует ряд треугольников (трехсторонних многоугольников) с вершинами 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 треугольника.
Обратите внимание, что n начинается с 1. Приведенный выше пример кода и диаграмма демонстрируют треугольники, нарисованные по часовой стрелке. Для того, чтобы они считались обращенными вперед, необходим предшествующий вызов 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).
Преобразование общей полигональной сетки в одну длинную полосу до недавнего времени было вообще невозможным. Обычно треугольные полосы аналогичны набору граничных петель , а полюса на модели представлены веерами треугольников . Такие инструменты, как Stripe или FTSG , представляют модель в виде нескольких полос. Оптимальная группировка набора треугольников в последовательные полосы была доказана как NP-полная .
В качестве альтернативы полный объект можно описать как вырожденную полосу , которая содержит треугольники нулевой площади, которые программное обеспечение или оборудование обработки отбросит. Вырожденные треугольники эффективно вносят разрывы или «прыжки» в полосу. Например, сетка на диаграмме также может быть представлена как ABCDDFFEDC, что будет интерпретироваться как треугольники ABC CBD CDD DDF DFF FFE FED DEC (вырожденные треугольники отмечены курсивом). Обратите внимание, как эта полоса сначала строит два треугольника слева, затем перезапускается и строит оставшиеся два справа.
Хотя разрывы в полосах треугольников всегда можно реализовать путем повторной отправки вершин, API иногда явно поддерживают эту функцию. IRIS GL поддерживал Swaps (переворачивание двух последовательных вершин в полосе), функцию, на которую опирались ранние алгоритмы, такие как алгоритм SGI . Недавно OpenGL/DirectX смог отрисовывать несколько полос треугольников без вырожденных треугольников с помощью функции Primitive Restart.
Исследование, описанное в статье про треугольная полоска, подчеркивает ее значимость в современном мире. Надеюсь, что теперь ты понял что такое треугольная полоска, triangle strip и для чего все это нужно, а если не понял, или есть замечания, то не стесняйся, пиши или спрашивай в комментариях, с удовольствием отвечу. Для того чтобы глубже понять настоятельно рекомендую изучить всю информацию из категории Компьютерная графика
Из статьи мы узнали кратко, но содержательно про треугольная полоска
Комментарии
Оставить комментарий
Компьютерная графика
Термины: Компьютерная графика