Поэтому я учу себя GLSL и пытаюсь понять, почему он должен быть быстрее конвейера с фиксированными функциями.
Причина, по которой у меня возникла проблема, заключается в том, что, насколько я понимаю, созданные вами шейдеры заменяют разделы конвейера, которые были там ранее. Итак, как просто обеспечить вашу собственную версию ускорением?
Единственное, о чем я могу подумать, это то, что если бы вы попытались указать, например, свое собственное уравнение освещения, вам пришлось бы выполнять вычисления на процессоре, но теперь вы можете выполнять вычисления на графическом процессоре, что будет быстрее.
Я правильно понимаю?
Ответы:
Шейдеры, которые вы создаете, не будут вашей собственной версией конвейера с фиксированными функциями (FFP), а будут настраиваемыми операциями с вершинами и пикселями для достижения чего-то крутого и сложного.
Многие вещи, которые вы делаете через программируемый конвейер (PP), будут работать быстрее, чем их возможные реализации FFP, потому что PP уменьшает количество проходов или количество магии объединителя и кубической карты, необходимой для визуализации этих гипотетических вещей в FFP.
Представьте себе такую распространенную вещь, как освещение на пиксель в FFP, когда в ваших руках только интерполированные данные вершин и образец текстуры. Это даже невозможно сделать «честно», только хаки для особых случаев, в зависимости от точных предварительно вычисленных кубических карт и некоторых серьезных смешиваний. С PP это становится вопросом окраски точечного произведения между направлением света и нормалью вершины.
В общем, ПП превращается медленно и невозможно в быстрое и возможное. Но если вы решите написать шейдер для реализации тех же алгоритмов, которые используются в FFP, вы обнаружите, что FFP будет немного быстрее, потому что он очень оптимизирован для аппаратного обеспечения.
источник
В теоретическом плане программируемый конвейер работает медленнее, чем конвейер с фиксированной функцией. Ни один процессор общего назначения не может конкурировать с процессором специального случая. Исходный конвейер с фиксированными функциями представлял собой нечто большее, чем просто набор логических элементов в строке, который является настолько быстрым, насколько это теоретически возможно.
Однако в наши дни программируемый конвейер является нормой. Таким образом, аппаратное обеспечение вместо этого ориентировано на программируемый конвейер. Потеряв начальную эффективность наличия схемы, специально созданной для одного определенного потока данных, он должен учитывать наиболее распространенный случай - подход на основе шейдеров. Однако для вариантов обратной совместимости конвейер с фиксированными функциями все еще доступен, но стоимость заключается в том, что старые фиксированные функции должны быть преобразованы в шейдеры, что может повлечь за собой определенные затраты. Это объясняет разницу в производительности.
источник
Основная причина, по которой я могу придумать, - это фаза в фиксированном конвейере: ваша программа не нуждается в этом. Например, для игры, в которой все источники света являются статичными, вы можете легко реализовать шейдер, который даже не пытается вычислить динамический свет. в этом случае ваш шейдер работает быстрее, чем предварительно скомпилированный шейдер, который проверяет некоторые уравнения для динамического освещения (шейдер общего назначения). Есть и другие примеры, вы можете легко подумать о многих аспектах, которые следует учитывать для фиксированного конвейера, но вы можете игнорировать реализацию в ваших собственных кодах GLSL.
источник
Точно, ваши шейдеры заменяют части конвейера. Но часто ваши шейдеры специализируются на конкретном эффекте, которого вы хотите достичь, и не обрабатывают все возможные специальные функции, которые могут быть активированы, поэтому они проще, чем шейдер, который эмулирует весь конвейер с фиксированными функциями. Принимая во внимание, что путь с фиксированными функциями должен учитывать многие вещи и функции OpenGL, которые вы, возможно, просто не захотите использовать (или даже не слышали).
И дни, когда вы выполняли фиксированную функцию на специальном аппаратном обеспечении (в отличие от полностью программируемого аппаратного обеспечения), прошли, что, вероятно, происходит, когда вы используете конвейер с фиксированной функцией, когда ваш драйвер просто загружает свои собственные специальные шейдеры, которые реализуют пути с фиксированными функциями. Но они могут быть очень сложными, чтобы обеспечить каждую функцию, которую предлагает конвейер с фиксированными функциями.
источник