Примитивная сборка производительности

В настоящее время я экспериментирую с рендерингом карты местности / высоты. Каждая плитка этой местности отображается с VBO и IBO. Для того, чтобы легко рисовать субтили, я упорядочил индексы, используя код Мортона, и в этот момент у меня возникли вопросы о примитивной сборке.

Примитивная сборка происходит после обработки вершины, но

  1. Как GPU узнает, какие вершины нужно обработать? Возможно, некоторые из них не проиндексированы. Они все еще обрабатываются?
  2. Как GPU узнает, в каком порядке нужно обрабатывать вершины? Может быть, треугольник использует первую и последнюю вершины VBO, поэтому примитивная стадия сборки должна была бы ждать, пока не будет обработана вся VBO?

1 ответ

Решение

Как GPU узнает, какие вершины нужно обработать? Возможно, некоторые из них не проиндексированы. Они все еще обрабатываются?

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

Как GPU узнает, в каком порядке нужно обрабатывать вершины? Может быть, треугольник использует первую и последнюю вершины VBO, поэтому примитивная стадия сборки должна была бы ждать, пока не будет обработана вся VBO?

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

Geometry Shader (программируемая примитивная сборка) извлекает свои входные вершины из кеша после преобразования и делает это в определенном порядке. Учитывая традиционную реализацию FIFO кеша после преобразования, порядок диктует замену кеша, а примитивы на основе полосы стремятся максимизировать частоту обращений к кешу во время примитивной сборки. Отсутствие кеша в кеше после преобразования может привести к задержке, но только для вершин, которых не было в кеше - он не остановится, пока каждая вершина в вашем буфере вершин обрабатывается излишне.

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

Другие вопросы по тегам