Как указано в документации, треугольные вентиляторы не поддерживаются в Direct3D 10 или более поздней версии .
Почему? Есть ли недостатки при работе с треугольными веерами?
Как указано в документации, треугольные вентиляторы не поддерживаются в Direct3D 10 или более поздней версии .
Почему? Есть ли недостатки при работе с треугольными веерами?
Ответы:
Уже более десяти лет производители аппаратного обеспечения выдвигают полосы треугольников, списки индексированных треугольников и полосы индексированных треугольников как самые быстрые примитивные типы для использования. Почему? Полосы имеют лучшую локальность кэша (повторное использование двух последних представленных вершин вместо того, чтобы постоянно возвращаться к первому), а индексирование позволяет аппаратным кешам вершин фактически работать, а также является более эффективным для устранения дублирующих вершин.
Если все производители оборудования говорят: «Делай так, и ты будешь быстрее», то есть очень хороший шанс, что если ты сделаешь это таким образом, ты на самом деле будешь быстрее.
Так что D3D10 + просто формализует это; если это быстрый путь, то это тот путь, который вы собираетесь использовать, и другие пути не будут существовать. Это соответствует одной из философий дизайна D3D10 +, которая направляет вас на быстрый путь и удерживает вас там.
Я не знаю, насколько это на самом деле влияет на разработку, но, как и в случае любых таких изменений, было сказано, что они позволят разработчикам драйверов писать лучшие драйверы. Сложность драйверов 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 ] );
}
РЕДАКТИРОВАТЬ: забыл упомянуть - если вам нужно изменить порядок намотки - просто поверните тест в этом «если» (== до! =).
(Этот конкретный вопрос требует ответа мнения :)
Субъективно я бы сказал, его архитектура космонавтизм. OpenGLES также выбрасывает множество вещей, чтобы сделать его «менее сложным», в то же время фактически налагая сложность на каждого разработчика с устаревшим кодом.
Конечно, даже если аппаратное обеспечение не поддерживает его изначально, было бы тривиально обеспечить совместимость с людьми, чередующими вентиляторы треугольников путем преобразования их в полосы или треугольники.
Время выполнения WebGL и тому подобное должны постоянно отслеживать проверенные буферы и тому подобное, и драйверы могут легко управлять людьми, отправляющими их фанатам, несмотря на то, что они не поддерживают это.
Так что все выбрасывание FFP и так далее - это просто большое раздражение IMO.