Графический конвейер OpenGL меняется каждый год. Так что количество программируемых конвейеров растет. В конце, как программист opengl, мы создаем множество маленьких программ (Vertex, Fragment, Geometry, Tessellation, ..)

Почему между этапами такая высокая специализация? Все ли они работают на разных частях оборудования? Почему бы просто не написать один блок кода, чтобы описать, что должно получиться в конце, вместо того, чтобы жонглировать этапами?

http://www.g-truc.net/doc/OpenGL%204.3%20Pipeline%20Map.pdf

В этом PDF-файле Pipeline мы видим зверя.

8
user1767754 12 Май 2014 в 11:55

5 ответов

Лучший ответ

Во времена Quake (игры) разработчики могли делать что угодно со своими реализациями рендеринга ЦП, они контролировали все в «конвейере».

С введением фиксированного конвейера и графических процессоров вы получаете «лучшую» производительность, но теряете большую часть свободы. Разработчики графики стремятся вернуть эту свободу. Следовательно, с каждым днем ​​все больше и больше конвейера настройки. Графические процессоры теперь даже «полностью» программируются с использованием таких технологий, как CUDA / OpenCL, даже если речь идет не только о графике.

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

  • Возможности и стоимость GPU; Графические процессоры развиваются с каждой итерацией, бессмысленно отбрасывать всю имеющуюся у вас архитектуру и заменять ее в одночасье, вместо этого вы добавляете новые функции и улучшения на каждой итерации, особенно когда разработчики просят об этом (например, этап тесселяции). Подумайте о процессорах: Intel пыталась заменить архитектуру x86 на Itanium, потеряв обратную совместимость, потерпев неудачу, они в конечном итоге скопировали то, что AMD сделала с архитектурой AMDx64.
  • Они также не могут полностью заменить его из-за поддержки устаревших приложений, которые используются более широко, чем можно было бы ожидать.
7
Marco A. 10 Ноя 2017 в 10:43

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

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

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

5
BenMorel 29 Июн 2014 в 16:49

Потому что у каждого этапа своя цель

Vertex - это преобразование точек туда, где они должны быть на экране.

Фрагмент предназначен для каждого фрагмента (читай: пиксель треугольников) и применяется освещение и цвет.

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

Если вы внимательно посмотрите этот PDF-файл, вы увидите разные входные и выходные данные для каждого шейдера /

3
ratchet freak 12 Май 2014 в 08:12

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

Дополнительная информация о функции: http://www.opengl.org/wiki/GLSL_Object#Program_separation

1
Colonel Thirty Two 12 Май 2014 в 17:18

В основном потому, что никто не хочет заново изобретать колесо, если в этом нет необходимости.

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

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

1
Andon M. Coleman 12 Май 2014 в 22:30