Когда лучше загружать матрицы частичных моделей в вершинный шейдер?

8

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

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

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

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

Нерон
источник

Ответы:

9

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

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

Джон Калсбек
источник
Я зависит от количества вычислений. GPU действительно быстро разбирается в математических операциях. Так что это вопрос попытки и сравнительного анализа.
Майкл IV
5

Редко, если когда-либо. Вы наполовину ответили на это в своем собственном вопросе: вершинный шейдер запускается один раз на каждую вершину, фрагментный шейдер - один раз на фрагмент. Если вы не делаете что-то уникальное для этой вершины или фрагмента, то вы делаете буквально одну и ту же вещь каждый раз, когда вызываете шейдер. Это не звучит более эффективно для меня.

Mokosha
источник