¿Es mejor multiplicar matrices en javascript o en un shader?

He estado mirando varios ejemplos de webgl. ConsiderarTutorial de MDN. Su sombreador de vértices multiplica el vértice por una matriz de perspectiva y una matriz de posición mundial:

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

Pero eluMVMatrix es en sí mismo el producto de varias transformaciones (traducción, rotación, etc.) calculadas en javascript con la ayuda de algunas bibliotecas de matriz.

Parece que sería más rápido calcular sus productos directamente en el sombreado; Seguramente eso es más rápido que hacerlo en .js. ¿Hay alguna razón por la que eligen este enfoque?

Ahora, supongo que puede apilar un número arbitrario de transformaciones en un orden arbitrario de esta manera, lo cual es más flexible. Pero digamos que la flexibilidad no es necesaria, ¿hay alguna razón para evitar hacer transformaciones directamente en los shaders? Algo como

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

mi: Para agregar algo de contexto, en mi caso particular solo estaré renderizando entidades rectangulares 2D (principalmente sprites), por lo que el número de vértices siempre será 4.

Dada la sobrecarga de traer una biblioteca para hacer una rápida multiplicación de la matriz .js, parece que insertar estos cálculos en el sombreador es definitivamente el camino a seguir para mi caso personal.

(Además, incluso si fuera más lento en la balanza que hacerlo en javascript, ¡los cálculos en la GPU probablemente valgan la pena en sí mismos!)

Respuestas a la pregunta(2)

Su respuesta a la pregunta