Лучше умножить матрицы в JavaScript или шейдере?

Я смотрел на несколько примеров WebGL. Рассмотреть возможностьУчебник MDN, Их вершинный шейдер умножает вершину на матрицу перспективы и матрицу мировой позиции:

gl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0);

НоuMVMatrix сам является продуктом нескольких преобразований (перевод, вращение и т. д.), рассчитанных в javascript с помощью некоторых матричных библиотек.

Похоже, было бы быстрее рассчитать их продукты непосредственно в шейдере; конечно, это быстрее, чем делать это в .js. Есть ли какая-то причина, почему они выбирают этот подход?

Теперь, я думаю, вы можете таким образом сложить произвольное количество преобразований в произвольном порядке, что является более гибким. Но скажите, что гибкость не нужна, есть ли причина избегать преобразований непосредственно в шейдерах? Что-то вроде

gl_Position = uPMatrix * uRotationMatrix * uScaleMatrix * uTranslationMatrix * vec4(aVertexPosition, 1.0);

е: Чтобы добавить некоторый контекст, в моем конкретном случае я буду рендерить только двухмерные прямоугольные объекты (в основном спрайты), поэтому количество вершин всегда будет равно 4.

Учитывая накладные расходы на создание библиотеки для быстрого умножения матриц .js, похоже, что отправка этих вычислений в шейдер, безусловно, является подходящим вариантом для моего личного случая.

(Плюс, даже если бы баланс был медленнее, чем в javascript, шунтирование вычислений в GPU, вероятно, чего-то само по себе стоит!)

Ответы на вопрос(2)

Ваш ответ на вопрос