Что может делать функция вершины, кроме сопоставления с пространством обрезки? - PullRequest
3 голосов
/ 02 мая 2019

Язык Metal Shading включает в себя множество математических функций, но кажется, что большинство кодов внутри Официальная документация по металлу , просто используйте его для отображения вершин из пиксельного пространства в пространство отсечения, например

RasterizerData out;

out.clipSpacePosition = vector_float4(0.0, 0.0, 0.0, 1.0);

float2 pixelSpacePosition = vertices[vertexID].position.xy;

vector_float2 viewportSize = vector_float2(*viewportSizePointer);

out.clipSpacePosition.xy = pixelSpacePosition / (viewportSize / 2.0);

out.color = vertices[vertexID].color;

return out;

За исключением того, что GPGPU использует функции ядра для параллельных вычислений, что может делать функция вершины с некоторыми примерами? Если в игре все позиции вершин вычисляются ЦП, почему ГП все еще имеет значение? Что обычно делает функция вершины?

Ответы [ 2 ]

1 голос
/ 03 мая 2019

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

Как правило, вы не изменяете вершины в CPU. В игре вы обычно загружаете их из файла в основную память, помещаете в буфер и отправляете их в графический процессор. Как только они появятся в графическом процессоре, вы передаете их вершинному шейдеру в каждом кадре вместе с матрицами модели, вида и проекции. Один буфер, содержащий, скажем, вершины дерева или колеса автомобиля, может использоваться несколько раз. Каждый раз, когда процессор отправляет только матрицы модели, вида и проекции. Матрица модели используется в вершинном шейдере для изменения положения и масштабирования вершин в мировом пространстве. Затем матрица вида перемещается и вращается вокруг мира так, чтобы виртуальная камера находилась в исходной точке и смотрела соответствующим образом. Затем матрица проекции изменяет вершины, чтобы поместить их в пространство клипа.

Есть и другие вещи, которые может делать вершинный шейдер. Например, вы можете передать вершины, которые находятся в сетке в плоскости x-y. Затем в своем вершинном шейдере вы можете сэмплировать текстуру и использовать ее для генерации z-значения. Это дает вам возможность изменить геометрию, используя карту высот.

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

1 голос
/ 02 мая 2019

Во-первых, я рассмотрю это утверждение

В игре, если все позиции вершин вычисляются ЦП, почему ГП все еще имеет значение?Что обычно делает функция вершин?

Я не думаю, что видел кого-то, кто вычислял позиции для мешей, которые позже будут использоваться для их рендеринга на GPU.Это медленно, вам нужно будет передать все эти данные из процессора в графический процессор (что означает копирование их через шину, если у вас есть выделенный графический процессор).И это просто не так гибко.Существуют и другие вещи, кроме позиций вершин, которые необходимы для создания какого-либо значимого изображения, и вычисление всего этого на CPU просто расточительно, поскольку CPU по большей части не заботится об этих данных.

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

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

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

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

Но , и это БОЛЬШОЙ, НО , вы можете сделать большую частьвсе это в вычислительном шейдере без использования графического процессора для запуска всего конвейера сборки вершин.Это означает, что вы можете делать полноэкранные эффекты, используя только вычислительный шейдер (вместо вершинного и фрагментного шейдера и многих промежуточных этапов конвейера, таких как растеризатор, примитивный отбор, тестирование глубины и объединение вывода).Вы можете вычислять ограничивающие рамки и делать легкие отбраковки или отбраковку усеченного конуса в вычислительном шейдере.

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

...