OpenGL — как перейти в одиночный TRIANGLE_STRIP, не затрагивая текстурирование?

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

Мой вопрос:

Боюсь, даже если вызов отрисовки полной треугольной полосы будет рисовать геометрически просто связанную сетку, я столкнусь с проблемами при попытке текстурировать сетку из-за прыжков между ними. Я еще не совсем там, поэтому я не могу проверить это. Верно ли мое предположение? Являются ли мои прыжки в треугольной полосе действительной техникой в ​​​​индустрии «рисования сеток»? Есть ли способ соответствующим образом текстурировать результат или эквивалентная альтернатива прыжкам с лучшим поведением?


person Fejwin    schedule 08.08.2012    source источник


Ответы (2)


Рассмотрим «сетку», состоящую из треугольника, разделенного на 4 подобных треугольника:

      2
       /\
      /  \
   1 /____\3
    /\    /\
   /  \  /  \
0 /____\/4___\5

Предположим, обмотка против часовой стрелки (glFrontFace), треугольники: {0,4,1}, {1,4,3}, {3,2,1} закодированы как полоса: {0,4,1,3,2}. Хитрость заключается в добавлении треугольника: {4,5,3} путем добавления вырожденных треугольников (с нулевой площадью), сохраняя при этом правильную обмотку. Короче:

{0,4,1,3,2,2,3,3,5,4}, добавляет треугольники с нулевой площадью: {3,2,2}, {2,2,3}, {3,3,5}.

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

person Brett Hale    schedule 08.08.2012
comment
Да, именно этим я там и занимаюсь. Так что, в конце концов, это действующая техника. Но как насчет текстурирования этой сетки? - person Fejwin; 08.08.2012
comment
Я предполагаю, что ваши координаты текстуры (атрибуты вершин) соответствуют одним и тем же вершинам и, следовательно, используют одни и те же индексы. Я не уверен, в чем проблема? - person Brett Hale; 08.08.2012
comment
Извините, я думаю, проблема скорее в моем малом опыте текстурирования мешей в целом. - person Fejwin; 08.08.2012

Растеризаторы рисуют площадь треугольника. «Треугольник», у которого две точки совпадают, не имеет площади. Следовательно, области треугольника для рендеринга нет.

Вырожденные треугольники (технический термин для треугольников, у которых две точки совпадают) — распространенный метод соединения нескольких полос. Обычно это делается в массиве индексов, просто добавляя больше индексов; ничего в фактической топологии сетки не нужно менять.

person Nicol Bolas    schedule 08.08.2012
comment
Означает ли это, что при попытке текстурировать эту сетку мне придется предлагать фрагменты текстуры для каждого треугольника с вручную установленными текстурными координатами для каждой вершины (пропуская те нулевые области)? Я несколько надеялся на автоматическое решение для упаковки текстур... - person Fejwin; 08.08.2012
comment
glTexGen обеспечивает генерацию координат текстуры "на лету". Хотя это устаревшая функция. Для предварительного вычисления координат см. математику для всех различных модификаций здесь: opengl.org/wiki/Mathematics_of_glTexGen - person Sam; 09.08.2012