Usando row-major en el sombreador de OpenGL

Vi esto en elSitio de OpenGL:

Las variables de atributo OpenGL Shading Language pueden ser del tipo mat2, mat3 o mat4. Los atributos de estos tipos se pueden cargar utilizando los puntos de entrada glVertexAttrib. Las matrices se deben cargar en ranuras de atributos genéricos sucesivos en el orden mayor de la columna, con una columna de la matriz en cada ranura de atributos genéricos.

He estado usando sucesivamente una biblioteca de vectores que se basa en la fila principal. Es decir, los 16 elementos de la matriz 4x4 se presentan así en una estructura:

vec4 x;
vec4 y;
vec4 z;
vec4 w;

Donde cadavec4 tiene componentesx, y, z, w, Por lo tanto, laorden lineal el contenido es mayor en la fila ya que la primera fila ocupa las primeras 4 posiciones en la memoria, y la matriz matemática se maneja como tal, por ejemplo, esta transformada de rotación:

 static Matrix4<T> RotateZ(T degrees)
{
    T radians = degrees * 3.14159f / 180.0f;
    T s = std::sin(radians);
    T c = std::cos(radians);

    Matrix4 m;
    m.x.x =  c; m.x.y = s; m.x.z = 0; m.x.w = 0;
    m.y.x = -s; m.y.y = c; m.y.z = 0; m.y.w = 0;
    m.z.x =  0; m.z.y = 0; m.z.z = 1; m.z.w = 0;
    m.w.x =  0; m.w.y = 0; m.w.z = 0; m.w.w = 1;
    return m;
}

La biblioteca es importante para las filas y admite cálculos de izquierda a derecha al escribir el código del lado del cliente, lo que es natural para muchos programadores. Pero lo que no entiendo es que estas matrices de fila principal se envían como está a los sombreadores, que de acuerdo con lo anterior, esperan columna principal.

Entiendo que el shader realiza cálculos de derecha a izquierda. Pero, ¿no debería transponerse una matriz de fila mayor para que sea columna principal antes de ser alimentada en un sombreado? No he estado haciendo esto, pero está funcionando bien.

Respuestas a la pregunta(1)

Su respuesta a la pregunta