Почему треугольные вентиляторы не поддерживаются в Direct3D 10 или более поздней версии?

16

Как указано в документации, треугольные вентиляторы не поддерживаются в Direct3D 10 или более поздней версии .

Почему? Есть ли недостатки при работе с треугольными веерами?

Мика Болен
источник
5
Насколько я понимаю, потому что поклонники треугольников часто приводят к очень худым длинным треугольникам, в результате чего взаимодействия вызывают артефакты. Также я думаю, что для рендеринга любых попыток, не связанных с фанатом, требуются отдельные вызовы отрисовки. Где это возможно с полосой. Я не думаю, что есть что-то, что фанаты могут сделать, что полосы не могут сделать лучше.
ClassicThunder
3
Вентиляторы могут быть подключены с использованием индексов, поэтому не требуется отдельных вызовов. То же самое относится и к полосам (и вы даже можете подключать вентиляторы с полосами), которые гораздо более гибкие, не требуют вырожденного триса и более легкие с точки зрения пропускной способности.
Максимус Минимус

Ответы:

15

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

Если все производители оборудования говорят: «Делай так, и ты будешь быстрее», то есть очень хороший шанс, что если ты сделаешь это таким образом, ты на самом деле будешь быстрее.

Так что D3D10 + просто формализует это; если это быстрый путь, то это тот путь, который вы собираетесь использовать, и другие пути не будут существовать. Это соответствует одной из философий дизайна D3D10 +, которая направляет вас на быстрый путь и удерживает вас там.

Максимус Минимус
источник
4

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

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

// A simplified API interface is presented for the purposes of having readable pseudocode
// Push( pos ) - pushes position data to make a new vertex
// TRIANGLE FANS:
for( i = 0; i < vertices.count; ++i )
    Push( vertices[ i ] );

// TRIANGLE STRIPS:
for( i = 0; i < vertices.count; ++i )
{
    if( i % 2 == 0 )
        vertex = i / 2;
    else
        vertex = vertices.count - 1 - i / 2;
    Push( vertices[ vertex ] );
}

РЕДАКТИРОВАТЬ: забыл упомянуть - если вам нужно изменить порядок намотки - просто поверните тест в этом «если» (== до! =).

snake5
источник
3

(Этот конкретный вопрос требует ответа мнения :)

Субъективно я бы сказал, его архитектура космонавтизм. OpenGLES также выбрасывает множество вещей, чтобы сделать его «менее сложным», в то же время фактически налагая сложность на каждого разработчика с устаревшим кодом.

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

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

Так что все выбрасывание FFP и так далее - это просто большое раздражение IMO.

Будет
источник
10 или более лет назад это было бы хорошим ответом. Сегодня конвейер вершин почти всегда реализуется аппаратно, и данные вершин с большей вероятностью будут храниться в буферных объектах в памяти графического процессора, поэтому гипотетическая реализация разветвления в драйвере потребует перетаскивания данных вершин обратно в память процессора. для переупорядочения, а затем перезагрузить его в память графического процессора. Это не только разрушает весь смысл использования буферных объектов (поскольку у вас больше нет статических данных о вершинах), но требует обратного чтения из памяти графического процессора, что приводит к остановке конвейера и низкой производительности.
Максимус Минимус
1
@ mh01, какое оборудование не поддерживает вентилятор? В конце концов, HW должен работать с полной версией OpenGL ...
Будет
Данные вершин могут храниться в памяти графического процессора, но в первую очередь они должны попасть туда из системной памяти (хотя бы один раз). Это через водителя. (Предполагается, что данные происходят со стороны ЦП, что, за исключением специализированных аппаратных демонстраций, почти всегда так).
BrainSlugs83