Примитивная сборка производительности
В настоящее время я экспериментирую с рендерингом карты местности / высоты. Каждая плитка этой местности отображается с VBO и IBO. Для того, чтобы легко рисовать субтили, я упорядочил индексы, используя код Мортона, и в этот момент у меня возникли вопросы о примитивной сборке.
Примитивная сборка происходит после обработки вершины, но
- Как GPU узнает, какие вершины нужно обработать? Возможно, некоторые из них не проиндексированы. Они все еще обрабатываются?
- Как GPU узнает, в каком порядке нужно обрабатывать вершины? Может быть, треугольник использует первую и последнюю вершины VBO, поэтому примитивная стадия сборки должна была бы ждать, пока не будет обработана вся VBO?
1 ответ
Как GPU узнает, какие вершины нужно обработать? Возможно, некоторые из них не проиндексированы. Они все еще обрабатываются?
Ваш индексный буфер и диапазон вершин в вашем вызове отрисовки определяют, какие вершины обрабатываются, а также определяют порядок использования во время примитивной сборки. Любая вершина, не охваченная этим диапазоном вершин / индексов, не нуждается в обработке.
Как GPU узнает, в каком порядке нужно обрабатывать вершины? Может быть, треугольник использует первую и последнюю вершины VBO, поэтому примитивная стадия сборки должна была бы ждать, пока не будет обработана вся VBO?
Вершины порядка, в которых были обработаны, не особенно важны к тому времени, когда вы достигнете примитивной сборки; на уровне вершинных шейдеров нет зависимости порядка (все вершины могли бы обрабатываться параллельно для всего, что вы знаете). Все, что вам нужно знать, - это то, что результаты вершинного шейдера добавляются в специальный буфер, называемый кешем после преобразования.
Geometry Shader (программируемая примитивная сборка) извлекает свои входные вершины из кеша после преобразования и делает это в определенном порядке. Учитывая традиционную реализацию FIFO кеша после преобразования, порядок диктует замену кеша, а примитивы на основе полосы стремятся максимизировать частоту обращений к кешу во время примитивной сборки. Отсутствие кеша в кеше после преобразования может привести к задержке, но только для вершин, которых не было в кеше - он не остановится, пока каждая вершина в вашем буфере вершин обрабатывается излишне.
Хорошая новость заключается в том, что большинство программ моделирования в наши дни выводит вершины в порядке, эффективном для кеширования, а кеш больше и умнее, чем когда-либо, поэтому вам не о чем часто беспокоиться. 15 лет назад кеширование вершин было очень горячей темой, и у каждого, с кем вы говорили, была своя собственная теория относительно того, что сработало лучше всего, теперь это в значительной степени пустая трата времени, и порядок размещения на полосах, вероятно, настолько далеко, насколько вы этого хотите.