Давайте представим большую сетку сетки, подобную той, которую мы могли бы использовать для ландшафта. Мы будем рендерить n
ценность треугольников, покрывая, скажем, половину нашего экрана 1080p, за один вызов отрисовки.
Если мы свариваем все наши вершины и не имеем сглаживающих / текстурирующих швов, то у каждого треугольника есть 3 вершины, и каждая вершина разделена на 6 треугольников, поэтому у нас есть n/2
вершины.
Чтобы сделать это нам нужно:
Запустите вершинный шейдер хотя бы n/2
раз
(«по крайней мере», потому что наш кэш для результатов вершин очень велик. Иногда мы заканчиваем тем, что высвободим уже преобразованную вершину, а затем снова понадобим ее для более позднего треугольника, который разделяет ее, и перезапустим на нем вершинный шейдер Таким образом, мы получаем не так много сбережений, как на бумаге)
Клип & отбраковать n
треугольники.
Растеризация и интерполяция по крайней мере 1920x1080 / 2 или около 1 миллиона пикселей буфера кадра (так как мы сказали, что наш ландшафт покрывает примерно половину экрана).
(«по крайней мере» из-за того, как графические процессоры работают с квадратами пикселей , некоторые фрагменты за пределами границ многоугольников по-прежнему растеризуются, но затем маскируются, что означает, что мы обрабатываем фрагменты дважды. Для неровной сетки мы также получим переопределение в любом месте сетки закрывает себя, если нам не повезло сначала нарисовать самый передний многоугольник в буфере глубины)
Запустите фрагментный шейдер для всех этих> = 1 миллиона фрагментов.
Смешайте ~ 1 миллион результатов в буферах кадров и глубины.
Хорошо, теперь давайте разворачиваем все наши вершины, так что теперь у нас есть 3n
вершины, которые нужно визуализировать, в шесть раз больше, чем раньше! Наши шаги ...
Запустите время вершинного шейдера 3n
.
(Нет звездочек из-за кэширования, поскольку каждая вершина используется только один раз, хотя это означает, что кэш не может спасти нас в любое время)
Клип & отбраковать n
треугольники.
Растеризация и интерполяция по крайней мере 1920x1080 / 2 или около 1 миллиона пикселей буфера кадра.
Запустите фрагментный шейдер для всех этих> = 1 миллиона фрагментов.
Смешайте ~ 1 миллион результатов в буферах кадров и глубины.
... подожди, каждый шаг, кроме первого, одинаков! Таким образом, большая часть работы, которую выполняет GPU при типичном вызове отрисовки, не связана напрямую с количеством используемых вершин. Объем покрытия экрана, перерисовка и общее количество треугольников составляют гораздо больше стоимости.
Это не значит, что вершины полностью свободны. Если вы разделяете вершины, когда можете, вы получаете небольшую экономию от кэширования, особенно если ваши вершинные шейдеры сложны, или вершинный конвейер вашего оборудования слаб (как это было в некоторых старых консолях). Но учитывая, что количество вершин отслеживается пропорционально числу треугольников плюс или минус постоянный коэффициент, обычно это не столь интересный показатель общей стоимости сетки.