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