В чем преимущество использования треугольника-полосы и треугольника-веера при рендеринге?

В настоящее время я разрабатываю свой собственный 3D-движок, который имеет очень ограниченные возможности с точки зрения рендеринга геометрии, и я хочу его расширить. Что меня интересует, так это то, как это должно быть сделано с точки зрения хранения геометрических объектов и их рисования.

На данный момент моя абстракция поддерживает только рендеринг геометрии в виде общих списков треугольников (D3DPT_TRIANGLELIST в терминах Direct3D). Есть несколько других способов представления объектов — например, треугольные полосы (D3DPT_TRIANGLESTRIP) или треугольные веера (D3DPT_TRIANGLEFAN).

У меня такой вопрос - действительно ли они используются при рисовании геометрии в современных 3D-движках?

Какую пользу может принести их использование, и подходят ли они как-то для конвейера создания игр? (Я имею в виду, например, могут ли художники разрабатывать свои модели, чтобы использовать эти strips/fans методы?)


person Yippie-Ki-Yay    schedule 09.09.2010    source источник


Ответы (3)


Есть несколько других способов представления объектов — например, треугольные полосы (D3DPT_TRIANGLESTRIP) или треугольные веера (D3DPT_TRIANGLEFAN).

У меня такой вопрос - действительно ли они используются при рисовании геометрии в современных 3D-движках?

TriangleStrip часто используются для рендеринга ландшафта или других типов сеток с сочетанием индексов полос перезапуска (0xFFFF или 0xFFFFFFFF) или вырожденных полос. Они предлагают лучшее соотношение с точки зрения треугольников на хранилище индексов. И если у вас есть хорошие сетки, оптимизированные для кеша вершин, они полностью будут править миром.

TriangleFan присутствуют в D3D9, но были удалены из D3D10 и D3D11. Мой совет, избегайте их использования. Причина, по которой они больше не годятся, заключается в том, что они ужасно справляются с интерполяцией атрибутов (например, texcoord или normals), потому что с ними можно делать очень тонкие и вытянутые треугольники.

Вы можете возразить, что можете сделать то же самое с полосами или списками треугольников, да, конечно, но на самом деле возможность делать веер приводит к недружественным (с точки зрения артефактов) сеткам. Удалив его из D3D, инструменты создания контента, вероятно, будут выводить тесселяцию, избегая длинных треугольников с острыми углами.

Длинные и тонкие треугольники также плохи (с точки зрения производительности), потому что они генерируют неоптимальные четырехугольные фрагменты в процессе растеризации (см. отличный Пост Humus о триангуляции).

Конечно, этот совет применим, если вы кодируете высокопроизводительный/высококачественный движок рендеринга, если вы пишете код для хобби, вы, возможно, не слишком заботитесь об этом.

person Stringer    schedule 09.09.2010

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

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

person Marcelo Cantos    schedule 09.09.2010
comment
Кроме того, теперь графические API предоставляют специальные значения индексов, которые не позволяют вам делать такие трюки, см. Мой ответ. - person Stringer; 09.09.2010

Преимущество заключается в том, что они уменьшают объем данных, которые должны быть переданы в механизм рендеринга. Для отправки N треугольников в списке потребуется указать 3*N точек; если их можно представить полосой или веером, то нужно указать только N+2 точек

person Mike Seymour    schedule 09.09.2010