2013-04-18 2 views
0

Поскольку я играю с OpenGL ES 2.0 и GLSL все больше и больше, я спрашиваю, как выполняются шейдерные программы на аппаратном обеспечении. Я понимаю, что концепции вершинных и флеш-шейдерных программ просто прекрасны, но что касается их работы над металлом, все еще очень неясно. Слишком часто при чтении о GPU я встречал термин конвейер и что у графического процессора имеется определенное количество конвейеров.Как выполняются программы шейдеров GLSL на конвейере графического оборудования?

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

Но означает ли это, что если в графическом процессоре имеется n конвейеров, то в каждый данный момент каждый из n конвейеров может выполнять экземпляр шейдерной программы одного геометрического примитива?

Я читал руководство по программированию OpenGL ES 2.0 (около 60% через него в соответствии с разжиганием), но, возможно, мое развивающееся понимание заставило меня пропустить ответ на этот самый вопрос.

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

Я работаю над оптимизацией кода для рисования многих квадратов на экране с использованием VBO вместо отдельных вызовов рисования для каждого. Но так как это считается рендерингом массива, мне нужно будет отправить все матрицы на GPU для каждой вершины, даже если матрица mvp одинакова для каждых 4 вершин квадрата, что можно считать ударом по полосе пропускания. Но если программы шейдеров выполняются одновременно, а не один за другим в моем потоке рендеринга на ЦП, возможно, это достойный компромисс. Но у меня нет такого уровня знаний, чтобы сказать так или иначе.

ответ

0

Я попытаюсь ответить на мой собственный вопрос здесь, поскольку я нашел документ оптимизации производительности для конкретного графического процессора, с которым я работаю, архитектуры PowerVR SGX. В документе показаны несколько многопоточных исполнительных блоков внутри движка шейдеров, поэтому я предполагаю, что это означает термин «конвейеры». Возможно, этот термин использовался в днях конвейера с фиксированной функцией. Любой может, пожалуйста, не стесняйтесь меня исправить.

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