Как тесселяция повышает производительность?
кажется интуитивно понятным, что вычисление большего количества вершин вместо того, чтобы просто читать больше из vram было бы быстрее. Но если пропускная способность памяти-это проблема, которая делает тесселяцию стоящей, то почему существуют такие вещи, как отображение смещения? В шейдере тесселяции, если Вы читаете текстуру, вы все равно получаете доступ к vram больше. Являются ли текстуры выглядят дешевле, чем более оригинальные вершины? Почему тесселяция быстрая?
скажем, у вас было усиление вершины 32 С a очень низкая полигональная модель. Будет ли это быстрее, чем сказать более высокую полигональную модель с только усилением вершин тесселяции 8 или что-то в этом роде. Или, другими словами, вы линейно получаете производительность с тем больше вы tessellate?
4 ответов
нет ни одной точки, которая дает тесселяцию лучшую производительность во всех возможных случаях. Различные преимущества и компромиссы применяются в каждом случае использования. Некоторые вещи, которые могут способствовать созданию тесселяции быстрее, чем альтернативы:
- Пропускная Способность Памяти: современные компьютеры в значительной степени ограничены скоростью памяти. Даже если вы используете текстуры, одно чтение может быть всего 4 байта вместо 32 + байтов, обычно необходимых для хранения вершины данные.
- уровень детализации (LOD): С помощью шейдеров тесселяции вы можете избежать слишком подробных областей, при этом гарантируя, что остальная часть сцены имеет достаточную детализацию.
- Меньше Verticies: означает меньшее количество выполнений вершинного шейдера и каждого этапа конвейера до этого.
- меньше накладных расходов процессора: потенциально требуется меньше вызовов draw, особенно если вам больше не нужно делать LOD на ЦП.
вероятно, есть и другие факторы, которые я пропустил...
точка тесселяции заключается в том, что вы используете больше вершин, где это полезно (близко к камере) и меньше вершин, где это менее полезно (вдали от камеры). Таким образом, вы можете получить эффект гораздо более подробной геометрии, не используя ее повсюду в сцене.
всегда есть компромисс между процессором и памятью. Тесселяция-это способ экономии памяти и пропускной способности, но за счет производительности GPU.
почему вы должны использовать тесселяции: Тесселяции с картами смещения существенно уменьшает пропускную способность памяти для анимированные или несколькими экземплярами объектов в сцене. Но это не очень полезно для статических одиночных объектов.
допустим, у вас есть спрайт, который бежит по экрану. Если sprite-это высокая детализация (1 миллион плюс вершины), затем каждый раз, когда анимация перемещает/деформирует сетку, все 1 миллион вершин преобразуются и перезагружаются в GPU каждый кадр.
однако, если вы используете модель с низкой детализацией (50-100k вершин) с тесселяцией и смещением. Затем вы сохраняете карту смещения на gpu один раз. вы обновляете сетку 50k для анимации и перезагружаете значительно меньше сетки каждый кадр, затем GPU тесселлирует до 4-5 миллионов виртов, используя карта смещения, которая уже загружена.
конечный результат заключается в том, что вы получаете 2-4x деталь сетки с 1/20th пропускной способностью памяти. Теперь представьте, что у вас есть 20-30 этих спрайтов на экране одновременно.
почему вы не должны использовать тесселяции: чтобы добавить эту деталь на лету, gpu должен сжечь вычислительную мощность, чтобы вычислить 3d-положение каждой мозаичной вершины, прежде чем она начнет запускать все другие шейдеры.
главные различие, которое вам нужно остерегаться, заключается в том, что это помогает вам только при создании экземпляра и/или анимации геометрии.
Если у вас есть статическая сетка с высокой детализацией, которая никогда не перемещается и имеет только один экземпляр на экране, то быстрее загрузить геометрию в полном объеме. Тесселяция просто добавит сложности и съест циклы в конвейере.
есть компромисс: Существует небольшая пропускная способность памяти, которую вы получаете, используя тесселяцию для статические сетки. Потому что вершинам нужны 3 координаты плавающей точки, которые будут поняты gpu. Но выборка карты смещения использует 1 координату данных фиксированной точки, чтобы быть полезной. Потому что карта смещений нормализуется относительно соседних вершин. Таким образом, он вычисляет дополнительные данные на лету. Но этот расчет выполняется каждый кадр для каждого мозаичные вершины. Это съедает время шейдера, которое не понадобится, если вы используете статическую сетку.
однако, если вы включите тесселяция вниз или выключена для целей LOD это экономит время шейдера для объектов, которые не нуждаются в деталях, по сравнению с высокой детализацией статической сетки.
таким образом, тесселяция всегда является хорошей идеей для улучшения деталей на динамических/инстансовых сетках.
но для статических сеток или одноэлементных сеток это компромисс между возможностями LOD и сложностью трубопровода. Сетка с высокой детализацией на расстоянии сжигает больше времени вычисления, чем мозаичная сетка с выключенной тесселяцией. Но высокая детализация сетки на переднем плане занимает меньше времени вычисления, чем мозаичная сетка с тесселяцией.
одна большая вещь, которую следует учитывать, однако, заключается в том, что медленно поворачивая тесселяцию по мере приближения объекта, выглядит лучше, чем мгновенно заменяя сетку с низкой детализацией сеткой с высокой детализацией. Поэтому, когда гладкий Лод является большой проблемой, тогда определенно идите с тесселяцией. ...или используйте тесселяцию до определенной точки, а затем замените ее сеткой с высокой детализацией. Но это только хорошая идея, если вы не беспокоитесь о нехватке памяти и постоянно держите обе версии на gpu. В противном случае вы снова будете сжигать пропускную способность, меняя их местами.
опять же, всегда есть компромисс между использованием памяти и процессора.
(в контексте OpenGL) Как уже говорили другие, использование тесселяции можно рассматривать как торговлю между увеличением времени вычисления gpu и уменьшением пропускной способности между приложением и OpenGL.
какой смысл, когда вы думаете об этом? Если вы не отправляете все вершины, должен быть какой-то метод, доступный для получения их позиций.
большинство современных приложений определяют модель (набор вершин и т. д.) как-то, а затем отправить его в ГПУ. Один раз, тем самым отрицая большинство случаев использования, в которых вы хотели бы предпочесть тесселяцию для повышения "производительности" (производительность выше частоты кадров/ меньшее время выполнения, я предполагаю), пока у вас есть достаточно доступной памяти, оставшейся на GPU, сделайте это.
в случае анимации вам не нужно отправлять вверх измененные вершины модели, заменяющие информацию, уже находящуюся в gpu-памяти. Большинство современных приложений используют коллекция костей и весов, которые могут даже существовать на gpu. Вы отправляете равномерную переменную,такую как время, и это все, что требуется от приложения. Остальное делается на GPU.
даже статически предопределенный набор сеток LOD может быть загружен на GPU, прежде чем вы войдете в основной цикл отображения / рендеринга. Компромисс заключается в том, что вы не сможете контролировать степень детализации даже почти настолько близко, как вы могли бы с тесселяция.
Итак, если мы можем изменить данные на gpu, не отправляя больше данных из приложения, чем если бы мы использовали тесселяцию, почему или когда мы когда-либо хотели бы использовать тесселяцию?
- как уже говорили другие, абсолютный контроль над Лодом - одна из веских причин.
- динамическое создание контента. Это намного эффективнее (быстрее в кадрах/времени выполнения), чтобы позволить gpu добавлять вершины на месте, чем отправлять всю новую сетку вы сгенерировали на CPU или даже новые "биты" сетки из приложения.
- когда вы уже заполнили каждую йоту памяти на GPU, и вы просто не можете сохранить что-либо в буферах.
простой вывод в заключении. Как тесселяция может повысить производительность?
когда невозможно определить и загрузить данные вершин из приложения на gpu до начала рендеринга. Это единственное время, когда тесселяция является правильным решение. Чаще всего это неправда.