Почему геометрический шейдер обрабатывается после вершинного шейдера?
И в конвейерах рендеринга OpenGL, и в Direct3D геометрический шейдер обрабатывается после вершинного шейдера и перед фрагментным / пиксельным шейдером. Теперь очевидно, что обработка геометрического шейдера после фрагментного / пиксельного шейдера не имеет смысла, но что мне интересно, почему бы не поставить его перед вершинным шейдером?
По крайней мере, с программной / высокоуровневой точки зрения кажется, что это имеет больше смысла: сначала вы запускаете геометрический шейдер, чтобы создать все нужные вам вершины (и выгружаете любые данные, относящиеся только к геометрическому шейдеру), затем вы запускаете вершинный шейдер на всех созданных вершинах. Существует очевидный недостаток, заключающийся в том, что теперь вершинный шейдер должен выполняться на каждой из вновь созданных вершин, но любая логика, которая должна быть там сделана, в текущих конвейерах должна выполняться для каждой вершины в геометрическом шейдере. предположительно; так что там не так много хита производительности.
Я предполагаю, что поскольку геометрический шейдер находится в этом положении в обоих конвейерах, существует либо аппаратная, либо неочевидная причина конвейера, которая имеет больше смысла.
(Я знаю, что связывание полигонов должно происходить перед запуском геометрического шейдера (возможно, нет, если он принимает отдельные точки в качестве входных данных?), Но я также знаю, что нужно также запускать после геометрического шейдера, так что он все равно не будет смысл запускать вершинный шейдер между этими этапами?)
1 ответ
Это в основном потому, что "геометрический шейдер" был довольно глупым выбором слов со стороны Microsoft. Его следовало называть "примитивный шейдер".
Геометрические шейдеры делают этап примитивной сборки программируемым, и вы не можете собрать примитивы до того, как у вас будет вычислен входной поток вершин. Существует некоторое совпадение в функциональности, так как вы можете взять один тип входного примитива и выплюнуть совершенно другой тип (часто требующий вычисления дополнительных вершин).
Эти дополнительные излучаемые вершины не требуют обратного перемещения в конвейере до стадии вершинного шейдера - они полностью рассчитываются во время вызова геометрического шейдера. Эта концепция не должна быть чуждой, поскольку шейдеры управления и оценки тесселяции также очень похожи на вершинные шейдеры по форме и функциям.
Существует много этапов преобразования вершин, и то, что мы называем вершинными шейдерами, является лишь верхушкой айсберга. В современном приложении вы можете ожидать, что выходные данные вершинного шейдера пройдут несколько дополнительных этапов, прежде чем вы получите финализированную вершину для растеризации и затенения пикселей (которая также называется плохо).