Почему программируемый конвейер (GLSL) быстрее фиксированного конвейера?

27

Поэтому я учу себя GLSL и пытаюсь понять, почему он должен быть быстрее конвейера с фиксированными функциями.

Причина, по которой у меня возникла проблема, заключается в том, что, насколько я понимаю, созданные вами шейдеры заменяют разделы конвейера, которые были там ранее. Итак, как просто обеспечить вашу собственную версию ускорением?

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

Я правильно понимаю?

Джои Грин
источник
Вы спрашиваете, быстрее ли создавать свои собственные версии существующих функций или быстрее выгрузить функции, которые вы рассчитывали на ЦП?
MichaelHouse
Я нашел пост на gamedev.net, который отвечает на мои вопросы.
Джои Грин
2
Понимаю. Вы должны опубликовать ответ об этом здесь, чтобы другие могли извлечь выгоду. Возможно, прояснение вашего вопроса в процессе.
MichaelHouse
@ joey-green не могли бы вы связать gamedev.net здесь. Я был бы полезен для людей, которые наткнутся на этот вопрос.
Quazi Irfan
1
Чтобы запутать больше, в моих тестах фиксированный конвейер может быть быстрее шейдеров, по крайней мере, в простых случаях; см. sol.gfxile.net/instancing.html
Яри ​​Комппа

Ответы:

27

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

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

Представьте себе такую ​​распространенную вещь, как освещение на пиксель в FFP, когда в ваших руках только интерполированные данные вершин и образец текстуры. Это даже невозможно сделать «честно», только хаки для особых случаев, в зависимости от точных предварительно вычисленных кубических карт и некоторых серьезных смешиваний. С PP это становится вопросом окраски точечного произведения между направлением света и нормалью вершины.

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

EnoughTea
источник
1
Хороший ответ ... +1.
Амир Заде
@ Зеленый Не уверен в этом. Как-то не попадает в точку. Ответ Килотана гораздо более уместен для реального вопроса.
Крис говорит восстановить Монику
14

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

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

Kylotan
источник
1

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

Ali1S232
источник
1

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

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

Крис говорит восстановить Монику
источник
«что, вероятно, случается, когда вы используете конвейер с фиксированными функциями, это то, что ваш драйвер просто загружает свои собственные специальные шейдеры, которые реализуют пути с фиксированными функциями». ..ты уверен в этом? Можете ли вы предоставить любой надежный ресурс? Спасибо.
Quazi Irfan
@iamcreasy У меня нет надежного источника (поэтому, вероятно,), я должен признать. Но я сильно сомневаюсь, что в настоящее время видеокарты (которые представляют собой всего лишь множество небольших процессоров) все еще имеют специальное оборудование для вычислений освещения или туманных вычислений. Вместо этого более вероятно, что они просто загружают предварительно скомпилированные программы для этого на определенные этапы шейдера (будь то драйверы или хранилище ПЗУ, я не знаю).
Крис говорит восстановить Монику
@iamcreasy в соответствии с nouveau wiki nouveau.freedesktop.org/wiki/CodeNames , исправленный конвейер был удален в GeForce 6xxx.
DirtY ICE
«что, вероятно, происходит, когда вы используете конвейер с фиксированными функциями, это то, что ваш драйвер просто загружает свои собственные специальные шейдеры, которые реализуют пути с фиксированными функциями». Правда. «Но они могут быть очень сложными, чтобы обеспечить каждую функцию, которую предлагает конвейер с фиксированными функциями». Хороший драйвер будет генерировать шейдеры только для тех функций, которые вы включили.
Крис