Полезно помнить, что Graphics Pipeline - это фактический конвейер, обычно реализованный в аппаратном обеспечении. Вы можете сконфигурировать конвейер, назначив шейдеры и установив форму, а затем вы активируете конвейер (путем вызова drawElements
или одного из его друзей). Это по существу загружает груду входных данных в начало конвейера и запускает процесс, который является очень параллельным. Например, в середине прогона некоторые ранние вершины будут проходить через вершинный шейдер и растеризатор, а результирующие фрагменты будут затенены, тогда как другие вершины все еще вернутся к стадии шейдера вершин. Различные разделы трубопровода все делают свое дело с данными, проходящими мимо.
После того, как вы начнете этот процесс, ЦП может свободно выполнять другие операции во время работы конвейера. Но если вы хотите перенастроить конвейер, например, изменив шейдеры или изменяя униформу, CPU заблокирует ваш поток и дождитесь завершения полного конвейера до последнего пикселя.
Это означает, что вы не должны останавливать и перезапускать трубопровод, насколько это возможно. Таким образом, обычная стратегия заключается в пакетном режиме: получите как можно больше работы за один призыв на призыв с одним набором униформ. Таким образом, вы используете параллельный характер трубопровода в максимально возможной степени в своем приложении.
Скорее всего второй вариант. Изменение шейдеров (в большинстве случаев) - очень дорогостоящая операция. – BDL