По мере того, как я все больше и больше играюсь с OpenGL ES 2.0 и GLSL, я задаюсь вопросом, как именно шейдерные программы выполняются на оборудовании. Я прекрасно понимаю концепции программ вершинных и фрагментных шейдеров, но как они работают с металлом, все еще очень неясно. Слишком часто, читая о графических процессорах, я сталкивался с термином «конвейер» и с тем, что у графического процессора есть определенное количество конвейеров.
Я понимаю, что делает конвейер, он получает набор вершин (представляющих геометрический примитив), выполняет вершинный шейдер с заданными параметрами и отправляет выходные данные вершинного шейдера через некоторое аппаратное обеспечение с фиксированными функциями, которое выполняет операции на основе этих выходных данных. Вершинный шейдер также выводит значения, которые интерполируются по каждому фрагменту примитива и вводятся во фрагментный шейдер, что упрощает выполнение множества сложных рендерингов с использованием общего алгоритма.
Но означает ли это, что если GPU имеет n конвейеров, то в любой момент каждый из n конвейеров может выполнять экземпляр шейдерной программы одного геометрического примитива?
Я читал руководство по программированию OpenGL ES 2.0 (около 60%, согласно Kindle), но, возможно, мое все еще развивающееся понимание заставило меня пропустить ответ на этот самый вопрос.
Одна практическая причина, по которой я задаю этот вопрос, касается того, какую работу следует или не следует выполнять на ЦП, а не на ГП. Например, если я работаю с одним потоком обновления и рендеринга, разумно ли выполнять умножение матрицы на вектор на ЦП, где это нужно будет делать в строке всех объектов? Или было бы лучше отдать на аутсорсинг GPU, где шейдерные программы, выполняющие отрисовку нескольких геометрических примитивов, могли бы выполняться одновременно на разных конвейерах?
Я работаю над оптимизацией некоторого кода, чтобы рисовать много квадроциклов на экране с помощью VBO вместо отдельных вызовов рисования для каждого. Но поскольку это считается рендерингом массива, мне нужно будет отправить все матрицы в GPU для каждой вершины, даже несмотря на то, что матрица mvp одинакова для каждых 4 вершин квада, что можно считать ударом по пропускной способности. Но если шейдерные программы выполняются одновременно, а не одна за другой в моем потоке рендеринга на ЦП, возможно, это достойный компромисс. Но у меня нет такого уровня знаний, чтобы говорить так или иначе.